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

时间:2012-01-02 22:34:15

标签: ruby-on-rails-3 devise activeadmin

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

  1. 用户 - 针对我的客户帐户 has_one 帐户
  2. AdminUser - 这是由ActiveAdmin
  3. 创建的

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

    http://localhost: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
    

    但是我收到了这个错误

    NameError in SwitchUserController#set_current_user
    
    undefined local variable or method `current_admin_user' for main:Object
    

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

    /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
    

    btw在我的应用程序控制器中我没有为authenticate_admin_user创建任何方法,current_admin_user活动管理员在没有它们的情况下正常工作。

2 个答案:

答案 0 :(得分:6)

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

config.controller_guard = lambda { |current_user, request, original_user, controller|
    controller.admin_user_signed_in?
}

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

别忘了重启rails服务器:)

答案 1 :(得分: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
相关问题