14

我使用 symfony.com 的“使用传统登录表单”教程来验证我的用户。使用简单的 http 身份验证,效果很好。

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

找不到路径“/login_check”的控制器。也许您忘记在路由配置中添加匹配的路由?

好吧,在我阅读的教程中:

您不需要为 /login_check URL 实现控制器,因为防火墙会自动捕获并处理提交到此 URL 的任何表单。

我定义了路由并设置了防火墙设置:

安全.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: /

路由.yml

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

5 回答 5

18

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

请参阅http://symfony.com/doc/current/book/security.html,“避免常见陷阱”部分

  1. 确保/login_check位于防火墙后面 接下来,确保您的 check_path URL(例如 /login_check)位于您用于表单登录的防火墙后面(在此示例中,单个防火墙匹配所有 URL,包括 /login_check)。如果 /login_check 不匹配任何防火墙,您将收到 Unable to find the controller for path "/login_check" 异常。

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

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

于 2013-01-08T07:52:34.203 回答
8

我找到了解决问题的方法

我在路径中添加了 /backend 前缀,删除了“匿名:~”行并注释掉了后端的 ACL。

安全.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 }

路由.yml

login:
    pattern:   /backend/login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /backend/login_check
logout:
    pattern:   /backend/logout
于 2013-01-04T12:05:47.533 回答
1

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

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

您必须按以下方式更改两者之一:

....
 backend:
            pattern:        ^/(administrador|backend)/*
....
frontend:
            pattern:        ^/*
于 2014-02-23T18:51:41.767 回答
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/ 部分是安全的, /admin/ 部分也是安全的,但具有 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)

于 2012-09-13T15:49:39.893 回答
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 路由放在防火墙里面,让登录在外面。使用 or 模式,您可以成功。

最大限度

于 2013-03-12T22:01:38.157 回答