我如何为提供各种模型数据的仪表板控制器提供权威授权?
我的DashboardsController看起来像这样:
class DashboardsController < ApplicationController
before_action :authenticate_user!
before_action :set_user
before_action :set_business
after_action :verify_authorized
def index
end
private
def set_user
@user = current_user
end
def set_business
@business = current_user.business
end
end
如何在DashboardsPolicy中为@user和@business授权?
答案 0 :(得分:0)
Pundit希望将当前用户和模型对象传递给它。在这种情况下,我认为你想要的是一个DashboardsPolicy
类,你会授权它:
def index
authorize(@business)
end
来自README:
Pundit将调用current_user方法来检索要发送的内容 这个论点
授权方法自动推断Post会有一个 匹配PostPolicy类,并实例化此类,交付 当前用户和给定记录
README中还有一个关于无头策略的特定部分,它使用仪表板作为示例操作:https://github.com/varvet/pundit#headless-policies
您还可以创建一个普通的ruby对象,它接受两个实体并将其用作您的对象进行授权:
class UserBusiness
def initialize(user, business)
end
...other methods here
end
@model = UserBusiness.new(user, business)
authorize(@model)
答案 1 :(得分:0)
我认为尝试访问仪表板不是基于名为仪表板的资源的策略,而只是业务策略中的一种特殊方法。
因此,我会将此作为方法BusinessPolicy
添加到dashboard
。
# in your controller
authorize @business, :dashboard?
# and the business_policy
class BusinessPolicy < ApplicationPolicy
def dashboard?
# condition depending on a `user` (current_user) and a record (business)
user.admin? || user.business == record
end
end
或者它可能更简单。如果允许某人在允许她展示业务时看到该信息中心,则只需在您的控制器中重复使用BusinessPolicy#show?
:
authorize @business, show?