Точка входа: помощь пользователям с началом аутентификации

Дата обновления перевода 2024-07-27

Точка входа: помощь пользователям с началом аутентификации

Когда неаутентифицированный пользователь пытается получить доступ к защищенной странице, Symfony предоставляет ему подходящий ответ, чтобы позволить ему начать аутентификацию (например, перенаправляет на форму входа в систему, или отображает ответ HTTP 401 Неавторизовано, для API).

Однако, иногда, один файерволл имет множество способов аутентификации (к примеру, и форму входа в систему, и социальный вход в систему). В таких случаях необходимо сконфигурировать точку входу аутентификации.

Вы можете сконфигурировать ее, используя настройку entry_point:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# config/packages/security.yaml
security:
    enable_authenticator_manager: true

    # ...
    firewalls:
        main:
            # позволить аутентификацию, используя форму или пользовательский аутентификатор
            form_login: ~
            custom_authenticators:
                - App\Security\SocialConnectAuthenticator

            # сконфигурировать форму аутентификации как точку входа для неаутентифицированных пользователей
            entry_point: form_login

Note

Вы также можете создать собственную точку входа аутентификации, создав класс, реализующий AuthenticationEntryPointInterface. Затем, вы можете установить entry_point в сервис-id (например, entry_point: App\Security\CustomEntryPoint)

Множество аутентификаторов с разными точками входа

Однако, существуют случаи применения, где у вас есть аутентификаторы, которые защищают разные части вашего приложения. Например, у вас есть форма входа в систему, защищающая основной веб-сайт и конечные точки API, используемые внешними сторонами, защищенные ключами API.

Так как вы можете сконфигурировать только по одной точке входа для одного файерволла, решением будет разделить конфигурацию на два отдельных файерволла:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# config/packages/security.yaml
security:
    # ...
    firewalls:
        api:
            pattern: ^/api/
            custom_authenticators:
                - App\Security\ApiTokenAuthenticator
        main:
            lazy: true
            form_login: ~

    access_control:
        - { path: '^/login', roles: PUBLIC_ACCESS }
        - { path: '^/api', roles: ROLE_API_USER }
        - { path: '^/', roles: ROLE_USER }