API Platform中/api/login_check路由配置失效,提示无法找到对应控制器
API Platform中/api/login_check路由配置失效,提示无法找到对应控制器
我来帮你排查这个问题!你遇到的「Unable to find the controller for path "/api/login_check"」错误,大概率是防火墙顺序、路由匹配优先级的问题,咱们一步步来解决:
1. 核心问题:防火墙顺序错误(最可能的原因)
Symfony的防火墙是从上到下按顺序匹配请求的,你当前的security.yaml里,main防火墙在login防火墙前面,而main没有指定pattern,默认会匹配所有请求——这就导致你的/api/login_check请求先被main防火墙拦截,但main里并没有配置处理登录校验的逻辑,自然会提示找不到控制器。
你需要把更具体的防火墙(login、api)放在main前面,修改后的firewalls区块如下:
firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false # 先放匹配特定路径的login防火墙 login: pattern: ^/api/login stateless: true json_login: check_path: /api/login_check success_handler: lexik_jwt_authentication.handler.authentication_success failure_handler: lexik_jwt_authentication.handler.authentication_failure # 再放api接口的JWT防火墙 api: pattern: ^/api stateless: true jwt: ~ # 最后放通用的main防火墙 main: lazy: true provider: app_user_provider # 保留你原来的其他配置(比如switch_user)
2. 验证路由是否正确加载
运行Symfony的路由调试命令,确认api_login_check路由存在:
php bin/console debug:router
如果路由正常,你会看到类似这样的输出:
api_login_check ANY ANY ANY /api/login_check
如果这条路由不存在,检查你的routes.yaml缩进是否正确(YAML对缩进非常敏感),正确的格式应该是:
controllers: resource: path: ../src/Controller/ namespace: App\Controller type: attribute # 注意:api_login_check要和controllers同级,不能缩进在controllers内部 api_login_check: path: /api/login_check
3. 辅助检查:确保JWT Bundle配置完整
确认你已经正确安装并配置了lexik/jwt-authentication-bundle:
- 生成了JWT密钥对(运行过
php bin/console lexik:jwt:generate-keypair) .env文件里配置了JWT_SECRET_KEY、JWT_PUBLIC_KEY、JWT_PASSPHRASE参数
4. 可选:补充access_control规则
为了确保登录路径允许匿名访问,可以在access_control里添加规则:
access_control: # 允许所有用户访问登录相关路径 - { path: ^/api/login, roles: PUBLIC_ACCESS } # 其他API接口需要完整认证 - { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
(PUBLIC_ACCESS是Symfony 6.2+的匿名角色,低版本可以用IS_AUTHENTICATED_ANONYMOUSLY)
按照上面的步骤调整后,再测试/api/login_check的请求,应该就能正常触发JWT的登录校验逻辑了!
备注:内容来源于stack exchange,提问作者Nabil SI-SMAIL
相关产品推荐
相关产品推荐

