FOSUserBundle:使用 form_login 配置要由防火墙处理的检查路径

FOSUserBundle: configure the check path to be handled by the firewall using form_login

我在我的 symfony 项目中下载了 FOSUser Bundle。

这是包的路由文件:

# Manage security
fos_user_security:
    resource:  "@FOSUserBundle/Resources/config/routing/security.xml"

# User Profil
fos_user_profile:
    resource:  "@FOSUserBundle/Resources/config/routing/profile.xml"
    prefix: /profile

# Register User
fos_user_register:
    resource:  "@FOSUserBundle/Resources/config/routing/registration.xml"
    prefix: /register

# Reset User password
fos_user_resetting:
    resource:  "@FOSUserBundle/Resources/config/routing/resetting.xml"
    prefix: /resetPassword

# Change User password
fos_user_change_password:
    resource:  "@FOSUserBundle/Resources/config/routing/change_password.xml"
    prefix: /changePassword

现在,当我想转到登录页面时,一切正常,但是当我想连接用户时,出现此错误:

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

这是我的配置文件,security.yml:

security:

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt|error)|css|images|js)/
            security: false

        default:
            anonymous: ~

        main:
            pattern: ^/
            form_login:
                check_path: fos_user_security_login_check
                login_path: fos_user_security_login
                provider: fos_userbundle
                csrf_provider: security.csrf.token_manager
            logout:
                path:     fos_user_security_logout
                target:   /
            anonymous:    true

    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

我做错了什么?

此外,当我想注销时出现此错误:

You must activate the logout in your security firewall configuration.

使用这个:

form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
                check_path:     /login_check
                failure_path:   /login
                default_target_path: /profile/
                always_use_default_target_path: true

只需删除您的 default 防火墙:

default:
    anonymous: ~

它会捕获您的所有请求,因为防火墙是按照它们定义的顺序进行测试的。
所以在像登录页面这样的 FOSUserBundle 页面上,没有 form_login 提供商,也没有 logout 提供商。

我认为这是 You must configure the check path to be handled by the firewall using form_login in your security firewall configuration

的副本

您的代码仅在 check_path 值的部分有误。

这是您的原始代码:

    main:
        pattern: ^/
        form_login:
            check_path: fos_user_security_login_check
            login_path: fos_user_security_login
            provider: fos_userbundle
            csrf_provider: security.csrf.token_manager

你应该使用类似的东西:

    main:
        pattern: ^/
        form_login:
            check_path: fos_user_security_login_check
            login_path: /login_check
            provider: fos_userbundle
            csrf_provider: security.csrf.token_manager

注意 check_path 的值只有一个字符串。如果您使用值 fos_user_security_check,则您正在调用 SecurityController.php class and invoking the checkAction() 方法,该方法只会抛出 RuntimeError 异常并显示错误“您必须配置在您的安全防火墙配置中使用 form_login 由防火墙处理的检查路径。”。所以修复非常简单,不使用值 fos_user_security_check

我花了好几天时间才弄清楚,这是一个非常简单的解决方案。希望通过发布我所做的来节省别人一些时间。只需要删除

check_path: fos_user_security_login_check

我的 security.yml 现在看起来像这样:

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt|error)|css|images|js)/
            security: false


        main:
            pattern: ^/
            form_login:
                login_path: fos_user_security_login
                provider: fos_userbundle
                csrf_provider: security.csrf.token_manager
                default_target_path: /admin/materials/
                always_use_default_target_path: true
            logout: 
                path:   fos_user_security_logout
                target: /
            anonymous: true

    access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_ADMIN }