Як використовувати декілька аутентифікаторів захисту

Дата оновлення перекладу 2023-06-22

Як використовувати декілька аутентифікаторів захисту

Компонент 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 }