Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails:如何检查管理员用户设置路由?_Ruby On Rails_Routing - Fatal编程技术网

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

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

我需要使用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 '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
表中有and
admin
列,那么类似的内容应该会起作用:
authenticated:user,lambda{u|u.admin?}
实际上这里是涉及此内容的文档
authenticate :user, lambda { |u| u.has_role? :admin } do
    mount Sidekiq::Web => '/sidekiq'
end