【问题标题】:pundit authorisation multiple-inheritence (scopes, modules)?权威人士授权多重继承(范围,模块)?
【发布时间】:2016-01-14 23:23:08
【问题描述】:

我正在使用 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 仍然对范围使用类定义?

【问题讨论】:

    标签: ruby-on-rails ruby authorization pundit


    【解决方案1】:

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

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

    也许可以对一些更枯燥的东西进行元编程,但这很管用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      相关资源
      最近更新 更多