Rails 6 - 专家 "policy wrapper"

Rails 6 - Pundit "policy wrapper"

我有点被 Pundit 困住了:感觉解决方案应该很简单 - 但我不明白。实际上我有一堆模型都依赖于一个主模型。我的主要模型是一个脚本。剧本有很多角色,很多场景,很多服装等等。另外还有一些像scene.roles这样的连接。我只是想授权创建脚本的用户做所有事情(添加角色、删除场景,只是在她自己的脚本范围内的所有事情),而其他人什么都不做(看)。我是否需要为每个模型创建一个策略,或者我是否可以(重新)以某种方式使用一个“脚本策略”?

从属控制器中的授权看起来如何(即角色中的 'index' 或场景中的 'new')?

身份验证由设备处理。用户必须登录才能查看或执行任何操作。 这是我第一次 post 关于堆栈溢出,很高兴加入社区:-)

Pundit 策略是 PORO(普通旧 ruby 对象)。因此您可以轻松地为主模型创建策略:

class ScriptPolicy
  attr_reader :user, :script

  def initialize(user, script)
    @user = user
    @script = script
  end

  def update?
      user.actor?
  end

  def delete?
      user.admin?
  end
end

然后对于您拥有的每个模型,只需创建一个继承自 ScriptPolicy

的空 class 定义
class ScenePolicy < ScriptPolicy
end

另一种方法是覆盖 Pundit 在子模型中直接引用的策略名称。所以假设你有一个模型 Scene 应该使用与 Script 相同的策略,你可以添加一个方法:

class Scene < ActiveRecord::Base
  def self.policy_class
     ScriptPolicy
  end
end

在后者中,您不需要为每个模型创建空策略 classes,但您可以用它来换取为模型定义特定权限的灵活性降低。

在你的控制器中调用authorize方法时,你可以指定策略class:

authorize @model, policy_class: ScriptPolicy

我发现此解决方案生成的样板文件较少。

授权范围:

scenes = policy_scope(Scene, policy_scope_class: ScriptPolicy::Scope)

顺便说一句,专家的自述文件中包含了所有内容:https://github.com/varvet/pundit