Как использовать несколько аутентификаторов защиты

Дата обновления перевода 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 }