gpt4 book ai didi

symfony - 在 Symfony 投票器中使用 isGranted

转载 作者:行者123 更新时间:2023-12-02 23:56:06 25 4
gpt4 key购买 nike

有时,我有一个页面,我想对不同规则的复杂组合使用react,这些规则总共只是一件事:“当前用户可以执行此操作吗?”。

目前,大多数检查都直接在我的 Controller 内进行,因此我可以:

if($this->isGranted('DRAFT_EDITOR', $draft) && $now < $deadline && $draft->getStatus() != Draft::STATUS_FINAL) {...}

这些 if 条件变得相当长,并且可能最终在整个代码中重复,所有这些都实现完全相同的事情。所以我想将这些抽象为选民,这样我就可以说:

if($this->isGranted('DRAFT_CAN_EDIT') {}

然后,这将发送给 DraftCanEdit 投票者,该投票者会将本文顶部 IF 语句中的所有检查封装在一个位置,并可以轻松更改草稿可编辑的规则,更不易意外错过某种情况或某个地方出现困惑并造成漏洞等。

问题是投票者无法调用 isGranted(),因为它被认为是循环引用,只是为了将 security.authorization_checker 服务注入(inject)投票者中。

对我来说,调用 isGranted 的投票者作为投票者继承的一种形式在语义上似乎很好,并且只要投票者不支持它传递给 isGranted 的属性/主题,实际上就不应该导致任何类型的循环引用问题。

当然,我可以在 DraftCanEditVoter 中复制 DraftEditorVoter 逻辑,或者我可以在 DraftCanEditVoter 中实例化 DraftEditorVoter,但这两个看起来都不理想,不仅是因为代码重复的原因,还因为我实际上有两个投票者在一起,确定某人是否是 DRAFT_EDITOR。

我也知道我可以通过创建自己的非 Voter 对象并直接使用它来封装 IF 条件,但我认为这可能有点反模式。

最佳答案

从我的角度来看,你可以做两件事:

  1. 我对你的问题很好奇,所以我搜索了文档。这样,我遇到了文档的这一部分,AccessDecisionManager:http://symfony.com/doc/current/security/voters.html#checking-for-roles-inside-a-voter 。我敢打赌,您可以用它来检查您的 DraftEditorVoter

  2. 您可以将 DraftEditorVoter 注入(inject)到 DraftCanEditVoter 中。这样,您就可以使用其 voteOnAttribute 方法,而无需创建依赖循环。您调用它所需的所有内容都已传递给您的投票者,因此参数不应该成为问题。

关于symfony - 在 Symfony 投票器中使用 isGranted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43140590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com