switch_user 1.3.1 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +20 -4
- data/Gemfile +2 -0
- data/README.md +23 -21
- 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 +20 -10
- 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 +10 -4
- 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,17 +1,27 @@
|
|
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
|
-
klass_part =
|
14
|
-
|
15
|
+
klass_part =
|
16
|
+
if SwitchUser.provider.is_a?(Hash)
|
17
|
+
SwitchUser.provider[:name]
|
18
|
+
else
|
19
|
+
SwitchUser.provider
|
20
|
+
end
|
21
|
+
|
22
|
+
klass_part = klass_part.to_s.classify
|
23
|
+
|
24
|
+
klass = "SwitchUser::Provider::#{klass_part}".constantize
|
15
25
|
|
16
26
|
klass.new(controller)
|
17
27
|
end
|
@@ -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,15 +8,19 @@ module SwitchUser
|
|
6
8
|
@warden = @controller.warden
|
7
9
|
end
|
8
10
|
|
9
|
-
def login(user, scope =
|
10
|
-
|
11
|
+
def login(user, scope = nil)
|
12
|
+
if SwitchUser.provider.is_a?(Hash) && SwitchUser.provider[:store_sign_in]
|
13
|
+
@warden.set_user(user, scope: scope)
|
14
|
+
else
|
15
|
+
@warden.session_serializer.store(user, scope)
|
16
|
+
end
|
11
17
|
end
|
12
18
|
|
13
|
-
def logout(scope =
|
19
|
+
def logout(scope = nil)
|
14
20
|
@warden.logout(scope)
|
15
21
|
end
|
16
22
|
|
17
|
-
def current_user(scope =
|
23
|
+
def current_user(scope = nil)
|
18
24
|
@warden.user(scope)
|
19
25
|
end
|
20
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
|