我的行动如下:
/**
* @Security("is_granted('ROLE_USER_EDITOR')")
* @Route("/{email}")
* @Method("GET")
*/
public function getAction(User $user)
问题是ParamConverter优先于@Security
注释。
如果我未获得授权并提供现有电子邮件,我会被重定向到登录页面。这是预期和正确的
但是当我未获得授权并提供不存在的电子邮件时,我会收到404说无法找到User
。
我认为授权检查比参数转换更重要
如何让Security
注释优先于Param Converter?
答案 0 :(得分:3)
您可以通过向null
参数添加$user
默认值来避免获得404。
/**
* @Security("is_granted('ROLE_USER_EDITOR')")
* @Route("/{email}")
* @Method("GET")
*/
getAction(User $user = null) {
if ($user === null) {
return $this->createNotFoundException();
}
...
}
答案 1 :(得分:1)
@ParamConverter
和@Entity
对CONTROLLER
内核事件subscribing @Security
和@IsGranted
注释为subscribing CONTROLLER_ARGUMENTS
内核事件dispatched after CONTROLLER
:
一旦解析了控制器参数,就会发生
CONTROLLER_ARGUMENTS
事件。
因此,@Security
将始终在@ParamConverter
之后执行,原因是他们订阅了the order of the events。正如我在评论中所说,需要执行此执行顺序以允许在安全检查中使用已转换的参数(如所示here)。
因此,为了避免你所描述的行为,我想你将不得不以不同的方式写东西。正如@goto指出的那样,您可以为user
添加默认值,或者您也可以自己检索用户并完全删除自动参数转换。