我需要设置一个仅在登录用户是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。
正确的安全方法是什么?
感谢您的帮助!
答案 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进行授权
希望它有所帮助!