Php 让@Security注释优先于ParamConverter
我有这样一个动作:Php 让@Security注释优先于ParamConverter,php,symfony,Php,Symfony,我有这样一个动作: /** * @Security("is_granted('ROLE_USER_EDITOR')") * @Route("/{email}") * @Method("GET") */ public function getAction(User $user) 问题是ParamConverter优先于@Security注释 如果我未经授权并提供现有电子邮件,我将被重定向到登录页面。这是预期的,也是正确的。 但是,当我未经授权并提供一封不存在的电子邮件时,我会收到一封40
/**
* @Security("is_granted('ROLE_USER_EDITOR')")
* @Route("/{email}")
* @Method("GET")
*/
public function getAction(User $user)
问题是ParamConverter优先于@Security
注释
如果我未经授权并提供现有电子邮件,我将被重定向到登录页面。这是预期的,也是正确的。但是,当我未经授权并提供一封不存在的电子邮件时,我会收到一封404,说找不到
用户
我认为授权检查比参数转换更重要。
如何让安全性
注释优先于参数转换器?您可以通过向$user
参数添加null
默认值来避免获得404
/**
* @Security("is_granted('ROLE_USER_EDITOR')")
* @Route("/{email}")
* @Method("GET")
*/
getAction(User $user = null) {
if ($user === null) {
return $this->createNotFoundException();
}
...
}
@ParamConverter
和@Entity
都属于控制器
内核事件,而@Security
和@isgrated
注释属于控制器参数
内核事件,即:
解析控制器参数后,将发生CONTROLLER\u ARGUMENTS
事件
因此,@Security
将始终在@ParamConverter
之后执行,因为它们已订阅。正如我在评论中所说,为了允许在安全检查中使用转换后的参数(如所示),需要执行此顺序
因此,为了避免你所描述的行为,我想你必须简单地用不同的方式写东西。正如@goto所指出的,您可以为user
添加一个默认值,或者您也可以自己检索用户,并完全放弃此用例的自动参数转换。我认为这不是您想要的,而是在参数转换器之前检查security.yml
文件中的访问控制。我对你的问题投了赞成票,也在等待回答:)谢谢你的建议,但我宁愿自己去找用户。顺便说一下,如果在给@Security
的表达式中使用转换后的参数,则需要参数转换器
注释优先于安全性
注释。感谢您的解释和链接。非常有用。