У меня есть два отдельных проекта: один проект 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
Если вам нужна дополнительная информация, пожалуйста, дайте мне знать!
Спасибо за любую помощь!
Я решил это.
Во-первых, я замечаю, что 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
брандмауэре.
Для получения дополнительной информации вы также можете увидеть мой другой вопрос.