繁体   English   中英

Rails 6 - Pundit “策略包装器”

[英]Rails 6 - Pundit “policy wrapper”

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

授权在从属 controller 中的外观如何(即角色中的“索引”或场景中的“新”)?

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

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

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

然后对于您拥有的每个 model,只需创建一个从ScriptPolicy继承的空 class 定义

class ScenePolicy < ScriptPolicy
end

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

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

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

在 controller 中调用authorize方法时,可以指定策略 class:

authorize @model, policy_class: ScriptPolicy

我发现这个解决方案生成的样板文件更少。

要授权 scope:

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

顺便说一句,这在权威人士的自述文件中都有介绍: https://github.com/varvet/pundit

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM