rails:如何检查管理员用户设置路由?

时间:2013-03-12 04:02:01

标签: ruby-on-rails routing

我需要设置一个仅在登录用户是admin(user.admin?)时使用devise才有效的路由。我正在为sidekiq做这个,但问题对任何类似的用途都有效。

这是我的路线代码:

class AdminConstraint
  def matches?(request)
    !request.session['warden.user.user.key'].nil? and request.session['warden'].user.admin?
  end
end

require 'sidekiq/web'
mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new

我从sidekiq wiki获得了这段代码:https://github.com/mperham/sidekiq/wiki/Monitoring 我尝试了他们发布的代码,这些代码没有用,所以我在发布时做了一些修改。上面的代码不起作用,因为用户评估为nil。

正确的安全方法是什么?

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

如果您使用设计对用户进行身份验证,则需要执行的操作如下:

在routes.rb文件中,替换此行:

mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new

使用此块:

authenticate :user, lambda { |u| u.has_role? :admin } do
    mount Sidekiq::Web => '/sidekiq'
end

该块的作用是告诉您的设计机制首先检查用户是否经过身份验证(authenticate方法是设计方法),以及用户是否具有admin角色(lambda块)在定义到sidekiq UI的路由之前,检查)。 这样,只有具有管理员角色的用户才能访问此路由。其他用户在开发过程中会出现路由错误,生产中会出现404错误。

还有一件事,has_role?方法是一个rolify gem,在我的情况下我使用它,但你可以用任何其他检查用户是否为admin的方法/查询替换它。

答案 1 :(得分:0)

你并没有真正尝试改变路线,具体取决于用户是谁(我甚至不确定它是否可以在没有大量黑客攻击的情况下使用),你正试图授权用户的行动。

有几个很好的授权库。我个人喜欢CanCan,但还有很多其他人。

答案 2 :(得分:0)

如果你在控制器中进行任何类型的过滤,你可以使用帮助

class ###Controller < ApplicationController

  before_filter: :authenticate_admin!

def index
end

或者您尝试允许访问的任何设计模型,即

before_filter: :authenticate_user!
before_filter: :authenticate_author!
像bdares说的那样。如果设计中的辅助方法不够,可以使用CanCan gem进行授权

希望它有所帮助!