我有一个项目政策,只有超级或管理员才能访问。
它现在看起来像这样:
class ProjectPolicy < ApplicationPolicy
def index?
super_or_admin?
end
def new?
super_or_admin?
end
def create?
super_or_admin?
end
def update?
super_or_admin?
end
def show?
super_or_admin?
end
def super_or_admin?
user.role.name == 'superadmin' or user.role.name == 'admin'
end
end
是否有可能让权威人员自动将super_or_admin?
应用于所有路由而不是手动定义每个路由?
答案 0 :(得分:2)
您可以像这样定义您的政策:
class ProjectPolicy < ApplicationPolicy
def initialize(user, record)
raise Pundit::NotAuthorizedError.new(policy: 'project') unless super_or_admin?
end
def method_missing(name, *args)
true
end
def super_or_admin?
user.role.name == 'superadmin' or user.role.name == 'admin'
end
end
因此它将检查初始化的权限。在这种情况下定义method_missing
是必要的,否则您将收到NoMethodError
针对特定于操作的方法(create?
,update?
等)。但是你不需要定义它们,因为你检查了initialize
方法中的权限,无论如何都要调用它。
然后,如果您需要在所有操作中进行授权,在您的控制器或其祖先中您可以定义:
include Pundit
def authorize_project
authorize :project
end
并像这样使用before_action
回调:
before_action :authorize_project