Resque,Devise和admin身份验证

The*_*hts 29 ruby-on-rails resque devise

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

User.first.role #=> admin
User.last.role #=> regular
Run Code Online (Sandbox Code Playgroud)

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

namespace :admin do
  mount Resque::Server.new, :at => "/resque", :as => :resque
end
Run Code Online (Sandbox Code Playgroud)

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

有没有办法使用User.role的角色?只有具有"admin"角色的用户才能访问它.

非常感谢.

jpe*_*thy 39

在您的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
Run Code Online (Sandbox Code Playgroud)

请参阅此博客文章和评论.希望它能帮到你.

  • 这确实有效,但是未经授权的用户将收到404页面,并且不会被定向到登录页面.使用此技术时请记住这一点. (2认同)

Yos*_*sho 20

在你的routes.rb文件中:

authenticate :user, lambda {|u| u.role == 'admin' } do
    mount Resque::Server.new, :at => "/resque"
end
Run Code Online (Sandbox Code Playgroud)

此外,请确保您devise_for :users在该文件中的某个位置


cic*_*oon 13

您可以尝试以这种方式继承Resque :: Server类:

require 'resque/server'

class SecureResqueServer < Resque::Server

  before do
    redirect '/login' unless some_condition_is_met! 
  end

end
Run Code Online (Sandbox Code Playgroud)

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

mount SecureResqueServer.new, :at => '/resque'
Run Code Online (Sandbox Code Playgroud)

我从这个博客获得了这些信息.试试看.

  • 此解决方案比使用路由约束要好得多.这是因为身份验证应该在控制器内执行,而不是在路由中执行. (3认同)

Cal*_*lin 9

总有新的解决方案,在您的routes.rb中为rails> 3.1输入:

  authenticate :admin do
    mount Resque::Server.new, :at => "/resque"
  end
Run Code Online (Sandbox Code Playgroud)

别忘了:

devise_for :admins
Run Code Online (Sandbox Code Playgroud)