Я настраиваю экстрасеть с внутренними и внешними пользователями, которым назначаются разные роли.Внешние пользователи проходят проверку подлинности и получают свои роли из локальной базы данных.Внутренние пользователи проходят проверку подлинности с помощью LDAP и должны получать свои роли из базы данных, но это не работает (даже если они существуют в базе данных). Как я могу заставить внутренних пользователей (прошедших проверку подлинности с помощью LDAP) получать свои роли из базы данных?
Я использую Symfony 4.2 и не нашел ничего, чтобы попробовать (На каждое найденное мной сообщение, касающееся той же проблемы, нет ответа)
security.yaml:
parameters:
env(LDAP_BASE): ''
env(LDAP_SEARCH): ''
env(LDAP_PASSWORD): ''
env(LDAP_FILTER): ''
security:
providers:
chain_provider:
chain:
providers: [user_ldap, user_db]
user_ldap:
ldap:
service: Symfony\Component\Ldap\Ldap
base_dn: '%env(resolve:LDAP_BASE)%'
search_dn: '%env(resolve:LDAP_SEARCH)%'
search_password: '%env(resolve:LDAP_PASSWORD)%'
uid_key: 'sAMAccountName'
filter: '%env(resolve:LDAP_FILTER)%'
default_roles: ROLE_INTERNAL_USER
user_db:
entity:
class: App\Entity\User
property: username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
provider: chain_provider
anonymous: true
form_login_ldap:
login_path: /login
check_path: /login
provider: user_ldap
service: Symfony\Component\Ldap\Ldap
username_parameter: 'username'
password_parameter: 'password'
dn_string: 'MYDOMAIN\{username}'
form_login:
login_path: /login
check_path: /login
provider: user_db
username_parameter: 'username'
password_parameter: 'password'
logout:
path: logout
role_hierarchy:
ROLE_STOCKS_WRITE: ROLE_INTERNAL_USER
ROLE_STOCKS_READONLY: ROLE_EXTERNAL_USER
access_control:
- { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/stocks, roles: [ROLE_INTERNAL_USER, ROLE_STOCKS_READONLY] }
- { path: ^/, roles: [ROLE_INTERNAL_USER, ROLE_EXTERNAL_USER] }
encoders:
App\Entity\User:
algorithm: bcrypt
Я ожидаю, что внутренний пользователь получит роль ROLE_STOCKS_WRITE (как определено в локальной базе данных), но он получит только роль ROLE_INTERNAL_USER.