Commit 4fdce824ea3f74db7a751d2de1b6cd97868eabeb
1 parent
0cf297a8
Exists in
ratings_minor_fixes
and in
3 other branches
Option for admins to login as a different user
Showing
4 changed files
with
55 additions
and
8 deletions
Show diff stats
app/concerns/authenticated_system.rb
... | ... | @@ -2,15 +2,18 @@ module AuthenticatedSystem |
2 | 2 | |
3 | 3 | protected |
4 | 4 | |
5 | - def self.included base | |
6 | - if base < ActionController::Base | |
7 | - base.around_filter :user_set_current | |
8 | - base.before_filter :login_from_cookie | |
5 | + extend ActiveSupport::Concern | |
6 | + | |
7 | + included do | |
8 | + if self < ActionController::Base | |
9 | + around_filter :user_set_current | |
10 | + before_filter :override_user | |
11 | + before_filter :login_from_cookie | |
9 | 12 | end |
10 | 13 | |
11 | 14 | # Inclusion hook to make #current_user and #logged_in? |
12 | 15 | # available as ActionView helper methods. |
13 | - base.helper_method :current_user, :logged_in? | |
16 | + helper_method :current_user, :logged_in? | |
14 | 17 | end |
15 | 18 | |
16 | 19 | # Returns true or false if the user is logged in. |
... | ... | @@ -20,10 +23,9 @@ module AuthenticatedSystem |
20 | 23 | end |
21 | 24 | |
22 | 25 | # Accesses the current user from the session. |
23 | - def current_user | |
26 | + def current_user user_id = session[:user] | |
24 | 27 | @current_user ||= begin |
25 | - id = session[:user] | |
26 | - user = User.where(id: id).first if id | |
28 | + user = User.find_by id: user_id if user_id | |
27 | 29 | user.session = session if user |
28 | 30 | User.current = user |
29 | 31 | user |
... | ... | @@ -141,6 +143,13 @@ module AuthenticatedSystem |
141 | 143 | end |
142 | 144 | end |
143 | 145 | |
146 | + def override_user | |
147 | + return if params[:override_user].blank? | |
148 | + return unless logged_in? and user.is_admin? environment | |
149 | + @current_user = nil | |
150 | + current_user params[:override_user] | |
151 | + end | |
152 | + | |
144 | 153 | # When called with before_filter :login_from_cookie will check for an :auth_token |
145 | 154 | # cookie and log the user back in if apropriate |
146 | 155 | def login_from_cookie | ... | ... |
app/helpers/url_helper.rb
test/functional/application_controller_test.rb
... | ... | @@ -506,6 +506,21 @@ class ApplicationControllerTest < ActionController::TestCase |
506 | 506 | assert_redirected_to :controller => 'account', :action => 'login' |
507 | 507 | end |
508 | 508 | |
509 | + should 'override user when current is an admin' do | |
510 | + user = create_user | |
511 | + other_user = create_user | |
512 | + environment = Environment.default | |
513 | + login_as user.login | |
514 | + @controller.stubs(:environment).returns(environment) | |
515 | + | |
516 | + get :index, override_user: other_user.id | |
517 | + assert_equal user, assigns(:current_user) | |
518 | + | |
519 | + environment.add_admin user.person | |
520 | + get :index, override_user: other_user.id | |
521 | + assert_equal other_user, assigns(:current_user) | |
522 | + end | |
523 | + | |
509 | 524 | should 'do not allow member not included in whitelist to access an restricted environment' do |
510 | 525 | user = create_user |
511 | 526 | e = Environment.default | ... | ... |
... | ... | @@ -0,0 +1,15 @@ |
1 | +require 'test_helper' | |
2 | + | |
3 | +class UrlHelperTest < ActionView::TestCase | |
4 | + | |
5 | + include UrlHelper | |
6 | + | |
7 | + def setup | |
8 | + end | |
9 | + | |
10 | + should 'preserve override_user if present' do | |
11 | + params[:override_user] = 1 | |
12 | + assert_equal default_url_options[:override_user], params[:override_user] | |
13 | + end | |
14 | + | |
15 | +end | ... | ... |