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
и объясняет проблему маршрута.