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

时间:2015-08-23 12:39:03

标签: ruby-on-rails ruby authorization pundit

我正在使用Pundit进行授权,并希望在策略类之间共享逻辑。到目前为止,我一直在使用普通的ruby模块和包含,但还没有为专家的Scope类找到一个好的解决方案。

例如,授予对具有特定标记的记录的管理员访问权限与将其限制为仅发布(不是草稿或已停止/已删除)记录完全不同。

例如

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方法创建吗?更新?等等,但范围是一个难题,因为它们是类定义而不是方法。

我期望范围构成让我采用基类的范围并通过像往常一样添加where语句来限制它,或者通过使用super,pluck和使用union构建新范围来扩展它。

没有元编程,有没有一种干净的方法可以做到这一点?或者库是否需要更改以支持动态范围而不是使用类定义?

为什么Pundit还会为范围使用类定义?

1 个答案:

答案 0 :(得分:0)

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

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

或许可以将某些东西编程成干燥器,但这样可行。