使用Pundit授权控制器

set*_*thi 1 ruby-on-rails ruby-on-rails-4 pundit

我正在学习使用Pundit进行授权。但是我看到的是资源授权而不是页面授权。如果用户无权使用pundit访问该页面,我希望将其重定向到未经授权的页面。

例如

class OnlyAdminCanVisitController < ApplicationController
    before_filter :admin_authenticate
Run Code Online (Sandbox Code Playgroud)

停止非管理员角色的用户。

另外,我想处理如下的组合方案(考虑到有Admin,Manager,Employee,Outsider等4个角色。下面的设计显然很糟糕)

    class AdminManagerCanVisitController < ApplicationController
        before_filter :admin_or_manager_authenticate

    class AdminEmployeeCanVisitController < ApplicationController
        before_filter :admin_or_employee_authenticate

   class AdminOutsiderCanVisitController < ApplicationController
        before_filter :admin_or_outsider_authenticate

    class AdminManagerEmployeeCanVisitController < ApplicationController
        before_filter :admin_or_manager_employee_authenticate
Run Code Online (Sandbox Code Playgroud)

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

让我知道专家是否旨在解决这个问题。

谢谢

lka*_*ono 5

实际上,页面和资源之间没有太大区别。因此,您可以通过以下方式解决您的问题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
Run Code Online (Sandbox Code Playgroud)

然后,您需要定义策略。我通常admin?application_policy.rbhttps://github.com/elabs/pundit#policies)中创建一个方法,因此该方法也将散布在我的其他策略中:

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

class UserPolicy < ApplicationPolicy
end
Run Code Online (Sandbox Code Playgroud)

然后在您的其他控制器中,就像您所做的那样:

class OnlyAdminCanVisitController < ApplicationController
  before_action :admin_authenticate
end
Run Code Online (Sandbox Code Playgroud)