我有一个这样的操作:
/**
* @Security("is_granted('ROLE_USER_EDITOR')")
* @Route("/{email}")
* @Method("GET")
*/
public function getAction(User $user)
问题是 ParamConverter 优先于@Security
注释。
如果我未获得授权并提供现有电子邮件,我将被重定向到登录页面。这是意料之中的,也是正确的。
但是,当我未获得授权并提供不存在的电子邮件时,我会收到404,说找不到User
。
我认为授权检查比参数转换更重要。
如何让Security
注释优先于参数转换器?
您可以通过向$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
都订阅了CONTROLLER
内核事件,而@Security
和@IsGranted
注释订阅了在CONTROLLER
之后调度的CONTROLLER_ARGUMENTS
内核事件:
解决控制器参数后,将发生
CONTROLLER_ARGUMENTS
事件。
因此,由于订阅事件的顺序,@Security
将始终在@ParamConverter
之后执行。正如我在评论中所说,需要此执行顺序以允许在安全检查中使用转换后的参数(如此处所示)。
因此,为了避免你描述的行为,我想你将不得不简单地以不同的方式写东西。正如@goto指出的,您可以为user
添加默认值,也可以自己检索用户并完全删除此用例的自动参数转换。