php - 检查用户是否在 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
解决方案
Symfony 将首先尝试查找路由,因此如果找不到,则会抛出 404 异常。如果存在,那么它将进行必要的身份验证,如果用户未通过身份验证,则显示 401。
您可以在其中一个控制器中将包罗万象的路由设置为 /admin/{params}。只需确保将其添加到路线的末尾即可。
推荐阅读
- php - php mysql 一对多关系访问数据成一行
- javascript - 在 Postman 中折叠 JSON 响应中的特定数组
- spartacus-storefront - 重定向到新的内容页面 如果 searchResult.products === 0
- r - 在数据框的一列中找到元素的每个组合,它们加起来等于 R 中的给定总和
- bash - 从带有档案路径的文本文件中解压缩文件
- python - 为什么一个变量(随机数)的行为就像一个“发电机”
- python - 创建循环移位数组的数组/张量
- google-apps-script - 将 Google 相册中的 HEIC 文件下载为 JPG
- database - 是否有(内置)方法可以使用 ArangoDB 在边缘上创建唯一约束?
- r - 如何从半聚合表中获取表的汇总统计信息?R