首页 > 解决方案 > 检查用户是否在 ExceptionController 中进行了身份验证

问题描述

我有一个自定义的 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

标签: phpsymfonyauthentication

解决方案


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

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


推荐阅读