让@Security注释优先于ParamConverter

时间:2018-02-15 15:21:13

标签: php symfony

我的行动如下:

/**
 * @Security("is_granted('ROLE_USER_EDITOR')")
 * @Route("/{email}")
 * @Method("GET")
 */
public function getAction(User $user)

问题是ParamConverter优先于@Security注释。

如果我未获得授权并提供现有电子邮件,我会被重定向到登录页面。这是预期和正确的 但是当我未获得授权并提供不存在的电子邮件时,我会收到404说无法找到User

我认为授权检查比参数转换更重要 如何让Security注释优先于Param Converter?

2 个答案:

答案 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@EntityCONTROLLER内核事件subscribing @Security@IsGranted注释为subscribing CONTROLLER_ARGUMENTS内核事件dispatched after CONTROLLER

  

一旦解析了控制器参数,就会发生CONTROLLER_ARGUMENTS事件。

因此,@Security将始终在@ParamConverter之后执行,原因是他们订阅了the order of the events。正如我在评论中所说,需要执行此执行顺序以允许在安全检查中使用已转换的参数(如所示here)。

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