Symfony2.1: Não é possível encontrar o controlador para o caminho “/ login_check”

Eu usei o tutorial “Usando um formulário de login tradicional” da symfony.com para autenticar meus usuários. Com uma autenticação HTTP simples, funciona de forma excelente.

Depois que o login foi enviado, recebo esta Exceção:

Não é possível encontrar o controlador para o caminho “/ login_check”. Talvez você tenha esquecido de adicionar a rota correspondente em sua configuração de roteamento?

Bem, no tutorial eu li:

Você não precisará implementar um controlador para o URL / login_check, pois o firewall irá capturar e processar automaticamente qualquer formulário enviado a este URL.

Defini as rotas e configure as configurações do firewall:

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 

O problema que você está tendo é descrito aqui:

Veja http://symfony.com/doc/current/book/security.html , seção “Evitar armadilhas comuns”

  1. Certifique-se de que /login_check está atrás de um firewall Em seguida, verifique se o seu URL check_path (por exemplo / login_check) está por trás do firewall que você está usando para o login do formulário (neste exemplo, o firewall único corresponde a todos os URLs, incluindo / login_check). Se / login_check não corresponder a qualquer firewall, você receberá uma opção Unable to find the path para “/ login_check” exceção.

Neste exemplo, seu padrão especifica um prefixo de / backend para caminhos seguros. Para trabalhar, sua verificação de login deve estar por trás desse mesmo firewall.

Então, para combinar o padrão que você especificou em seu firewall, coloque login_check em um caminho de URL como este: / backend / login_check

Encontrei a solução para o meu problema

Eu adicionei o prefixo / backend aos meus caminhos, removi a linha ‘anônimo: ~’ e comentei a ACL para o backend.

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 

O problema também costuma acontecer quando você tem dois firewall com o mesmo padrão. Por exemplo:

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

Você deve alterar um dos dois da seguinte maneira:

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

Aqui está um código de exemplo que usei em um projeto de vida real:

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

No meu caso, apenas o / cmd / parte está protegido, a / admin / parte também está protegida, mas com segurança HTTP.

Talvez você deva tentar: 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: / 

e a partir de routing.yml:

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

Eu acho que seu problema pode vir do fato de que a segurança não está ativada em sua / parte (o padrão de sua área protegida é ^ / backend)

Isso não estava funcionando para mim e eu tento outra coisa:

 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 } 

Com a seguinte explicação, mais simples do que a explicação do zabojad. O importante é colocar a rota login_check dentro de um firewall e deixar o login fora. Com um padrão você pode ter sucesso.

Max