检查用户是否在ExceptionController内通过了身份验证

时间:2019-12-19 18:20:02

标签: php symfony authentication

我有一个自定义的ExceptionController来抛出自定义的错误页面,它可以正常工作,它根据http错误代码显示了我的自定义页面,这带给我的是如果您未在系统中进行身份验证并尝试访问到一种受保护的路由,它将抛出404而不是401。

我确实说过,这是一种受保护的路线,因为:

#security.yaml

access_control:
    - { path: ^\/admin, roles: ROLE_ATA_ALL }

我希望保护“ / admin”后面的每条路由,并要求它们具有“ ROLE_ATA_ALL”才能访问它。

有一个例子:

说我实际上已通过身份验证时转到“ / admin / NoRegisteredRoute”,我期望的是显示我的404页面,但是如果您尝试未经身份验证访问同一路由,则它应该显示401页,但无论如何始终显示404页。 access_control工作不正常,因此我决定尝试检查用户是否直接在我的控制器中通过了身份验证,所以我这样做:

public function showAction(Request $request, FlattenException $exception, ParameterBagInterface $params, 
DebugLoggerInterface $logger = null) {
        $this->params = $params;
        $hasRole = $this->security->denyUnlessHasRole("ATA", "ALL"); // This function returns whether the current user has the ATA_ALL role

        // ...
    }

有了该代码,当我尝试访问未注册的路由时,我没有看到任何自定义页面错误,而是得到了一个表示以下内容的symfony:

  

令牌存储区不包含身份验证令牌。一种可能的原因可能是没有为此URL配置防火墙。

但是错误所要求的不是配置了防火墙的{ path: ^\/admin, roles: ROLE_ATA_ALL }吗?

这有点奇怪,因为如果我执行身份验证过程,然后转到未注册的路由,我的调试工具栏上说没有经过身份验证的用户,但是当我转到已注册用户时,实际上我会按原样显示经过身份验证的用户。

我只想知道用户是否在showAction函数中通过了身份验证,因此我可以在必要时抛出401

1 个答案:

答案 0 :(得分:1)

Symfony将首先尝试找到路线,因此,如果找不到该路线,则会抛出404异常。如果存在,它将进行必要的身份验证,如果用户未通过身份验证,则会显示401。

您可以在一个控制器中将通配路径设置为/ admin / {params}。只需确保将其添加到路线的末尾即可。