Guardian前后检查API

我在构建插件时遇到过几次需要修改 Guardian can_* 检查结果的情况。在 ActivityPub 插件中我再次遇到了这种情况:

https://github.com/discourse/discourse-activity-pub/blob/main/extensions/discourse_activity_pub_guardian_extension.rb

我刚刚提出了一个草稿 PR,它添加了一个新的服务器端插件 API 方法,允许你在 guardian 的 can_* 方法之前和之后注册检查,从而能够更改该方法的执行结果。例如:

add_guardian_check(:before, :edit_post) do |guardian, result, post|
  !post.activity_pub_remote?
end

在发布供审查之前,我很想听听大家对方法和执行情况的反馈。

7 个赞

Just bumping this one back up for whomever is relevant. cc @pmusaraj

1 个赞

谢谢你,Angus!

我看不到 before_* 注册有任何问题。after_* 注册有点棘手。从安全角度来看,after_* 注册意味着插件可以以不安全的方式覆盖核心。显然,插件可以通过各种方式做到这一点,但插件 API 不应该进一步促进这一点。

另外,如果多个插件使用 after_* 钩子,会发生什么?哪个会生效?

是的,我明白你的意思。

检查接受一个优先级参数。请参阅此规范

it "respects check priority" do
  plugin.add_guardian_check(:after, :edit_post, 2) { false }
  plugin.add_guardian_check(:after, :edit_post, 0) { true }
  plugin.add_guardian_check(:after, :edit_post, 1) { false }
  expect(Guardian.new(user).can_edit_post?(post)).to be_truthy
end

我是否可以限制此 PR 仅用于 before 检查?这将满足即时需求,并在此处减少涉及的变量。

1 个赞

好的,我们先从 before 检查开始。谢谢!