Symfony 4登录后跳转回登录页,匿名令牌问题排查
搞定Symfony 4登录跳回、匿名令牌的问题
从你说的情况和给出的security.yaml片段来看,十有八九是用户提供者配置不全或者防火墙没正确关联到你的数据库用户源,咱一步步捋:
1. 补全数据库用户提供者配置
你给的db_provider配置没写完,正确的实体用户提供者得指定完整的实体类和用来识别用户的字段(比如邮箱或者用户名):
providers: # 要是不用内存用户,直接把in_memory删掉就行 db_provider: entity: class: App\Entity\User property: email # 换成你登录用的字段,比如username也可以
这里配置不全的话,Symfony根本没法从数据库里加载用户,自然就一直是匿名状态。
2. 让防火墙用对用户提供者
检查你的防火墙配置,一定要让main(或者你用来处理登录的防火墙)的provider指向db_provider,别用默认的in_memory:
firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false main: anonymous: true provider: db_provider # 这里必须指定你的数据库用户提供者! form_login: login_path: login check_path: login # 要是想登录后跳回之前的页面,可以加下面这俩配置 always_use_default_target_path: false default_target_path: / logout: path: logout target: /
要是防火墙没指定provider,默认会用in_memory,但你又没配置内存用户,那肯定验证失败,跳回登录页。
3. 确认密码是正确加密的
你配置了bcrypt加密,那创建用户的时候,密码必须用Symfony的密码编码器加密后再存数据库,不能直接存明文。比如在控制器或者命令里创建用户时:
$encoder = $this->get('security.password_encoder'); $encodedPassword = $encoder->encodePassword($user, '用户输入的明文密码'); $user->setPassword($encodedPassword);
密码没加密的话,验证肯定过不了,自然登录失败。
4. 检查登录表单的字段名
确保登录表单的用户名、密码字段的name属性和Symfony默认的一致,或者在form_login里明确指定:
form_login: login_path: login check_path: login username_parameter: _username # 对应你表单里用户名输入框的name属性 password_parameter: _password # 对应密码输入框的name属性
字段名不匹配的话,Symfony拿不到登录凭证,验证直接失败。
5. 确保登录页是公开可访问的
在access_control里配置,让登录路由不需要认证:
access_control: - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/, roles: ROLE_USER }
要是登录页被要求必须认证,就会陷入循环跳转,一直回到登录页。
你先把security.yaml的完整配置补好,重点查上面这几个点,尤其是用户提供者和防火墙的关联,这是最常见的坑。
内容的提问来源于stack exchange,提问作者Giedrius Lukošiūnas
相关产品推荐
相关产品推荐

