Я пытаюсь настроить брандмауэр и внешнюю систему брандмауэра в 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. Возможно, вы забыли добавить соответствующий маршрут в свою конфигурацию маршрутизации
Есть идеи? 🙂
Это решение я использую в своих проектах. Надеюсь, что это будет работать и с двумя формами входа.
Добавить заглушку для контроллера
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')); }
Ваше картографирование 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-адреса.
Может быть, не плохо, чтобы удалить «/», поэтому у вас есть только:
login_path: admin/login check_path: admin/login_check default_target_path: admin
И пусть атрибут шаблона будет таким, каким он есть. На самом деле, как выглядит мой security.yml
и объясняет проблему маршрута.