我正在学习使用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个角色,并希望为这些控制器编写权威策略,允许任意组合授权。
如果专家的目的是解决这个问题,请告诉我。
谢谢
答案 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