【问题标题】:Active Admin authentication conflicting with User authentication活动管理员身份验证与用户身份验证冲突
【发布时间】:2011-11-30 05:09:14
【问题描述】:

Active Admin 是用于在您的应用程序中拥有管理仪表板的 gem。它使用 Devise 来登录用户并为管理员创建一个单独的 admin_user 模型。我的应用程序已经使用了 devise 并将其用户作为 user 模型。自从我开始使用活动管理 gem 以来,在我的路由文件中,即使我的用户已登录,以下行也一直解析为 home#index 而不是 users#dashboard。这曾经在登录用户被带到用户之前正常工作#dashboard 作为根 url。

root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
root :to => 'home#index'

发生的事情是 .authenticate? 正在检查 admin_user(属于 Active Admin)是否登录,但不是我的 user 模型,这是我需要检查的,所以当我登录到活动管理界面后,我的站点根目录变为 users#dashboard,而不检查 user 是否已登录。我怎样才能让.authenticate? 检查正在登录的user 而不是admin_user

任何帮助或线索将不胜感激

【问题讨论】:

  • 实际上,由于 Active Admin 以及它使用 Devise 的事实,我似乎遇到了这个问题。登录到活动管理员界面会影响行为,例如,如果活动管理员已登录,应用程序会尝试将每个用户带到仪表板,如果活动管理员已注销,则应用程序会尝试将每个用户带到 home#index,无论是否通用用户本身是否登录
  • 非常感谢任何帮助或线索
  • config/initializers/active_admin.rb 中的当前用户部分
  • 实际上已经设置为config.current_user_method = :current_admin_user,这与整个应用程序中使用的current_user不同。问题是,Devise 使用 Warden,而我在 Routes 文件中使用的上述命令依赖于 Warden。如果我可以使用另一个更具体到哪个用户使用的命令,它会变得更容易:/
  • redirect_to root_path 除非warden.user.is_admin?

标签: ruby-on-rails devise ruby-on-rails-3.1 activeadmin warden


【解决方案1】:

对我有用的是:

constraint = lambda { |request| request.env["warden"].authenticate? and request.env['warden'].user.instance_of?(AdminUser) }

【讨论】:

    【解决方案2】:

    我能够解决这个问题。该问题与 Devise 期望应用程序中的单个用户模型有关。以下是解决方法。

    config/initializers/devise.rb 文件中,添加:

    config.scoped_views = true
    

    config.default_scope = :user #or whichever is your regular default user model
    

    就是这样,warden 检查 :user 是否已登录,而不是 :admin_user

    【讨论】:

      【解决方案3】:

      我不确定,但您可以尝试类似的方法

      root :to => proc { |env| [ 302, {'Location'=> env["warden"].authenticate? ? "users/dashboard" : "/home" }, [] ] }
      

      【讨论】:

      • 我尝试使用root :to => proc { |env| [ 302, {'Location'=> env["warden"].authenticate? ? "users/dashboard" : "/home/index" }, [] ] },但无论用户是否登录,它都试图始终将我带到 /home/index。我怀疑身份验证出了什么问题?命令,可能总是导致错误
      • 我不熟悉 Warden,但您可以深入了解它的源代码,以便在您的 proc 中实现 authenticate?。或者 env["warden"] 返回的结果不是预期的。
      【解决方案4】:

      您为什么使用get "/"?你应该删除它。我使用的定义与您的定义非常相似,并且适用于我。仅使用:

      root :to => 'users#dashboard', :constraints => lambda {|r| r.env["warden"].authenticate? }
      root :to => 'home#index'
      

      【讨论】:

      • 我也试过了,但它仍然总是带我回家#index。无论用户是否登录,lambda {|r| r.env["warden"].authenticate? } 似乎总是为我返回 false。
      猜你喜欢
      • 2012-12-06
      • 1970-01-01
      • 2020-04-13
      • 2018-12-05
      • 2011-09-18
      • 2016-04-12
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多