Как работает маршрут входа check_path без контроллера/действия по умолчанию?

Я работаю над проектом symfony 2.3 со следующим кодом маршрутизации

just2_frontend_logincheck:
    pattern:   /login_check

У него нет

defaults:{ _controller: testBundle:User:login }

Но это работает. Но я не знаю, как работает маршрутизация. Является ли это возможным? Посоветуйте, пожалуйста, про маршрутизацию.


person saravanan    schedule 01.07.2013    source источник


Ответы (1)


Маршрут/путь check_path используется ваш брандмауэр для перехвата запросов на вход.

Действие этого маршрута никогда не используется. Это маршрут / URL-адрес, на который отправляется ваша форма входа, и запрос должен обрабатываться службой поставщика вашего брандмауэра.

Если выполняется действие маршрута check_path, значит, что-то не так с брандмауэром (запрос не обрабатывается вашим брандмауэром).

Как вы можете видеть здесь check_path FOSUserBundle маршрутизируется на SecurityController::checkAction и просто бросает RuntimeException.

Конфигурацию check_path можно найти в app/config/security.yml под security.firewalls.<firewallname>.form_login.check_path.

Это может быть либо шаблон, например /login_check, либо, как в вашем случае, имя маршрута, например just2_frontend_logincheck, но основного действия нет.

security:
    providers:
         your_provider_name: your_provider_service  # authentication provider
         # ...

    firewalls:                                 # Required
        your_firewall_name:
            # ...

            provider: your_provider_name
            form_login:              
                check_path: /login_check       # submit the login form here
                                               # in your case a route name:
                                               # just2_frontend_logincheck

Под капотом symfony вызывает метод authenticate() службы your_provider_service для проверки предоставленных учетных данных.

Вы можете найти класс, используемый в качестве службы-поставщика, используя:

app/console debug:container --show-private your_provider_service 
person Nicolai Fröhlich    schedule 01.07.2013
comment
С чего начать отладку, если маршрут не обрабатывается брандмауэром? - person hchr; 29.08.2016
comment
@hchr - начните проверять, существует ли маршрут check_path, отладив маршрутизатор примерно так: app/console debug:router | grep -i <route_name_or_path> . Затем закомментируйте/отключите все брандмауэры, кроме одного, в разделе security.firewalls и сократите конфигурацию этого единственного брандмауэра до минимума. Мой ответ показывает минимальный пример, которого должно быть достаточно, чтобы поймать запрос на /login_check - person Nicolai Fröhlich; 29.08.2016