Check_path не найден с несколькими брандмауэрами в Symfony 2

Я пытаюсь настроить брандмауэр и внешнюю систему брандмауэра в Symfony 2. У меня есть две формы входа, одна для интерфейса и еще одна для панели управления администратора. Различные поставщики и так далее. Моя конфигурация выглядит так:

security:
    firewalls:
        backend:
            pattern:    ^/admin
            anonymous:  true
            provider:   admin_users
            form_login:
                login_path: /admin/login
                check_path: /admin/login_check
                default_target_path: /admin

        secured_area:
            pattern:    ^/
            provider:   normal_users
            anonymous:  true
            form_login: ~

    access_control:
        - { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }

И мой routing.yml:

login:
    path:     /login
    defaults: { _controller: MyFrontendBundle:Default:login }

login_check:
    path:     /login_check

admin_login:
    path:     /admin/login
    defaults: { _controller: MyBackendBundle:Default:login }

admin_login_check:
    path:     /admin/login_check

Похоже, но у меня есть следующая ошибка: Не удалось найти контроллер для пути "/admin/login_check". Возможно, вы забыли добавить соответствующий маршрут в конфигурацию маршрутизации

Любые идеи?:)

Ответ 1

Это решение, которое я использую в своих проектах. Надеюсь, что это будет работать и с двумя форматами входа.

Добавить заглушку для контроллера

admin_login_check:
    path:     /admin/login_check
    defaults: { _controller: AcmeDemoBundle:Default:adminLoginCheck }

Действие заглушки. Это действие никогда не будет достигнуто, но ошибка "контроллер не найден" исчезнет.

// src/Acme/DemoBundle/Controller/DefaultController.php
public function adminLoginCheckAction()
{
    return $this->redirect($this->generateUrl('admin_login'));
}

Ответ 2

Ваше сопоставление URL-адресов кажется правильным,

Проверьте, есть ли у вас правильный check_path (/admin/login_check) в контроллере администратора.

или

Попробуйте добавить login_check под access_control, как показано ниже,

- { path: ^/admin/login_check, roles: IS_AUTHENTICATED_ANONYMOUSLY }

У меня была аналогичная проблема, когда я пытался использовать брандмауэры с перекрывающимися шаблонами URL. У первого брандмауэра не было check_path (я использовал http_basic в первом брандмауэре), а во втором firwall я использовал form_login. Мне пришлось менять URL-адреса.

Ответ 3

Возможно, не стоит просто удалять "/", поэтому у вас есть только:

login_path: admin/login
check_path: admin/login_check
default_target_path: admin

И пусть атрибут шаблона будет таким, каким он есть. На самом деле, как выглядит мой security.yml и объясняет проблему маршрута.