Междоменная аутентификация Symfony2 из формы AngularJS возвращает AnonymousToken

0

У меня есть два отдельных проекта: один проект Symfony, который возвращает некоторый json для аутентифицированного пользователя и один проект AngularJS, которые предоставляют интерфейс для извлечения данных. Теперь я борюсь с конфигурацией брандмауэра, чтобы мой пользовательский интерфейс выполнял правильную аутентификацию.

Это мой security.yml:

security:
    encoders:
        AppBundle\Entity\User:
            algorithm: sha512
            encode_as_base64: false
            iterations: 10

    providers:
        api_key_user_provider:
            id: app_bundle.api_key_user_provider

        entity_user_provider:
            entity:
                class: AppBundle\Entity\User
                property: email

    firewalls:
        main:
            pattern: ^/(?!login).+
            stateless: false
            simple_preauth:
                authenticator: app_bundle.api_key_authenticator
            provider: api_key_user_provider
            anonymous: ~
            logout: ~
            context: dashboard

        login:
            pattern: ^/login
            provider: entity_user_provider
            form_login:
                login_path: /login
                check_path: /login/check
                csrf_provider: security.csrf.token_manager
            anonymous: ~
            context: dashboard

    access_control:
         - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
         - { path: ^/, roles: IS_AUTHENTICATED_FULLY }

Поэтому, когда я пытаюсь отправить учетные данные из UI в /login/check, я получаю следующий результат:

AnonymousToken(user="anon.", authenticated=true, roles="")

Кажется, что мой запрос обработка AnonymousAuthenticationProvider вместо Entity_user_provider.

Итак, мой вопрос: что не так в моей конфигурации security.yml и как правильно выполнять междоменную аутентификацию с использованием моей клиентской формы? В результате мне нужно вернуть api-key. Думаю, я могу сделать это в моей безопасности: логин, не так ли?

(Для включения CORS я использую NelmioCorsBundle).

Кроме того, возможно, это было бы полезно. Это мои настройки CORS в config.yml:

nelmio_cors:
    defaults:
        allow_credentials: false
        allow_origin: []
        allow_headers: []
        allow_methods: []
        expose_headers: []
        max_age: 0
        hosts: []
        origin_regex: false

paths:
    '^/' :
        allow_credentials: true
        origin_regex: true
        allow_origin: ['http://my_local_domain_with_angular']
        allow_headers: ['*']
        expose_headers: ['*']
        allow_methods: ['POST', 'GET', 'DELETE', 'PUT', 'HEAD']
        max_age: 3600

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать!

Спасибо за любую помощь!

Теги:
security

1 ответ

0
Лучший ответ

Я решил это.

Во-первых, я замечаю, что form_login прослушиватель не обрабатывает данные из внешней формы. Поэтому я использую simple_preauth listener. Я определил два отдельных брандмауэра:

firewalls:

    main:
        pattern: ^/(?!login).+
        stateless: false
        simple_preauth:
            authenticator: app_bundle.api_key_authenticator
        provider: api_key_user_provider
        anonymous: ~
        logout: ~

    login:
        pattern: ^/login
        stateless: false
        simple_preauth:
            authenticator: app_bundle.email_password_authenticator
        provider: email_user_provider
        anonymous: ~

Если логин успешно, то следующий мой сервис сгенерирует api_key который можно использовать для аутентификации на main брандмауэре.

Для получения дополнительной информации вы также можете увидеть мой другой вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню