- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有时,我有一个页面,我想对不同规则的复杂组合使用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 条件,但我认为这可能有点反模式。
最佳答案
从我的角度来看,你可以做两件事:
我对你的问题很好奇,所以我搜索了文档。这样,我遇到了文档的这一部分,AccessDecisionManager
:http://symfony.com/doc/current/security/voters.html#checking-for-roles-inside-a-voter 。我敢打赌,您可以用它来检查您的 DraftEditorVoter
您可以将 DraftEditorVoter
注入(inject)到 DraftCanEditVoter
中。这样,您就可以使用其 voteOnAttribute
方法,而无需创建依赖循环。您调用它所需的所有内容都已传递给您的投票者,因此参数不应该成为问题。
关于symfony - 在 Symfony 投票器中使用 isGranted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43140590/
我是一名优秀的程序员,十分优秀!