Symfony как сделать несколько авторизованных пользователей - PullRequest
0 голосов
/ 01 апреля 2019

Я занимаюсь разработкой и применением в Symfony, с широким доступом, где пользователи входят в систему с помощью формы входа в систему и раздела администрирования с другой формой входа и другим провайдером пользователей.

Я создал LoginFormAuthenticator для каждогообласти, и два межсетевых экрана, чтобы выбрать правильный аутентификатор в каждой области.Это мой security.yaml:

security: провайдеры: admin_provider: сущность: класс: App \ Entity \ AdminUser свойство: электронная почта web_provider: entity: class: App \ Entity \ Свойство пользователя: электронная почта

firewalls:
    admin:
        pattern: '^/admin'
        anonymous: true
        provider: admin_provider
        guard:
            authenticators:
                - App\Security\AdminLoginFormAuthenticator
        logout:
            path: /admin/logout
            target: /
    main:
        anonymous: true
        provider: web_provider
        guard:
            authenticators:
                - App\Security\LoginFormAuthenticator
        logout:
            path: /logout

Теперь я добавляю / api в проект, и оба пользователя должны иметь возможность доступа, по-разному управляя правами доступа, если пользователь является публичным или администратором.

При разработкеконтроллер в области / api, я не могу получить пользователя при входе в систему через администратора.

Вопрос в том, как в / api я могу получить AdminUser, если он вошел в систему или пользователя (вэтот порядок) при доступе к $ this-> getuser () или $ this-> denyAccessUnlessGranted ()?

Я пытался добавить App \ Security \ AdminLoginFormAuthenticator в главный брандмауэр и добавить chain_provider в main.provider,Но это не работает.

Спасибо.

1 Ответ

0 голосов
/ 01 апреля 2019

Брандмауэры должны иметь общий контекст, чтобы иметь возможность доступа к тем же подключенным пользователям. Я думаю, что формулировка взята из Symfony 2, где SecurityContext был сервисом, хранящим пользователя и авторизацию.

Вам необходимо немного изменить конфигурацию, а затем $this->getUser() и $this->denyAccessUnlessGranted() вернут / будут использовать один и тот же объект User для обоих брандмауэров.

firewalls:
    admin:
        pattern: '^/admin'
        context: my_app_context
        anonymous: true
        # ...
    main:
        anonymous: true
        context: my_app_context
        # ...

Нет необходимости в обычном провайдере или индивидуальной охране. Хотя может быть проще иметь один и тот же класс User везде или, по крайней мере, общую роль для ясности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...