首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Symfony选民中使用isGranted

在Symfony选民中使用isGranted
EN

Stack Overflow用户
提问于 2017-03-31 12:23:13
回答 1查看 1.1K关注 0票数 4

有时,我有一个页面,我想要对不同规则的复杂组合做出反应,这完全相当于一件事情:‘当前用户可以这样做吗?’

目前,大多数这些检查都直接在我的控制器内,因此我需要例如:

代码语言:javascript
运行
复制
if($this->isGranted('DRAFT_EDITOR', $draft) && $now < $deadline && $draft->getStatus() != Draft::STATUS_FINAL) {...}

这些条件会持续很长时间,并且可能在整个代码中被重复,所有这些都实现了完全相同的目标。所以我想把这些抽象出来给选民看,这样我就可以说:

代码语言:javascript
运行
复制
if($this->isGranted('DRAFT_CAN_EDIT') {}

然后,这将转到一个DraftCanEdit投票者,它将这个帖子顶部的IF语句中的所有检查封装在一个地方,并使更改规则变得容易,从而使草案更容易编辑,更难意外地遗漏一个条件,或者在某个地方弄乱一个条件,并创建漏洞等等。

问题是选民不能调用isGranted(),因为它被认为是一个循环引用,只是为了将security.authorization_checker服务注入到投票者中。

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

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

我也知道,我可以封装IF条件,只需制作我自己的非投票者对象,并直接使用它,但我认为这可能有点反模式。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-31 12:46:37

在我看来,你可以做两件事:

  1. 我对你的问题很好奇,所以我查了一下医生。这样,我看到了文档的这一部分,AccessDecisionManagerhttp://symfony.com/doc/current/security/voters.html#checking-for-roles-inside-a-voter。我敢打赌,你可以用它来检查你的DraftEditorVoter
  2. 你可以把你的DraftEditorVoter注入DraftCanEditVoter。这样,您就可以使用它的voteOnAttribute方法,而无需创建依赖循环。您需要调用的所有内容都已传递给您的选民,因此参数不应该是一个问题。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43140590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档