在哪里合适的地方提出权限谓词?

为了提出一个关于 Restrict exposure of full name to certain groups 的解决方案,我想定义一个(服务器端)权限谓词,它回答了以下问题:

根据当前的用户范围/上下文,是否可以显示(其他)用户的全名?

(范围可以由客户端请求设置,或由某些内部处理步骤设置,例如生成摘要电子邮件。)

这种谓词的正确构造是什么?它应该放在代码库的什么位置?我正在考虑这可能属于 Guardian — 我是否在正确的轨道上?关于哪一个有什么意见?

我设想这个新的谓词将取代代码库中许多(但不是全部)SiteSettings.enable_names? 的实例。(命中产生 user.name 的序列化器可以堵住大部分数据泄露,但并非全部。)这样做的一个好处是它将引入一个扩展点,未来的插件可以通过该扩展点更改行为(据我所知,目前还不可能,否则我早就这样做了!)。因此,如果我能让这个工作正常,这将成为 discourse 核心的一个拉取请求 — 我希望提交一个有可能被接受的 PR。

1 个赞

我学到/推断出以下内容:

  • Guardian 确实是封装了 “用户被允许做什么?” 的东西(一个 Guardian 实例也有一个 User 实例。)
  • 因此,权限谓词的正确位置就是 Guardian 上的一个方法(lib/guardian.rb)。
    • 如果该方法是“用户能否对 Xxxx 对象执行 Z 操作?”,那么它可能属于 XxxxGuardian mixin 文件之一(lib/guardian/...)。
    • 否则,它就属于基础 Guardian 定义。
  • ApplicationController 管理一个反映当前请求/客户端的 guardian 属性,并将其作为 scope 提供给序列化器,因此当前的 Guardian 在需要时可用(除非它不可用[1])。
  • 有些地方没有现成的 Guardian,通常是在系统运行的后端任务中,但如果你有一个“正在操作的用户”的句柄(例如,收件用户,在生成电子邮件通知时),你可以即时创建一个合适的 guardian:Guardian.new(the_user)

  1. ↩︎