2

我需要使用 devise 设置仅在登录用户是管理员(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 获得了这段代码: https ://github.com/mperham/sidekiq/wiki/Monitoring 我尝试了他们发布的代码,但没有成功,所以我在刚刚发布的时候做了一些修改。当用户评估为零时,上面的代码不起作用。

处理此问题的正确安全方法是什么?

谢谢你的帮助!

4

3 回答 3

9

如果您使用 devise 对用户进行身份验证,您需要执行以下操作:

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

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

用这个块:

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

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

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

于 2013-11-06T15:56:51.007 回答
0

您并没有真正尝试根据用户是谁来更改路线(我什至不确定在没有大量黑客攻击的情况下是否可以在 Rails 中使用),您正在尝试授权用户的操作。

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

于 2013-03-12T04:13:44.560 回答
0

如果您在控制器中进行任何类型的过滤以进行设计,您可以使用助手

class ###Controller < ApplicationController

  before_filter: :authenticate_admin!

def index
end

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

before_filter: :authenticate_user!
before_filter: :authenticate_author!

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

希望能帮助到你!

于 2013-03-12T04:35:47.453 回答