security.yml продолжает запрашивать check_path, который уже был предоставлен

Итак, у меня есть приложение, которое использует FOSUserbundle для управления пользователями и HWIOAuthBundle для аутентификации OAuth, которой на данный момент является только Facebook.

Я продолжаю получать эту ошибку, когда хочу войти в систему через форму входа, предоставленную шаблонами FOSUserBundle.

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

Но я не получаю эту ошибку, когда я вхожу в систему с помощью кнопки 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}

person Tunds    schedule 11.04.2017    source источник


Ответы (1)


Я предполагаю, что ваша форма входа в систему перехвачена брандмауэром secured_area.

У вас есть 3 брандмауэра:

  • secured_area, который соответствует всему, поскольку шаблон по умолчанию — /*.
  • dev, вероятно, так и не было достигнуто, потому что secured_area уже совпало
  • main соответствует всем (из-за шаблона), но никогда не достигается

Symfony будет использовать первый подходящий брандмауэр для аутентификации, и, поскольку secured_area не настроен для формы входа, он не будет работать. Вы можете объединить оба брандмауэра (в основном скопируйте раздел oauth в main, но отдельные механизмы входа все равно могут мешать.

Если оба логина предназначены для разных разделов (например, facebook для пользователей и форма входа для бэкэнда, доступного только для пользователей-администраторов), вы можете назначить разные шаблоны и проверить панель профилировщика (панель инструментов в нижней части экрана в режиме разработки), если использовался правильный брандмауэр.

В любом случае я бы изменил порядок брандмауэра. Вы можете убедиться, что dev обрабатывается, переместив его наверх, и не забудьте переместить самый общий брандмауэр (с использованием шаблона /*) вниз, чтобы убедиться, что он перехватывает все маршруты, которые ранее не обрабатывались другим брандмауэром.

person dbrumann    schedule 11.04.2017
comment
Хороший человек, я переместил oauth в основной брандмауэр и удалил параметр secure_area. - person Tunds; 11.04.2017