security.yml 一直要求 check_path 已经提供了

security.yml keeps asking for check_path which has already been supplied

所以我有一个应用程序,它使用 FOSUserbundle 进行用户管理,使用 HWIOAuthBundle 进行 OAuth 身份验证,目前只有 Facebook。

当我想通过 FOSUserBundle 模板提供的登录表单登录时,我一直收到此错误。

You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.

但是当我使用 facebook 按钮登录时,我没有收到这个错误。

下面是我的security.yml文件

security:

    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    # Roles being defined
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    # http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
    providers:
        in_memory:
            memory: ~

        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        # disables authentication for assets and the profiler, adapt it according to your needs

        secured_area:
            anonymous: ~
            logout: ~
            oauth:
                resource_owners:
                    facebook: "/login/check-facebook"
                login_path:        /login
                use_forward:       false
                failure_path:      /login
                oauth_user_provider:
                    service: my.custom.user_provider
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: .*
            provider: fos_userbundle
            form_login:
                login_path: fos_user_security_login
                check_path: fos_user_security_check
                use_forward: false
                failure_path: null
            logout:
                 path:   fos_user_security_logout
                 target: /
            anonymous:    true
            http_basic:
              realm: "Reviews"
       # main:

            # activate different ways to authenticate

            # http_basic: ~
            # http://symfony.com/doc/current/book/security.html#a-configuring-how-your-users-will-authenticate

            # form_login: ~
            # http://symfony.com/doc/current/cookbook/security/form_login_setup.html

    # Access controls
    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/view, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }
        - { path: ^/create, role: ROLE_USER}
        - { path: ^/edit, role: ROLE_USER}
        - { path: ^/delete, role: ROLE_USER}

我猜你的表单登录被 secured_area 防火墙拦截了。

您有 3 个防火墙:

  • secured_area 匹配所有内容,因为默认模式是 /*
  • dev 可能从未达到,因为 secured_area 已经匹配
  • main 匹配所有(因为模式),但从未达到

Symfony 将使用第一个匹配的防火墙进行身份验证,并且由于 secured_area 没有为登录表单配置它不会工作。您可以合并两个防火墙(基本上将 oauth 部分复制到 main,但单独的登录机制可能仍然会干扰。

如果两个登录都针对不同的部分(例如用户的 facebook 和仅供管理员用户访问的后端的表单登录),您可以分配不同的模式并检查分析器栏(屏幕底部的工具栏)开发模式)如果使用了正确的防火墙。

无论如何我都会更改防火墙的顺序。您可以通过将 dev 移动到顶部来确保它得到处理,并确保将最通用的防火墙(使用 /* 模式)移动到底部以确保它捕获以前未被另一个处理的所有路由防火墙。