Php Symfony 5引发访问被拒绝异常

Php Symfony 5引发访问被拒绝异常,php,symfony,symfony-security,Php,Symfony,Symfony Security,我正在尝试使用多个验证器(针对每个用户角色)。在上一次操作之前,它们工作正常,将未经身份验证的用户重定向到URL/dashboard/进行登录,但对/dashboard的请求被抛出AccessDeniedHttpException: 这是我的security.yaml文件,其中包含所有防火墙: 安全性: 编码器: 应用程序\实体\用户: 算法:sha512 供应商: 应用程序\用户\提供商: 实体: 类别:应用程序\实体\用户 物业:电邮 防火墙: 开发人员: 模式:^/((探查器wdt)|

我正在尝试使用多个验证器(针对每个用户角色)。在上一次操作之前,它们工作正常,将未经身份验证的用户重定向到URL
/dashboard/
进行登录,但对
/dashboard
的请求被抛出
AccessDeniedHttpException

这是我的
security.yaml
文件,其中包含所有防火墙:

安全性:
编码器:
应用程序\实体\用户:
算法:sha512
供应商:
应用程序\用户\提供商:
实体:
类别:应用程序\实体\用户
物业:电邮
防火墙:
开发人员:
模式:^/((探查器wdt)| css |图像| js)/
安全性:错误
主要内容:
模式:^/管理员/
匿名:懒惰
提供者:应用程序\用户\提供者
警卫:
认证者:
-App\Security\AdminAuthenticator
注销:
路径:admin\u注销
专家:
模式:^/仪表板/
匿名:懒惰
提供者:应用程序\用户\提供者
警卫:
认证者:
-App\Security\ExpertAuthenticator
注销:
路径:专家退出
用户:
匿名:懒惰
提供者:应用程序\用户\提供者
警卫:
认证者:
-App\Security\UserAuthenticator
注销:
路径:用户\u注销
访问控制:
-{path:^/$,角色:是否经过身份验证\u匿名}
-{路径:^/admin/login,角色:是否经过身份验证\u匿名}
-{路径:^/admin,角色:ROLE_admin}
-{路径:^/ask,角色:角色\用户}
-{路径:^/dashboard/login,角色:是否通过匿名身份验证}
-{路径:^/仪表板,角色:角色\专家}
我认为没有必要在这里粘贴验证器,因为它是Symfony 5
make:auth
maker默认命令,我为所有三个验证器复制并粘贴了该命令,同时仅更改
public const LOGIN_ROUTE='user_LOGIN'
onAuthenticationSuccess()
函数的重定向响应路径

我还使用了默认的
SecurityController

namespace-App\Controller\Expert;
使用Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
使用Symfony\Component\HttpFoundation\Response;
使用Symfony\Component\Routing\Annotation\Route;
使用Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
/**
*类安全控制器
*@package-App\Controller\Expert
*@Route(“/dashboard”)
*/
类SecurityController扩展了AbstractController
{
/**
*@Route(“/login”,name=“expert\u login”)
*/
公共函数登录(AuthenticationUtils$AuthenticationUtils):响应
{
如果($this->getUser()){
返回$this->redirectToRoute('expert_index');
}
//如果存在登录错误,则获取登录错误
$error=$authenticationUtils->getLastAuthenticationError();
//用户最后输入的用户名
$lastUsername=$authenticationUtils->getLastUsername();
返回$this->render('expert/security/login.html.twig',['last_username'=>$lastUsername',error'=>$error]);
}
/**
*@Route(“/logout”,name=“expert\u logout”)
*/
公共功能注销()
{
$this->addFlash('success','Session closed');
返回$this->redirectToRoute('expert_index');
}
}
每当我访问
/admin
/admin/whatever
/ask
/ask/whatever
时,我都会被重定向到相应的登录表单(
/admin/login
/ask/dashboard

如果我不是从另一个验证器登录的,或者如果我是使用
角色\u专家登录的,我可以直接访问
/dashboard/login
。如果没有,我会得到提到的例外


好的,你看到发生了什么吗?

你应该把
-{path:^/$,roles:is\u AUTHENTICATED\u ANONYMOUSLY}
作为最后一个
访问控制
条目


这是因为Symfony在您编写时解析它(将其视为一个FIFO队列),并且由于
/
可以以匿名方式访问,关联的令牌将是匿名的(它不会尝试从会话或任何内容读取)。

您是否尝试删除“pattern:^/dashboard/”中的尾部斜杠?@Vyctorya,不,我没有,我以为它是正则表达式的一部分,但看起来不是。那可能有用。。。写一个答案。谢谢。现在,如果我转到
/dashboard/
我将被重定向到
/dashboard/login
专家
防火墙),但如果我转到
/dashboard
我将被重定向到
/login
用户
防火墙)…@Maramal您对
/dashboard
有什么期望?@Maramal可能
expert
main
防火墙不应该有尾部斜杠。是的,@Vyctorya就是这么说的。多亏我去掉了那些防火墙的尾部斜线,它才能工作。