Я использовал учебник «Использование традиционной формы входа в систему» от symfony.com для аутентификации моих пользователей. С помощью простого http auth он отлично работает.
После того как логин был отправлен, я получаю это исключение:
Не удалось найти контроллер для пути / login_check. Возможно, вы забыли добавить соответствующий маршрут в свою конфигурацию маршрутизации?
Ну, в учебнике я читал:
Вам не нужно будет внедрять контроллер для URL / login_check, поскольку брандмауэр автоматически поймает и обработает любую форму, представленную на этот URL.
- Недопустимое исключение аргумента при генерации объектов из существующей базы данных
- Symfony 2.1 Security Sub Subdomain
- Группы опций в форме формы объекта symfony2
- Как избежать сообщения об отмене изменений композитора
- Контейнер Dependecy Injection не работает в Fixtures после обновления symfony 2.0 до 2.1 / 2.2
Я определил маршруты и установил настройки брандмауэра:
security.yml
firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false backend: pattern: ^/backend anonymous: ~ form_login: provider: entity login_path: /login check_path: /login_check #use_forward: true logout: path: /logout target: /
routing.yml
login: pattern: /login defaults: { _controller: VitaSecurityBundle:Default:login } login_check: pattern: /login_check logout: pattern: /logout
Проблема, с которой вы сталкиваетесь, описана здесь:
См. http://symfony.com/doc/current/book/security.html , раздел «Избегайте общих ошибок»
- Убедитесь, что
/login_check
находится за брандмауэром. Затем убедитесь, что ваш URL-адрес check_path (например, / login_check) находится за брандмауэром, который вы используете для входа в форму (в этом примере один брандмауэр соответствует всем URL-адресам, включая / login_check). Если / login_check не соответствует любому брандмауэру, вы получите сообщение «Невозможно найти контроллер для исключения пути» / login_check.
В этом примере ваш шаблон указывает префикс / backend для защищенных путей. Чтобы работать, ваша проверка входа должна быть за этим же брандмауэром.
Итак, чтобы соответствовать шаблону, который вы указали в своем брандмауэре, поместите login_check на путь URL-адреса следующим образом: / backend / login_check
Я добавил префикс / backend к моим путям, удалил строку «anonymous: ~» и закомментировал ACL для бэкэнд.
security.yml
firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false login_firewall: pattern: ^/backend/login$ anonymous: ~ backend: pattern: ^/backend form_login: provider: entity login_path: /backend/login check_path: /backend/login_check #use_forward: true logout: path: /backend/logout target: / access_control: #- { path: ^/backend, roles: ROLE_USER }
routing.yml
login: pattern: /backend/login defaults: { _controller: VitaSecurityBundle:Default:login } login_check: pattern: /backend/login_check logout: pattern: /backend/logout
Проблема также имеет место, когда у вас есть два брандмауэра с одинаковым шаблоном. Например:
.... backend: pattern: ^/* .... frontend: pattern: ^/*
Вы должны изменить один из следующих:
.... backend: pattern: ^/(administrador|backend)/* .... frontend: pattern: ^/*
Вот пример кода, который я использовал в реальном проекте:
firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false secured_area: pattern: ^/cmd anonymous: ~ form_login: check_path: /cmd/login_check login_path: /cmd/login remember_me: always_remember_me: true key: "%secret%" path: /cmd domain: ~ # Defaults to the current domain from $_SERVER logout: path: /cmd/logout target: / admin: pattern: ^/admin http_basic: realm: "Administration" free_area: pattern: ^/ anonymous: ~
В моем случае защищена только часть / cmd /, часть / admin / part также защищена, но с защитой HTTP.
Возможно, вам стоит попробовать: security.yml
firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false backend: pattern: ^/backend anonymous: ~ form_login: provider: entity login_path: /backend/login check_path: /backend/login_check #use_forward: true logout: path: /backend/logout target: /
и с точки зрения маршрутизации.yml:
login: pattern: /backend/login defaults: { _controller: VitaSecurityBundle:Default:login } login_check: pattern: /backend/login_check logout: pattern: /backend/logout
Я думаю, что ваша проблема может возникнуть из-за того, что безопасность не активирована в вашей / части (шаблон вашей защищенной области – ^ / backend)
Это не работало для меня, и я пробую что-то еще:
firewalls: dev: pattern: ^/(_profiler|_wdt|css|js) security: false login: pattern: ^/login$ security: false secured_area: pattern: /(admin/.*|login_check) provider: in_memory form_login: check_path: /login_check login_path: /login default_target_path: /admin always_use_default_target_path: true logout: path: /logout target: / access_control: - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/, roles: ROLE_ADMIN }
Со следующим объяснением, проще, чем объяснение от zabojad. Важно поставить маршрут login_check внутри брандмауэра и разрешить вход на внешний сервер. С помощью или шаблона вы можете добиться успеха.
Максимум