【问题标题】:Resque, Devise and admin authenticationResque、设计和管理员身份验证
【发布时间】:2011-11-09 04:03:41
【问题描述】:

使用 Resque 和 Devise,我有用户角色,例如:

User.first.role #=> admin
User.last.role #=> regular

我想为 Resque 设置身份验证。所以,在 config/routes.rb 我有:

namespace :admin do
  mount Resque::Server.new, :at => "/resque", :as => :resque
end

当然,所有登录用户都可以访问它。

有什么方法可以使用 User.role 中的角色?它应该只能由具有“管理员”角色的用户访问。

非常感谢。

【问题讨论】:

    标签: ruby-on-rails devise resque


    【解决方案1】:

    routes.rb 文件中使用路由约束:

      resque_constraint = lambda do |request|
        request.env['warden'].authenticate? and request.env['warden'].user.admin?
      end
    
      constraints resque_constraint do
        mount Resque::Server, :at => "/admin/resque"
      end
    

    【讨论】:

    • 这确实有效,但是未经授权的用户将收到 404 页面并且不会被定向到登录页面。使用此技术时请记住这一点。
    【解决方案2】:

    在您的routes.rb 文件中:

    authenticate :user, lambda {|u| u.role == 'admin' } do
        mount Resque::Server.new, :at => "/resque"
    end
    

    另外,请确保您在该文件中的某处有 devise_for :users

    【讨论】:

    • 您的解决方案完全有效,而且效果很好,因为正如请求者所说,我们对管理员和用户都使用相同的模型。谢谢!
    • 这正是我的问题 :)
    • 我比公认的答案更喜欢这个解决方案,因为它更加优雅和可读。
    【解决方案3】:

    总是有新的解决方案,在你的 routes.rb 中输入这个用于 rails > 3.1:

      authenticate :admin do
        mount Resque::Server.new, :at => "/resque"
      end
    

    别忘了:

    devise_for :admins
    

    【讨论】:

    • 这似乎是一个更好的主意,但如果未经身份验证,设计似乎会重定向到 /resque/admin/login。你知道有什么方法可以指定未经身份验证的重定向吗?
    • 检查 cicloon 的解决方案如下解决了这个问题,而且效果更好
    • 关于你的路由问题,你可以尝试在你的 routes.rb 中添加 "match "/resque/admins/sign_in" => redirect("/admins/sign_in")",见stackoverflow.com/questions/9731550/…跨度>
    • 与其他解决方案相比,这对我来说效果最好。它还会在登录后将您定向到正确的 URL。例如/jobs -> 重定向到 /admin/login -> 返回 /jobs(成功登录后)
    • 这对我有用,但我不知道是什么 gem 提供了该身份验证方法,这让我很烦......
    【解决方案4】:

    您可以尝试这样子类化 Resque::Server 类:

    require 'resque/server'
    
    class SecureResqueServer < Resque::Server
    
      before do
        redirect '/login' unless some_condition_is_met! 
      end
    
    end
    

    并以这种方式在您的路线中使用它:

    mount SecureResqueServer.new, :at => '/resque'
    

    我从this 博客获得了这些信息。试一试。

    【讨论】:

    • 看起来不错,但我如何从这里检查curent_user 的角色?有什么想法吗?
    • 这个解决方案比使用路由约束要好得多。这是因为身份验证应该在控制器内执行,而不是在路由内。
    • 此外,路由约束仅在满足约束时创建路由,否则会给出 404。这可能与管理面板的其余部分不同。
    • 这是我使用的,记住您需要包含用于身份验证的任何帮助程序,并再次初始化会话
    • 对于新的 Resque-Web gem 有没有类似的解决方案?看来它不使用 Resque::Server,而是使用 Rails Engine 来挂载应用程序。
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 2014-10-08
    • 2011-09-18
    • 1970-01-01
    • 2013-07-10
    • 2016-04-19
    • 2015-08-04
    • 2018-12-05
    相关资源
    最近更新 更多