[英]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.