Подтвердить что ты не робот

Symfony2.1: невозможно найти контроллер для пути "/login_check"

Я использовал "Использование традиционной формы входа" в учебник symfony.com для аутентификации моих пользователей. С помощью простого http auth он отлично работает.

После отправки логина я получаю это исключение:

Невозможно найти контроллер для пути /login _check. Может быть, вы забыли добавить соответствующий маршрут в вашу конфигурацию маршрутизации?

Ну, в учебнике я читал:

Вам не нужно будет внедрять контроллер для URL/login_check, поскольку брандмауэр автоматически поймает и обработает любую форму, представленную на этот URL.

Я определил маршруты и установил настройки брандмауэра:

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
4b9b3361

Ответ 1

Я нашел решение своей проблемы

Я добавил префикс /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

Ответ 2

Проблема, с которой вы сталкиваетесь, описана здесь:

См. 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

Ответ 3

Проблема также имеет место, когда у вас есть два брандмауэра с одинаковым шаблоном. Например:

....
 backend:
            pattern:        ^/*
....
 frontend:
            pattern:        ^/*

Вы должны изменить один из следующих вариантов:

....
 backend:
            pattern:        ^/(administrador|backend)/*
....
frontend:
            pattern:        ^/*

Ответ 4

Вот пример кода, который я использовал в реальном проекте:

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: /

и с точки зрения routing.yml:

login:
    pattern:   /backend/login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /backend/login_check
logout:
    pattern:   /backend/logout

Я думаю, что ваша проблема может возникнуть из-за того, что безопасность не активирована в вашей/части (шаблон вашей защищенной области - ^/backend)

Ответ 5

Это не работало для меня, и я пробую что-то еще:

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 внутри брандмауэра и разрешить вход на внешний сервер. С помощью шаблона или шаблона вы можете добиться успеха.

Max