使用Devise + Active Admin + Switch User登录其他用户的帐户

ran*_*ika 9 devise ruby-on-rails-3 activeadmin

我正在尝试在我现有的rails 3.0.9应用程序中实现switch_user gem.我的应用程序有两个模型,它们是

  1. 用户 - 对于我的客户帐户,它有__ Account
  2. AdminUser - 这是由ActiveAdmin创建的

我已经启用了设计身份验证Users,ActiveAdmin也可以很好地工作AdminUser.现在,从我的Active Admin界面,我想选择帐户并登录这些帐户,就像帐户所有者一样.切换用户工作正常,但问题是如果他们知道网址,任何人都可以直接登录到用户帐户.

HTTP://本地主机:3000/switch_user scope_identifier = USER_1

我只需要允许AdminUser(即,如果有ActiveAdmin会话)访问用户的帐户.

这就是我的/config/initializers/switch_user.rb的样子

SwitchUser.setup do |config|
  config.controller_guard = lambda { |current_user, request| current_admin_user.nil?}
  config.redirect_path = lambda { |request, params| "/dashboard" }
end
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误

NameError in SwitchUserController#set_current_user

undefined local variable or method `current_admin_user' for main:Object
Run Code Online (Sandbox Code Playgroud)

无论如何我可以访问活动的管理会话吗?

/config/initializers/active_admin.rb的代码

ActiveAdmin.setup do |config|
  config.site_title = "MyAppName"
  config.authentication_method = :authenticate_admin_user!
  config.current_user_method = :current_admin_user
end
Run Code Online (Sandbox Code Playgroud)

顺便说一下我的应用程序控制器我没有创建任何方法authenticate_admin_user,current_admin_user活动管理员没有它们工作正常.

Dmi*_*lov 6

你需要修改本地config/initializers/switch_user.rb:

config.controller_guard = lambda { |current_user, request, original_user, controller|
    controller.admin_user_signed_in?
}
Run Code Online (Sandbox Code Playgroud)

原始lambda有2个参数.只需添加更多(最多4个)并使用它.

别忘了重启rails服务器:)


ran*_*ika 2

好吧,我想我找到了一个解决方案来保护switch_user. 我所做的就是将路由移至 admin_users 范围内

  ActiveAdmin.routes(self)

  devise_for :admin_users, ActiveAdmin::Devise.config do
    match '/admin/switch_user', :controller => 'switch_user', :action => 'set_current_user'
  end
Run Code Online (Sandbox Code Playgroud)