【发布时间】: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