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
我有点被 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 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