仅允许管理员用户访问resque Web界面

时间:2016-08-02 06:46:00

标签: ruby-on-rails devise routing resque

在我的rails应用中,我使用devise进行身份验证,我的模型名称为user,我有一个布尔字段admin。在我的routes.rb中,我试图限制除管理员以外的所有用户访问网址。

mount Resque::Server.new, :at => "/resque"

。我尝试使用devise的current_user帮助器,如

 mount Resque::Server.new, :at => "/resque" if current_user.admin == true

但得到错误undefined local variable or method 'current_user' for #<ActionDispatch::Routing::Mapper:0x000000053ac780> (NameError) 。这该怎么做?我是rails的新手请帮忙

3 个答案:

答案 0 :(得分:2)

此类行为的最佳解决方案是向控制器添加before_action,如果用户不是管理员,则会产生错误:

before_action:authorize_admin_only

def authorize_admin_only
   raise RoutingError.new('Not found') if !current_user.admin
end

您的路线文件在启动时被解释一次,即使您可以找到根据请求制作路线的方法(例如使用routing_filter),也不宜将其用于授权目的。

authorize_admin_only中,您还可以呈现错误文件,或者只是将用户重定向到其他页面,例如登录。

针对您的具体情况,由于您要安装其他引擎,您还可以在admin模型in your routes(以及special resque example)上定义身份验证

  authenticate :admin_user do #replace admin_user(s) with whatever model your users are stored in.
    mount Resque::Server.new, :at => "/jobs"
  end

如果您没有管理模型,那么您可以参考the devise documentation for authenticate并执行以下操作:

authenticate(:user, &:admin?) do
  mount Resque::Server.new, :at => "/jobs"
end

&:admin?产生与lambda{|user| user.admin?}相同的结果,如果您没有定义此类别名,则删除?

答案 1 :(得分:1)

答案 2 :(得分:1)

最后这对我有用

  # routes.rb
  match "/resque" => Resque::Server, :anchor => false, :constraints => lambda { |req|
    req.env['warden'].authenticated? and req.env['warden'].user.is_admin?
  }

  # user.rb
  class MUserLogin < ActiveRecord::Base
    .
    .
    .
    def is_admin?
      # your admin logic here for example:
      self.admin == true
    end
  end