让@Security注释优先于参数转换器



我有一个这样的操作:

/**
* @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添加默认值,也可以自己检索用户并完全删除此用例的自动参数转换。

最新更新