专家授权多重继承(范围,模块)?

pundit authorisation multiple-inheritence (scopes, modules)?

我正在使用 Pundit 进行授权,并希望在策略 classes 之间共享逻辑。到目前为止,我一直在使用普通的 ruby 模块和包含,但还没有为 pundit 的范围 classes.

找到好的解决方案

例如,授予管理员对具有特定标签的记录的访问权限与将它们限制为仅已发布(而非草稿或 discontinued/deleted)记录是完全不同的。

例如

class PagePolicy < ApplicationPolicy
  # restrict access to current pages
  include PublishedOnlySharedPolicy
  # enable section editors to update their tagged content
  include TagsAclSharedPolicy
end

module TagsAclSharedPolicy
  def update?
    admin.in_tag_acl?(record) || super
  end

  def show?
    admin.in_tag_acl?(record) || super
  end

  def scope
    # ... can't do this?
  end
end

这些模块对于普通的 ACL 方法创建工作正常吗?更新?等等,但是范围是一个难题,因为它们是 class 定义而不是方法。

我希望作用域组合能够让我采用基础 class 的作用域并像往常一样通过添加 where 语句来限制它,或者通过使用 super、pluck 和构建新作用域来扩展它使用工会.

有没有不用元编程的简洁方法?或者库是否需要更改以支持动态范围而不是使用 class 定义?

为什么 Pundit 仍然使用 class 范围定义?

如果有人好奇,https://github.com/elabs/pundit/issues/310 有答案。

基本上将白名单 ids 方法添加到应用程序策略的范围,然后在每个策略的范围 class 中用正常的 ruby 覆盖它,任何共享的范围代码都在其自己的模块中并包含在范围。

也许可以对一些更干涩的东西进行元编程,但这行得通。