代码之家  ›  专栏  ›  技术社区  ›  kockburn

错误:找不到路径“/login\u check”的控制器。路由配置错误。(LEXIKJWT身份验证)

  •  9
  • kockburn  · 技术社区  · 7 年前

    描述

    当我在做一件事的时候 对在上运行的my symfony服务器的请求 http://localhost:8000/api/admin/login_check 它返回所需的jwt令牌。

    但是,当我使用功能测试(使用 ./bin/phpunit )我得到以下错误:

    错误:找不到路径\“/api/admin/login\u check\”的控制器。路由配置错误。

    我还通过了 functional test docs .

    Bug Reproduced

    请毫不犹豫地克隆或转移此项目进行测试。有README.md解释安装步骤。

    我也能 reproduce the bug 通过克隆lexikjwtauthenticationbundle的创建者之一提供的工作示例。

    日志

    测试日志(错误)

    运行时发生 /bin/phpunit

    [2019-01-31 09:37:49] request.INFO: Matched route "api_admin_login_check". {"route":"api_admin_login_check","route_parameters":{"_route":"api_admin_login_check"},"request_uri":"http://localhost/api/admin/login_check","method":"POST"} []
    [2019-01-31 09:37:49] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
    [2019-01-31 09:37:49] request.WARNING: Unable to look for the controller as the "_controller" parameter is missing. [] []
    

    开发日志(成功)

    在执行curl或postman请求时发生

    [2019-01-29 21:16:26] request.INFO: Matched route "api_admin_login_check". {"route":"api_admin_login_check","route_parameters":{"_route":"api_admin_login_check"},"request_uri":"https://localhost:8000/api/admin/login_check","method":"POST"} []
    [2019-01-29 21:16:27] doctrine.DEBUG: SELECT t0.id AS id_1, t0.email AS email_2, t0.password AS password_3 FROM admin t0 WHERE t0.email = ? LIMIT 1 ["email@test.com"] []
    [2019-01-29 21:16:27] security.INFO: User has been authenticated successfully. {"username":null} []
    

    相关代码:

        public function testLogin(){
    
            $client = static::createClient();
            $client->request('POST', '/api/admin/login_check', [], [],
                [
                    'Content-Type' => 'application/json',
                    'Accept' => 'application/json'
                ],
                json_encode([
                    'email' => 'email@test.com',
                    'password' => 'qwerty123'
                ])
            );
    
            $this->assertEquals(200, $client->getResponse()->getStatusCode());
    
        }
    

    路线:

    # Admin Routes
    api_admin_login_check:
        path: /api/admin/login_check
        methods:  [POST]
    

    安全:

    security:
    
    # more configs here
    
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
    
            login_admin:
                pattern: ^/api/admin/login
                stateless: true
                anonymous: true
                json_login:
                    username_path: email
                    provider: app_admin_provider
                    check_path: /api/admin/login_check
                    success_handler: lexik_jwt_authentication.handler.authentication_success
                    failure_handler: lexik_jwt_authentication.handler.authentication_failure
    
            admin_api:
                pattern: ^/api/admin
                stateless: true
                provider: app_admin_provider
                guard:
                    authenticators:
                        - lexik_jwt_authentication.jwt_token_authenticator
    
        access_control:
            - { path: ^/api/admin/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/api/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
            - { path: ^/api/admin, roles: ROLE_ADMIN }
            - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    

    问题

    为什么会有 404 route not found 对于 /api/admin/login_check 功能测试过程中的路线,但与curl和postman配合良好?

    Github #610

    2 回复  |  直到 7 年前
        1
  •  4
  •   Sergey Poltaranin    7 年前

    你的名字错了 content-type 它应该有名字 CONTENT_TYPE .

    $client->request(
       'POST',
       '/login_check',
       ['_username' => 'lexik', '_password' => 'dummy'],
       [],
       ['CONTENT_TYPE' => 'application/json']
    );
    

    vendor/symfony/security/Http/Firewall/UsernamePasswordJsonAuthenticationListener.php::handle

    if (false === strpos($request->getRequestFormat(), 'json')
       && false === strpos($request->getContentType(), 'json')
    ) {
      return;
    }
    

        2
  •  2
  •   Community Mohan Dere    5 年前

    确保 /login_check 在防火墙后面 路径必须与防火墙模式匹配。 改变这个

    -{path:^/您的登录路径,角色:已\u匿名验证,\u需要\u通道:https}

    访问控制:

    -{path:^/login$的路由,角色:经过匿名身份验证,\u需要\u通道:https}

    我试过了:P

    推荐文章