Symfony2.1:无法找到路径“/ login_check”的控制器

时间:2012-09-13 15:41:05

标签: php symfony symfony-2.1

我使用symfony.com的"Using a traditional login form"教程来验证我的用户身份。使用简单的http auth,效果很好。

提交登录后,我得到了这个例外:

  

无法找到路径“/ login_check”的控制器。可能是你   忘了在路由配置中添加匹配路由了吗?

好吧,在教程中我读到了:

  

您不需要为/ login_check URL实现控制器,因为防火墙将自动捕获并处理提交到此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

5 个答案:

答案 0 :(得分:18)

此处描述了您遇到的问题:

参见http://symfony.com/doc/current/book/security.html,“避免常见陷阱”一节

  
      
  1. 确保/login_check位于防火墙后面   接下来,确保您的check_path URL(例如/ login_check)位于您用于表单登录的防火墙后面(在此示例中,单个防火墙匹配所有URL,包括/ login_check)。如果/ login_check与任何防火墙都不匹配,您将收到无法找到路径“/ login_check”异常的控制器。
  2.   

在此示例中,您的模式为安全路径指定/ backend的前缀。为了工作,您的登录检查应该在同一个防火墙后面。

因此,要匹配您在防火墙中指定的模式,请将login_check放在url路径上,如下所示:/ backend / login_check

答案 1 :(得分:8)

我找到了解决问题的方法

我在路径中添加了/ 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 :(得分:1)

当您有两个具有相同模式的防火墙时,问题也会发生。例如:

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

您必须按如下方式更改其中一个:

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

答案 3 :(得分:0)

以下是我在现实生活中使用的示例代码:

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 / part是安全的,/ 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

我认为你的问题可能来自你/ part中没有激活安全性的事实(你的安全区域的模式是^ / backend)

答案 4 :(得分:0)

这不适合我,我尝试了别的东西:

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路由放在防火墙内并让登录到外面。使用或模式,您可以成功。

最高