Как использовать несколько аутентификаторов защиты
Дата обновления перевода 2023-06-30
Как использовать несколько аутентификаторов защиты
Компонент Authenticator защиты позволяет вам с лёгкостью использовать много разных аутентификаторов одновременно.
Точкой входа является id сервиса (одного из ваших аутентификаторов),
метод которого start()
вызывается для начала процесса аутентификации.
Несколько аутентификаторов с общей точкой входа
Иногда вы будете хотеть предложить вашим пользователям разные механизмы аутентификации, такие как форма входа в систему и вход через Facebook, в то время как обе точки входа будут перенаправлять пользователя на одну и ту же страницу входа. Однако, в вашей конфигурации, вам нужно ясно указать, какую точку входа вы хотите использовать.
Вот как может выглядеть ваша конфигурация безопасности в действии:
1 2 3 4 5 6 7 8 9 10 11
# app/config/security.yml
security:
# ...
firewalls:
default:
anonymous: ~
guard:
authenticators:
- AppBundle\Security\LoginFormAuthenticator
- AppBundle\Security\FacebookConnectAuthenticator
entry_point: AppBundle\Security\LoginFormAuthenticator
В этом подходе есть одно ограничение - вам нужно использовать только одну точку входа.
Несколько аутентификаторов с отдельными точками входа
Тем не менее, существуют случаи применения, когда у вас есть аутентификаторы, которые защищают разные части вашего приложения. Например, у вас есть форма входа в систему, которая защищает безопасную часть вашего приложения, входную и конечную API точки, которые защищены API-токенами. Таккак вы можете сконфигурировать только одну точку входа для каждого брандмауэра, решением будет разделить конфигурацию на два отдельных брандмауэра:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# app/config/security.yml
security:
# ...
firewalls:
api:
pattern: ^/api/
guard:
authenticators:
- AppBundle\Security\ApiTokenAuthenticator
default:
anonymous: ~
guard:
authenticators:
- AppBundle\Security\LoginFormAuthenticator
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api, roles: ROLE_API_USER }
- { path: ^/, roles: ROLE_USER }