switch_user 1.4.0 → 1.5.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +22 -0
- data/Gemfile +2 -0
- data/README.md +22 -20
- data/Rakefile +2 -0
- data/app/controllers/switch_user_controller.rb +25 -11
- data/app/helpers/switch_user_helper.rb +16 -19
- data/app/views/switch_user/_widget.html.erb +2 -2
- data/config/routes.rb +4 -2
- data/lib/generators/switch_user/install/install_generator.rb +3 -2
- data/lib/generators/switch_user/install/templates/switch_user.rb +8 -6
- data/lib/switch_user.rb +22 -21
- data/lib/switch_user/base_guard.rb +7 -5
- data/lib/switch_user/data_source.rb +8 -8
- data/lib/switch_user/lambda_guard.rb +2 -0
- data/lib/switch_user/provider.rb +16 -13
- data/lib/switch_user/provider/authlogic.rb +6 -6
- data/lib/switch_user/provider/base.rb +7 -8
- data/lib/switch_user/provider/clearance.rb +8 -6
- data/lib/switch_user/provider/devise.rb +5 -3
- data/lib/switch_user/provider/dummy.rb +8 -12
- data/lib/switch_user/provider/restful_authentication.rb +5 -3
- data/lib/switch_user/provider/session.rb +5 -3
- data/lib/switch_user/provider/sorcery.rb +8 -9
- data/lib/switch_user/rails.rb +7 -3
- data/lib/switch_user/rspec.rb +4 -4
- data/lib/switch_user/rspec/feature_helpers.rb +13 -14
- data/lib/switch_user/user_loader.rb +5 -2
- data/lib/switch_user/user_set.rb +14 -9
- data/lib/switch_user/version.rb +3 -1
- data/spec/controllers/switch_user_controller_spec.rb +24 -27
- data/spec/helpers/switch_user_helper_spec.rb +58 -55
- data/spec/integration/switch_user_spec.rb +105 -21
- data/spec/provider/authlogic_spec.rb +3 -1
- data/spec/provider/clearance_spec.rb +3 -1
- data/spec/provider/devise_spec.rb +19 -18
- data/spec/provider/dummy_spec.rb +4 -3
- data/spec/provider/restful_authentication_spec.rb +3 -1
- data/spec/provider/session_spec.rb +4 -2
- data/spec/provider/sorcery_spec.rb +3 -1
- data/spec/provider_spec.rb +3 -1
- data/spec/rspec/feature_helpers_spec.rb +38 -37
- data/spec/spec_helper.rb +4 -2
- data/spec/support/application.rb +35 -23
- data/spec/support/provider.rb +13 -11
- data/spec/switch_user/data_source_spec.rb +7 -5
- data/spec/switch_user/lambda_guard_spec.rb +6 -4
- data/spec/switch_user/user_loader_spec.rb +23 -23
- data/spec/switch_user/user_set_spec.rb +12 -10
- data/spec/switch_user_spec.rb +6 -4
- data/switch_user.gemspec +24 -23
- metadata +28 -28
@@ -1,16 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
class BaseGuard
|
3
|
-
# TODO is this the best arguments for the initializer ?
|
5
|
+
# TODO: is this the best arguments for the initializer ?
|
4
6
|
# TODO should @provider be set and current/original_user be added as # accessors ?
|
5
7
|
def initialize(controller, provider)
|
6
|
-
@controller
|
7
|
-
@request
|
8
|
-
@current_user
|
8
|
+
@controller = controller
|
9
|
+
@request = controller.request
|
10
|
+
@current_user = provider.current_user
|
9
11
|
@original_user = provider.original_user
|
10
12
|
end
|
11
13
|
|
12
14
|
def controller_available?
|
13
|
-
raise NotImplementedError
|
15
|
+
raise NotImplementedError, 'you must implement controller_available?'
|
14
16
|
end
|
15
17
|
|
16
18
|
def view_available?
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
class DataSources
|
3
5
|
attr_reader :sources
|
@@ -7,11 +9,11 @@ module SwitchUser
|
|
7
9
|
end
|
8
10
|
|
9
11
|
def all
|
10
|
-
sources.flat_map
|
12
|
+
sources.flat_map(&:all)
|
11
13
|
end
|
12
14
|
|
13
15
|
def find_scope_id(scope_id)
|
14
|
-
sources.map {|source| source.find_scope_id(scope_id) }.compact.first
|
16
|
+
sources.map { |source| source.find_scope_id(scope_id) }.compact.first
|
15
17
|
end
|
16
18
|
end
|
17
19
|
|
@@ -40,11 +42,10 @@ module SwitchUser
|
|
40
42
|
|
41
43
|
class GuestDataSource
|
42
44
|
def all
|
43
|
-
[
|
45
|
+
[GuestRecord.new]
|
44
46
|
end
|
45
47
|
|
46
|
-
def find_scope_id(scope_id)
|
47
|
-
end
|
48
|
+
def find_scope_id(scope_id); end
|
48
49
|
end
|
49
50
|
|
50
51
|
class Record
|
@@ -70,10 +71,9 @@ module SwitchUser
|
|
70
71
|
|
71
72
|
class GuestRecord
|
72
73
|
def label
|
73
|
-
|
74
|
+
'Guest'
|
74
75
|
end
|
75
76
|
|
76
|
-
def scope_id
|
77
|
-
end
|
77
|
+
def scope_id; end
|
78
78
|
end
|
79
79
|
end
|
data/lib/switch_user/provider.rb
CHANGED
@@ -1,20 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module Provider
|
3
|
-
autoload :Base,
|
4
|
-
autoload :Authlogic,
|
5
|
-
autoload :Clearance,
|
6
|
-
autoload :Devise,
|
7
|
-
autoload :RestfulAuthentication,
|
8
|
-
autoload :Sorcery,
|
9
|
-
autoload :Dummy,
|
10
|
-
autoload :Session,
|
5
|
+
autoload :Base, 'switch_user/provider/base'
|
6
|
+
autoload :Authlogic, 'switch_user/provider/authlogic'
|
7
|
+
autoload :Clearance, 'switch_user/provider/clearance'
|
8
|
+
autoload :Devise, 'switch_user/provider/devise'
|
9
|
+
autoload :RestfulAuthentication, 'switch_user/provider/restful_authentication'
|
10
|
+
autoload :Sorcery, 'switch_user/provider/sorcery'
|
11
|
+
autoload :Dummy, 'switch_user/provider/dummy'
|
12
|
+
autoload :Session, 'switch_user/provider/session'
|
11
13
|
|
12
14
|
def self.init(controller)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
klass_part =
|
16
|
+
if SwitchUser.provider.is_a?(Hash)
|
17
|
+
SwitchUser.provider[:name]
|
18
|
+
else
|
19
|
+
SwitchUser.provider
|
20
|
+
end
|
18
21
|
|
19
22
|
klass_part = klass_part.to_s.classify
|
20
23
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module Provider
|
3
5
|
class Authlogic < Base
|
@@ -5,19 +7,17 @@ module SwitchUser
|
|
5
7
|
@controller = controller
|
6
8
|
end
|
7
9
|
|
8
|
-
def login(user,
|
10
|
+
def login(user, _scope = nil)
|
9
11
|
UserSession.create(user)
|
10
12
|
end
|
11
13
|
|
12
|
-
def logout(
|
14
|
+
def logout(_scope = nil)
|
13
15
|
@controller.current_user_session.destroy
|
14
16
|
end
|
15
17
|
|
16
|
-
def current_user(
|
18
|
+
def current_user(_scope = nil)
|
17
19
|
result = UserSession.find
|
18
|
-
|
19
|
-
result.record
|
20
|
-
end
|
20
|
+
result&.record
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -1,11 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module Provider
|
3
5
|
class Base
|
4
6
|
def current_users_without_scope
|
5
|
-
SwitchUser.available_scopes.
|
7
|
+
SwitchUser.available_scopes.each_with_object([]) do |scope, users|
|
6
8
|
user = current_user(scope)
|
7
9
|
users << user if user
|
8
|
-
users
|
9
10
|
end
|
10
11
|
end
|
11
12
|
|
@@ -32,14 +33,13 @@ module SwitchUser
|
|
32
33
|
def original_user
|
33
34
|
user_identifier = @controller.session[:original_user_scope_identifier]
|
34
35
|
|
35
|
-
if user_identifier
|
36
|
-
UserLoader.prepare(:scope_identifier => user_identifier).user
|
37
|
-
end
|
36
|
+
UserLoader.prepare(scope_identifier: user_identifier).user if user_identifier
|
38
37
|
end
|
39
38
|
|
40
39
|
def original_user=(user)
|
41
|
-
user_type
|
42
|
-
|
40
|
+
user_type = user.class.to_s.underscore
|
41
|
+
column_name = SwitchUser.available_users_identifiers[user_type.to_sym]
|
42
|
+
user_identifier = "#{user_type}_#{user.send(column_name)}"
|
43
43
|
|
44
44
|
@controller.session[:original_user_scope_identifier] = user_identifier
|
45
45
|
end
|
@@ -59,7 +59,6 @@ module SwitchUser
|
|
59
59
|
def current_user?(user, scope = :user)
|
60
60
|
current_user(scope) == user
|
61
61
|
end
|
62
|
-
|
63
62
|
end
|
64
63
|
end
|
65
64
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module Provider
|
3
5
|
class Clearance < Base
|
@@ -5,16 +7,16 @@ module SwitchUser
|
|
5
7
|
@controller = controller
|
6
8
|
end
|
7
9
|
|
8
|
-
def login(user,
|
9
|
-
@controller.sign_in
|
10
|
+
def login(user, _scope = nil)
|
11
|
+
@controller.send(:sign_in, user)
|
10
12
|
end
|
11
13
|
|
12
|
-
def logout(
|
13
|
-
@controller.sign_out
|
14
|
+
def logout(_scope = nil)
|
15
|
+
@controller.send(:sign_out)
|
14
16
|
end
|
15
17
|
|
16
|
-
def current_user(
|
17
|
-
@controller.current_user
|
18
|
+
def current_user(_scope = nil)
|
19
|
+
@controller.send(:current_user)
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module Provider
|
3
5
|
class Devise < Base
|
@@ -6,7 +8,7 @@ module SwitchUser
|
|
6
8
|
@warden = @controller.warden
|
7
9
|
end
|
8
10
|
|
9
|
-
def login(user, scope =
|
11
|
+
def login(user, scope = nil)
|
10
12
|
if SwitchUser.provider.is_a?(Hash) && SwitchUser.provider[:store_sign_in]
|
11
13
|
@warden.set_user(user, scope: scope)
|
12
14
|
else
|
@@ -14,11 +16,11 @@ module SwitchUser
|
|
14
16
|
end
|
15
17
|
end
|
16
18
|
|
17
|
-
def logout(scope =
|
19
|
+
def logout(scope = nil)
|
18
20
|
@warden.logout(scope)
|
19
21
|
end
|
20
22
|
|
21
|
-
def current_user(scope =
|
23
|
+
def current_user(scope = nil)
|
22
24
|
@warden.user(scope)
|
23
25
|
end
|
24
26
|
end
|
@@ -1,32 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module Provider
|
3
5
|
class Dummy < Base
|
4
|
-
def initialize(
|
6
|
+
def initialize(_controller)
|
5
7
|
@user = nil
|
6
8
|
end
|
7
9
|
|
8
|
-
def login(user,
|
10
|
+
def login(user, _scope = nil)
|
9
11
|
@user = user
|
10
12
|
end
|
11
13
|
|
12
|
-
def logout(
|
14
|
+
def logout(_scope = nil)
|
13
15
|
@user = nil
|
14
16
|
end
|
15
17
|
|
16
|
-
def current_user(
|
18
|
+
def current_user(_scope = nil)
|
17
19
|
@user
|
18
20
|
end
|
19
21
|
|
20
|
-
|
21
|
-
@original_user
|
22
|
-
end
|
22
|
+
attr_reader :original_user
|
23
23
|
|
24
24
|
def remember_current_user(remember)
|
25
|
-
if remember
|
26
|
-
@original_user = current_user
|
27
|
-
else
|
28
|
-
@original_user = nil
|
29
|
-
end
|
25
|
+
@original_user = (current_user if remember)
|
30
26
|
end
|
31
27
|
end
|
32
28
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module Provider
|
3
5
|
class RestfulAuthentication < Base
|
@@ -5,15 +7,15 @@ module SwitchUser
|
|
5
7
|
@controller = controller
|
6
8
|
end
|
7
9
|
|
8
|
-
def login(user,
|
10
|
+
def login(user, _scope = nil)
|
9
11
|
@controller.current_user = user
|
10
12
|
end
|
11
13
|
|
12
|
-
def logout(
|
14
|
+
def logout(_scope = nil)
|
13
15
|
@controller.logout_killing_session!
|
14
16
|
end
|
15
17
|
|
16
|
-
def current_user(
|
18
|
+
def current_user(_scope = nil)
|
17
19
|
@controller.current_user
|
18
20
|
end
|
19
21
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module Provider
|
3
5
|
class Session < Base
|
@@ -5,15 +7,15 @@ module SwitchUser
|
|
5
7
|
@controller = controller
|
6
8
|
end
|
7
9
|
|
8
|
-
def login(user,
|
10
|
+
def login(user, _scope = nil)
|
9
11
|
@controller.session[session_key] = user.id
|
10
12
|
end
|
11
13
|
|
12
|
-
def logout(
|
14
|
+
def logout(_scope = nil)
|
13
15
|
@controller.session.delete(session_key)
|
14
16
|
end
|
15
17
|
|
16
|
-
def current_user(
|
18
|
+
def current_user(_scope = nil)
|
17
19
|
@controller.current_user
|
18
20
|
end
|
19
21
|
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module Provider
|
3
5
|
class Sorcery < Base
|
@@ -5,14 +7,12 @@ module SwitchUser
|
|
5
7
|
@controller = controller
|
6
8
|
end
|
7
9
|
|
8
|
-
def login(user,
|
10
|
+
def login(user, _scope = nil)
|
9
11
|
@controller.auto_login(user)
|
10
12
|
end
|
11
13
|
|
12
|
-
def logout(
|
13
|
-
if SwitchUser.switch_back
|
14
|
-
save_original_user_identifier
|
15
|
-
end
|
14
|
+
def logout(_scope = nil)
|
15
|
+
save_original_user_identifier if SwitchUser.switch_back
|
16
16
|
|
17
17
|
@controller.logout
|
18
18
|
|
@@ -24,12 +24,11 @@ module SwitchUser
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def restore_original_user_identifier
|
27
|
-
|
28
|
-
@
|
29
|
-
end
|
27
|
+
@controller.session[:original_user_scope_identifier] =
|
28
|
+
@original_user_scope_identifier if @original_user_scope_identifier
|
30
29
|
end
|
31
30
|
|
32
|
-
def current_user(
|
31
|
+
def current_user(_scope = nil)
|
33
32
|
@controller.current_user
|
34
33
|
end
|
35
34
|
end
|
data/lib/switch_user/rails.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
class Engine < Rails::Engine
|
3
|
-
initializer
|
4
|
-
|
5
|
-
|
5
|
+
initializer 'switch_user.view' do
|
6
|
+
config.to_prepare do
|
7
|
+
ActiveSupport.on_load(:action_view) do
|
8
|
+
include SwitchUserHelper
|
9
|
+
end
|
6
10
|
end
|
7
11
|
end
|
8
12
|
end
|
data/lib/switch_user/rspec.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'switch_user/rspec/feature_helpers'
|
2
4
|
|
3
5
|
require 'rspec/core'
|
4
6
|
|
5
7
|
RSpec.configure do |config|
|
8
|
+
config.include SwitchUser::RSpecFeatureHelpers, type: :feature
|
6
9
|
|
7
|
-
config.
|
8
|
-
|
9
|
-
config.before(:each, :type => :feature) do
|
10
|
+
config.before(:each, type: :feature) do
|
10
11
|
allow_any_instance_of(SwitchUserController).to receive(:available?).and_return(true)
|
11
12
|
end
|
12
|
-
|
13
13
|
end
|
@@ -1,9 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module SwitchUser
|
2
4
|
module RSpecFeatureHelpers
|
3
|
-
|
4
5
|
class InvalidArgument < StandardError; end
|
5
6
|
|
6
|
-
def switch_user(user_record_or_scope, user_id=nil)
|
7
|
+
def switch_user(user_record_or_scope, user_id = nil)
|
7
8
|
_user_scope =
|
8
9
|
case user_record_or_scope
|
9
10
|
when ActiveRecord::Base
|
@@ -14,31 +15,29 @@ module SwitchUser
|
|
14
15
|
|
15
16
|
_user_scope = _user_scope.to_s
|
16
17
|
|
17
|
-
|
18
|
-
|
19
|
-
|
18
|
+
raise SwitchUser::InvalidScope,
|
19
|
+
"don't allow this user sign in, please check config.available_users" unless SwitchUser.available_scopes
|
20
|
+
.include?(_user_scope) || SwitchUser.available_scopes.include?(_user_scope.to_sym)
|
20
21
|
|
21
22
|
_user_id =
|
22
23
|
case user_record_or_scope
|
23
24
|
when ActiveRecord::Base
|
24
|
-
identifier =
|
25
|
-
|
26
|
-
|
27
|
-
|
25
|
+
identifier =
|
26
|
+
SwitchUser.available_users_identifiers[_user_scope] ||
|
27
|
+
SwitchUser.available_users_identifiers[_user_scope.to_sym]
|
28
|
+
raise SwitchUser::InvalidScope,
|
29
|
+
"don't allow switch this user, please check config.available_users_identifiers" if identifier.nil?
|
30
|
+
|
28
31
|
user_record_or_scope.send identifier
|
29
32
|
else
|
30
33
|
user_id
|
31
34
|
end
|
32
35
|
|
33
|
-
if _user_id.to_s.empty?
|
34
|
-
raise InvalidArgument.new("don't allow switch this user, user_id is empty")
|
35
|
-
end
|
36
|
+
raise InvalidArgument, "don't allow switch this user, user_id is empty" if _user_id.to_s.empty?
|
36
37
|
|
37
38
|
scope_identifier = "#{_user_scope}_#{_user_id}"
|
38
39
|
|
39
40
|
visit "/switch_user?scope_identifier=#{scope_identifier}"
|
40
41
|
end
|
41
|
-
|
42
42
|
end
|
43
|
-
|
44
43
|
end
|