You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 13:02:58