繁体   English   中英

让@Security注释优先于ParamConverter

[英]Let @Security annotation take precedence over ParamConverter

我有一个类似的动作:

/**
 * @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_ARGUMENTS内核事件,该事件CONTROLLER之后调度

解析控制器参数后,将发生CONTROLLER_ARGUMENTS事件。

因此,由于@Security订阅事件的顺序@Security @ParamConverter将始终在@ParamConverter之后执行。 正如我在评论中所说的那样,需要执行顺序才能在安全检查中使用转换后的参数(如此处所示 )。


因此,为了避免您描述的行为,我想您将不得不简单地以不同的方式编写内容。 正如@goto指出的那样,您可以为user添加默认值,也可以自己检索用户,并完全删除此用例的自动参数转换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM