angus
(Angus McLeod)
1
我在构建插件时遇到过几次需要修改 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 个赞
angus
(Angus McLeod)
2
Just bumping this one back up for whomever is relevant. cc @pmusaraj
1 个赞
pmusaraj
(Penar Musaraj)
3
谢谢你,Angus!
我看不到 before_* 注册有任何问题。after_* 注册有点棘手。从安全角度来看,after_* 注册意味着插件可以以不安全的方式覆盖核心。显然,插件可以通过各种方式做到这一点,但插件 API 不应该进一步促进这一点。
另外,如果多个插件使用 after_* 钩子,会发生什么?哪个会生效?
angus
(Angus McLeod)
4
是的,我明白你的意思。
检查接受一个优先级参数。请参阅此规范
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 个赞