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, вход в систему снова будет работать нормально.

В чем может быть проблема?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
243
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте сравнить файл до и после, чтобы увидеть различия.

Вы проверяли журналы? Вы получаете сообщение об ошибке?

Поскольку в статье говорится об изменении ряда различных файлов, трудно сказать. т.е. Ваш опубликованный файл не содержит ничего из того, что описано в статье, например, брандмауэр ^/api.

Может быть, создать скелет строки за строкой в ​​статье в отдельной папке, а затем сравнить с вашим проектом, файл за файлом, добавляя каркас...

Похоже, вы не указываете своему основному брандмауэру, какого провайдера использовать для аутентификации, поэтому ваш API может переопределить его...

т.е. Ваш main: form_login: provider: должен быть пользователями, и ваш API может использовать пакет fos_user

Оба должны иметь возможность использовать одного и того же провайдера, если имена полей одинаковы.

Редактировать: 1) Кассовая симфония брандмауэры и контроль доступа

2) Решите, хотите ли вы тех же пользователей, что и ваш основной сайт, или другого поставщика пользователей для API.

3) Укажите form_login в соответствующем разделе брандмауэра на провайдера пользователя, которого вы хотите использовать.

Выше у вас зарегистрирован один провайдер, "пользователи" в разделе провайдеров. Предполагая, что вы хотите, чтобы отдельные пользователи были на вашем основном сайте: Если бы вы следовали статье, вы бы добавили «fos_userbundle» в качестве другого поставщика в этом разделе и добавили разделы брандмауэра, чтобы разрешить oauth для API. В разделе «form_login» на «auth_authorize» есть провайдер, который указывает на 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 ] }

Спасибо за ответ. Не могли бы вы отредактировать свой ответ и привести пример, как бы вы настроили провайдеров в брандмауэре? Я очень новичок в Symfony 4, и это первый проект, который я пытаюсь создать с нуля.

Bird87 ZA 05.04.2019 22:14

Прочитав ваш ответ еще раз после некоторого перерыва в коде, я понял, что вы имели в виду, и увидел проблему. Большое спасибо за помощь.

Bird87 ZA 07.04.2019 18:29

@Маркус, похоже, вы создали незарегистрированную учетную запись и зарегистрированную учетную запись. Вы можете использовать эту страницу для объединения учетных записей stackoverflow.com/contact. Таким образом, вы можете редактировать свои собственные сообщения, не ставя их в очередь.

Bhargav Rao 07.04.2019 23:35

Другие вопросы по теме