Ошибка: Не удалось найти контроллер для пути «/login_check». Маршрут настроен неправильно. (Аутентификация LexikJWTA)

Описание

Когда я делаю запрос нормальный к моему серверу Symfony, работающему на http://localhost:8000/api/admin/login_check, он возвращает нужный токен jwt.

Однако, когда я делаю это с функциональными тестами (с ./bin/phpunit), я получаю следующую ошибку:

Error: Unable to find the controller for path \"/api/admin/login_check\". The route is wrongly configured.

Я тоже прошел документы функционального тестирования.

Ошибка воспроизведена

Не стесняйтесь клонировать или разветвлять этот проект для тестирования. Существует README.md, объясняющий шаги установки.

Я также смог получить воспроизвести ошибку, клонировав рабочий пример, предоставленный одним из создателей пакета 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 protected]"] []
[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 protected]',
                '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?

Гитхаб #610

Вы смотрели журнал?

Imanali Mamadiev 28.01.2019 18:44
var/logs/dev.log
Imanali Mamadiev 28.01.2019 18:46

в app/logs/dev.log

Imanali Mamadiev 28.01.2019 18:57

Вы отправляете регистрационные данные на проверку входа? Это не имеет никакого смысла. Вы должны отправить данные на URL-адрес регистрации вместе с токеном авторизации. Если вы хотите сначала получить токен, отправьте _username и _password на указанную проверку входа.

emix 28.01.2019 20:02

@emix нет, я отправляю данные для входа в файл login_check. У меня уже есть пользователь, созданный в базе данных. Он отлично работает, когда я скручиваюсь и использую почтальона для получения токена.

kemicofa ghost 28.01.2019 20:08

Электронная почта и обычный_пароль не кажутся действительными полезными данными аутентификации для проверки входа: github.com/lexik/LexikJWTAuthenticationBundle/blob/master/…

emix 28.01.2019 20:11

@эмикс да ! Ты прав. Это была опечатка. Это то, что я уже изменил, но не решает проблему.

kemicofa ghost 28.01.2019 20:11

@ImanaliMamadiev Я добавил зарегистрированную информацию.

kemicofa ghost 31.01.2019 14:00

другой здесь "request_uri":"http://localhost/api/admin/login_check","meth‌​od":"POST""request_uri":"https://localhost:8000/api/admin/login_check"‌​,"method":"POST"

Imanali Mamadiev 31.01.2019 20:13

@imanaliMamadiev да, но это нормально. Все тестовые запросы делают одно и то же. И другие тесты у меня работают.

kemicofa ghost 31.01.2019 20:33

Вы проверили эту конфигурацию, включая _controller stackoverflow.com/questions/24424759/…

calm 08.02.2019 13:20

@спокойно, я только что проверил. Похоже, за исключением того, что это для производственного режима и использует symfony2 и без ответов :/. Кроме того, он не указывает, в чем может быть проблема.

kemicofa ghost 08.02.2019 13:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
11
12
2 246
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Убедитесь, что /login_check защищен брандмауэром. Путь /login_check должен соответствовать шаблону брандмауэра. изменить это

контроль доступа:

- {путь: ^/ваш-маршрут-для-логина, роли: IS_AUTHENTICATED_ANONYMOUSLY, required_channel: https}

к

контроль доступа:

- {путь: ^/your-route-for-login$, роли: IS_AUTHENTICATED_ANONYMOUSLY, required_channel: https}

я пробовал :Р

На самом деле это совсем не решает проблему. Он выдает отказ в доступе еще до того, как попытается получить доступ к контроллеру.

kemicofa ghost 05.02.2019 17:38

Вы добавили его как в шаблоны брандмауэра, так и в путь .. во-вторых, stackoverflow.com/questions/12409998/…. проверьте это для своего решения, я думаю, это подойдет ... просто пытаюсь помочь :)

Vaibhav Chauhan 05.02.2019 23:56

Проблема не в том, что он не может найти правильный маршрут, а в том, что он не может найти «контроллер». Мой проект работает нормально, но не работает, когда он тестируется с помощью phpunit. Я бы предположил, что это проблема с тестовой средой и прослушивателем lexikjwtauthentication.

kemicofa ghost 06.02.2019 00:06
Ответ принят как подходящий

У вас неправильное имя для заголовка content-type в вашем тестовом запросе. Он должен иметь имя CONTENT_TYPE.

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

Проверка здесь: поставщик/symfony/безопасность/Http/брандмауэр/имя пользователяPasswordJsonAuthenticationListener.php::handle

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

По крайней мере, это помогает в вашем коде с «воспроизведением ошибки».

Спасибо, не верится, что это было.

kemicofa ghost 12.02.2019 12:13

После нескольких бессонных ночей у меня сработал следующий сценарий.

Сначала у меня были проблемы с подключением к Postman, щелкнуть заголовок и изменить его на Application/JSON было недостаточно, так как я продолжаю получать ошибки ORM/Doctrine. что сработало для меня, так это то, что я использовал устаревшие функции в одном из моих классов PHP.

Я просто зашел в свой лог-файл Var/log/dev.log и нашел эту ошибку:

php.CRITICAL: Uncaught Error: невозможно назначить Doctrine\ORM\PersistentCollection свойству Guess\Domain\Player\Player::$guesses типа Doctrine\Common\Collections\ArrayCollection

Дальнейшие исследования показывают, что я использовал объект ArrayCollecton, который устарел как Collection, поэтому измените ArrayCollection на просто Collection, включая методы получения и установки, и повторите попытку.

Это сработало для меня сейчас, и я так счастлив.

Ссылка: Ошибка назначения доктрины: невозможно назначить Doctrine\ORM\PersistentCollection свойству

Это может иметь большое значение, чтобы помочь кому-то в ближайшем будущем.

Другие вопросы по теме