首页 > 解决方案 > Symfony 在登录和重定向之间丢失身份验证会话

问题描述

我有一个应用程序,它的表单登录一直运行良好。

然后,我使用本指南为其添加了一个 api 端。现在我在网页端的登录不再起作用了。

这是我的 security.yaml 文件:

security:
    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        users:
            entity:
                class: 'App\Entity\User'
                property: 'username'
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            anonymous: true
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
            form_login:
                login_path: app_login
                check_path: app_login
            logout:
                path: app_logout
                target: app_user_index
        secured_area:
            form_login:
                csrf_token_generator: security.csrf.token_manager
    encoders:
        App\Entity\User:
            algorithm: bcrypt
            cost: 12

    role_hierarchy:
        ROLE_ADMIN: ROLE_USER

            # activate different ways to authenticate

            # http_basic: true
            # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate

            # form_login: true
            # https://symfony.com/doc/current/security/form_login_setup.html

    # Easy way to control access for large sections of your site
    # Note: Only the *first* access control that matches will be used
    access_control:
        # - { path: ^/delete, roles: ROLE_ADMIN }
        # - { path: ^/profile, roles: ROLE_USER }

我不确定我还需要发布什么,但我想不出任何其他可能会导致它崩溃的改变。

如果我在实现 API 之前恢复到某个点,登录会再次正常工作。

可能是什么问题?

标签: authenticationsymfony-4.2

解决方案


尝试比较之前和之后的文件以查看差异。

你检查过日志吗?你有错误吗?

由于文章谈到更改许多不同的文件,所以很难说。即您发布的文件不包含文章中的任何内容,例如 ^/api 防火墙

也许在单独的文件夹中为文章中的行创建骨架行,然后与您的项目逐个文件进行比较,添加骨架的东西......

似乎您没有告诉您的主防火墙使用哪个提供商进行身份验证,因此您的 api 可能会覆盖它...

即你的main:form_login:provider:需要是用户,你的api可以使用fos_user包

只要字段名称相同,两者都应该能够使用相同的提供程序

编辑:1)结帐交响乐防火墙和访问控制

2) 决定是否需要与主站点相同的用户,或不同的用户提供程序的 api

3)将防火墙相关部分的form_login指向您要使用的用户提供者

您在上面注册了一个提供商,即提供商部分中的“用户”。假设您希望单独的用户访问您的主站点:如果您按照文章进行操作,您将在该部分中将“fos_userbundle”作为另一个提供程序,并添加防火墙部分以允许 api 的 oauth。在“aouth_authorize”上的“form_login”下,有一个指向 fos_userbundle 的提供程序。您还应该添加 api 路由来控制您的 api 响应哪个路由(模式:^/api <== 任何以 api 开头的路由)

我怀疑您在主要部分下的用户提供者现在不知道要使用哪个用户包进行身份验证。即您是否尝试在您的主站点上以 api 用户身份登录?它进行身份验证吗?如果是这样,您需要通过将 provider: users 添加到防火墙的“form_login”部分来告诉防火墙中的“主要”部分,用户提供者必须是“用户”提供者。

如果您想为您的主站点和您的 api 使用单独的用户提供程序:

(未经测试的代码)

security:
    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        users:
            entity:
                class: 'App\Entity\User'
                property: 'username'
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        oauth_token:
            pattern:    ^/oauth/v2/token
            security:   false
        oauth_authorize:
            pattern:    ^/oauth/v2/auth
            form_login:
                provider: fos_userbundle
                check_path: /oauth/v2/auth_login_check
                login_path: /oauth/v2/auth_login
                use_referer: true
        api:
            pattern:    ^/api
            fos_oauth:  true
            stateless:  true
            anonymous:  false

        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            anonymous: true
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
            form_login:
                provider: users
                login_path: app_login
                check_path: app_login
            logout:
                path: app_logout
                target: app_user_index
        secured_area:
            form_login:
                csrf_token_generator: security.csrf.token_manager

    encoders:
        App\Entity\User:
            algorithm: bcrypt
            cost: 12
        FOS\UserBundle\Model\UserInterface: bcrypt

    role_hierarchy:
        ROLE_ADMIN: ROLE_USER

            # activate different ways to authenticate

            # http_basic: true
            # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate

            # form_login: true
            # https://symfony.com/doc/current/security/form_login_setup.html

    # Easy way to control access for large sections of your site
    # Note: Only the *first* access control that matches will be used
    access_control:
        # - { path: ^/delete, roles: ROLE_ADMIN }
        # - { path: ^/profile, roles: ROLE_USER }
        - { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }

如果您想对主站点和 api 使用相同的提供程序:

(未经测试的代码)

security:
    # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
    providers:
        users:
            entity:
                class: 'App\Entity\User'
                property: 'username'

    firewalls:
        oauth_token:
            pattern:    ^/oauth/v2/token
            security:   false
        oauth_authorize:
            pattern:    ^/oauth/v2/auth
            form_login:
                provider: users
                check_path: /oauth/v2/auth_login_check
                login_path: /oauth/v2/auth_login
                use_referer: true
        api:
            pattern:    ^/api
            fos_oauth:  true
            stateless:  true
            anonymous:  false

        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            pattern: ^/
            anonymous: true
            guard:
                authenticators:
                    - App\Security\LoginFormAuthenticator
            form_login:
                provider: users
                login_path: app_login
                check_path: app_login
            logout:
                path: app_logout
                target: app_user_index
        secured_area:
            form_login:
                csrf_token_generator: security.csrf.token_manager

    encoders:
        App\Entity\User:
            algorithm: bcrypt
            cost: 12

    role_hierarchy:
        ROLE_ADMIN: ROLE_USER

            # activate different ways to authenticate

            # http_basic: true
            # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate

            # form_login: true
            # https://symfony.com/doc/current/security/form_login_setup.html

    # Easy way to control access for large sections of your site
    # Note: Only the *first* access control that matches will be used
    access_control:
        # - { path: ^/delete, roles: ROLE_ADMIN }
        # - { path: ^/profile, roles: ROLE_USER }
        - { path: ^/api, roles: [ IS_AUTHENTICATED_FULLY ] }

推荐阅读