Ruby on rails rails:如何检查管理员用户设置路由?
我需要使用designe设置一个仅当登录用户是admin(user.admin?)时有效的路由。我这样做是为了sidekiq,但是这个问题对于任何类似的用途都是有效的 这是我的路线代码:Ruby on rails rails:如何检查管理员用户设置路由?,ruby-on-rails,routing,Ruby On Rails,Routing,我需要使用designe设置一个仅当登录用户是admin(user.admin?)时有效的路由。我这样做是为了sidekiq,但是这个问题对于任何类似的用途都是有效的 这是我的路线代码: class AdminConstraint def matches?(request) !request.session['warden.user.user.key'].nil? and request.session['warden'].user.admin? end end require
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上获得了以下代码:
我尝试了他们发布的代码,但不起作用,所以我在发布时做了一些修改。当用户的计算结果为nil时,上面的代码不起作用
处理此问题的正确安全方法是什么
谢谢你的帮助 您并不是真的试图根据用户是谁来更改路由(我甚至不确定在rails中是否可以不进行大量黑客攻击),而是试图授权用户的操作
有几个好的授权库。就我个人而言,我喜欢,但还有很多其他功能。如果您在Desive控制器中执行任何类型的过滤,您可以使用帮助程序
class ###Controller < ApplicationController
before_filter: :authenticate_admin!
def index
end
正如巴达雷斯所说。如果designe中的helper方法不够,您可以使用cancangem进行授权
希望有帮助 如果您使用Desive对用户进行身份验证,则需要执行以下操作: 在routes.rb文件中,替换此行:
mount Sidekiq::Web => '/sidekiq', :constraints => AdminConstraint.new
使用此块:
authenticate :user, lambda { |u| u.has_role? :admin } do
mount Sidekiq::Web => '/sidekiq'
end
块所做的是告诉您的设计机制,在定义到sidekiq UI的路由之前,首先检查用户是否经过身份验证(验证方法是设计方法)authenticate
),以及用户是否具有管理员角色(lambda块检查)。
这样,只有具有管理员角色的用户才能访问此路由。其他用户将在开发中遇到路由错误,在生产中遇到404错误
还有一件事,
有一个角色?
方法是一个rolify gem,在我的例子中,我使用它,但是你可以用任何其他方法/查询来替换它,检查用户是否是管理员。这是一个很好的答案,在2020年仍然有效!如果您的users
表中有andadmin
列,那么类似的内容应该会起作用:authenticated:user,lambda{u|u.admin?}
实际上这里是涉及此内容的文档
authenticate :user, lambda { |u| u.has_role? :admin } do
mount Sidekiq::Web => '/sidekiq'
end