Symfony теряет сеанс аутентификации между логином и перенаправлением - PullRequest
4 голосов
/ 04 апреля 2019

У меня есть приложение с формой входа, которое работает нормально.

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

Что можетбыть проблемой?

1 Ответ

4 голосов
/ 05 апреля 2019

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

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

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

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

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

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

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

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

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

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

Выше зарегистрирован один провайдер, «пользователи» в провинции.дер разделПредполагая, что вы хотите разделить пользователей на свой основной сайт: если вы следили за статьей, вы бы поместили «fos_userbundle» в качестве другого провайдера в этом разделе и добавили разделы брандмауэра для разрешения oauth для API.Под "form_login" на "aouth_authorize" есть поставщик, который указывает на fos_userbundle.Вы также должны были добавить маршрут API, чтобы указать, на какой маршрут отвечает ваш API (шаблон: ^ / api <== любой маршрут, начинающийся с API) </p>

Я подозреваю, что ваш пользовательский провайдер в главном разделе сейчас незнать, какой пользовательский пакет использовать для аутентификации.т.е. вы пытались войти в систему как пользователь API на вашем главном сайте?Это подтверждает подлинность?Если это так, вы должны указать своему «основному» разделу в брандмауэре, что поставщик пользователей должен быть поставщиком «пользователей», добавив поставщика: пользователей в раздел «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 ] }
...