使用Pundit授权控制器

时间:2015-07-07 02:55:50

标签: ruby-on-rails ruby-on-rails-4 pundit

我正在学习使用Pundit进行授权。但我认为它的方式是资源授权而非页面授权。如果用户无权使用权威人员访问该页面,我希望将用户重定向到未经授权的页面。

例如

green found in checkList
mother found in checkList
gray found in checkList
blue not found in checkList
mother found in checkList

停止非管理员角色用户。

另外,我想照顾下面的组合方案(考虑到管理员,经理,员工,局外人等4个角色。下面的设计很明显很糟糕)

class OnlyAdminCanVisitController < ApplicationController
    before_filter :admin_authenticate

我有4个角色,并希望为这些控制器编写权威策略,允许任意组合授权。

如果专家的目的是解决这个问题,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:4)

实际上页面和资源之间没有太大区别。因此,您可以通过从application_controller.rb

中挽救拒绝的授权来解决您的问题
class ApplicationController < ActionController::Base
  include Pundit

  rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

  protected

  def admin_authenticate
    authorize current_user, :admin?
  end

  private

  def user_not_authorized(exception)
    # Redirect to whatever page you want if not authorized
  end
end

然后,您需要定义您的政策。我通常会在admin?https://github.com/elabs/pundit#policies)中创建application_policy.rb方法,因此它也会在我的其他政策中传播:

class ApplicationPolicy
  def admin?
    # Logic to ensure the user is an admin
  end
end

class UserPolicy < ApplicationPolicy
end

然后在你的其他控制器中,就像你一样:

class OnlyAdminCanVisitController < ApplicationController
  before_action :admin_authenticate
end