Php Symfony2.1:找不到路径“的控制器”/登录“检查”;

Php Symfony2.1:找不到路径“的控制器”/登录“检查”;,php,symfony,symfony-2.1,Php,Symfony,Symfony 2.1,我使用symfony.com上的教程认证我的用户。通过一个简单的http身份验证,它工作得非常好 提交登录后,我收到此异常: 找不到路径“/login\u check”的控制器。也许你 忘记在路由配置中添加匹配的路由 在教程中我读到: 您不需要为/login\u check URL实现控制器,因为防火墙将自动捕获并处理提交到此URL的任何表单 我定义了路由并设置了防火墙设置: security.yml firewalls: dev: pattern: ^/(_(prof

我使用symfony.com上的教程认证我的用户。通过一个简单的http身份验证,它工作得非常好

提交登录后,我收到此异常:

找不到路径“/login\u check”的控制器。也许你 忘记在路由配置中添加匹配的路由

在教程中我读到:

您不需要为/login\u 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: /
login:
    pattern:   /login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /login_check
logout:
    pattern:   /logout
    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 }
login:
    pattern:   /backend/login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /backend/login_check
logout:
    pattern:   /backend/logout
routing.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: /
login:
    pattern:   /login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /login_check
logout:
    pattern:   /logout
    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 }
login:
    pattern:   /backend/login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /backend/login_check
logout:
    pattern:   /backend/logout

以下是我在实际项目中使用的示例代码:

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
我认为您的问题可能是由于您的/部分没有激活安全性(您的安全区域的模式是^/后端)

我找到了解决问题的方法 我在路径中添加了/backend前缀,删除了“匿名:~”行,并注释掉了backend的ACL

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: /
login:
    pattern:   /login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /login_check
logout:
    pattern:   /logout
    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 }
login:
    pattern:   /backend/login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /backend/login_check
logout:
    pattern:   /backend/logout
routing.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: /
login:
    pattern:   /login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /login_check
logout:
    pattern:   /logout
    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 }
login:
    pattern:   /backend/login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /backend/login_check
logout:
    pattern:   /backend/logout

您遇到的问题如下所述:

请参阅“避免常见陷阱”一节

  • 确保
    /login\u check
    位于防火墙后面 接下来,确保检查路径URL(例如/login\u检查)位于用于表单登录的防火墙后面(在本例中,单个防火墙匹配所有URL,包括/login\u检查)。如果/login\u check与任何防火墙都不匹配,您将收到无法找到路径“/login\u check”的控制器的异常
  • 在本例中,您的模式为安全路径指定/backend前缀。要工作,您的登录检查应该在同一防火墙后面


    因此,为了匹配您在防火墙中指定的模式,请将登录检查放在如下url路径上:/backend/login\u check

    这对我不起作用,我尝试了其他方法:

    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的解释更简单。 重要的是把登录检查路由放在防火墙内,让登录在防火墙外。有了一个好的模式,你就可以成功


    Max

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

    ....
     backend:
                pattern:        ^/*
    ....
     frontend:
                pattern:        ^/*
    
    您必须更改以下两个选项之一:

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

    登录表单是否仅允许访问后端?是的,这仅适用于后端userNice解决方案。我也有同样的问题。你应该发布你的解决方案作为答案,然后接受它。比它更容易找到。:)谢谢我试了一点,发现了一个解决方案(我编辑了我的初始帖子)很好。google groups post的Christophe Coevoit还表示:“只有当请求与防火墙模式匹配时,才会附加安全侦听器。因此,您需要使用表单/admin/logout的url才能在侦听器的范围内。”新手错误/gotcha:请注意,如果您有^/和^/admin,并且需要两个登录表单,更具体的模式(^/admin)必须在文件中更一般的模式^/之上,否则它将不会优先,因为^/仍然可以匹配^/admin-至少,这就是为什么我的应用程序最终实现了这一点,因为我需要两个登录表单,并且在security.yml中已经有了一个^/模式,我没有意识到这就是yml处理regex优先级的方式。