Я изо всех сил пытаюсь заменить LdapUserProvider.
Я создал своего собственного провайдера (App\Security\MyLdapUserProvider на основе LdapUserProvider, но получающего больше информации) и собственный пользовательский интерфейс (App\Security\MyUser) с дополнительными атрибутами для хранения данных.
В конце концов я хочу получить группы и отображаемое имя пользователя.
Вот моя конфигурация:
services.yaml:
# add more service definitions when explicit configuration is needed
# please note that last definitions always *replace* previous ones
Symfony\Component\Ldap\Ldap:
arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']
Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
arguments:
- host: 10.106.1.1
port: 389
#encryption: tls
options:
protocol_version: 3
referrals: false
безопасность.yaml:
providers:
#in_memory: { memory: ~ }
my_ldap:
ldap:
service: Symfony\Component\Ldap\Ldap
base_dn: "dc=XXXXXX,dc=com"
search_dn: "CN=XXXXXXXXXX,OU=LDAP,OU=Services Accounts,OU=Administration,DC=XXXXXXXXX,DC=com"
search_password: "ergergergergerg"
default_roles: ROLE_USER
filter: "({uid_key} = {username})"
uid_key: samAccountName
#password_attribute: displayName
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
security: true
anonymous: true
provider: my_ldap
form_login_ldap:
login_path: /login
check_path: /login
service: Symfony\Component\Ldap\Ldap
dn_string: 'dc=XXXXXX,dc=com'
query_string: '(samAccountName = {username})'
logout:
path: /logout
target: /
Где я могу сообщить поставщику безопасности, чтобы он использовал моего собственного поставщика ldap вместо поставщика по умолчанию?
Процессы Symfony все еще немного сложны для меня, поэтому, если кто-то может найти время, чтобы объяснить...
Документы Symfony — это бесконечный цикл перенаправления между CustomUserProvider > Ldap config > CustomeUSerProvider...




Как описано в главе документации Создание пользовательского поставщика услуг, вам необходимо добавить своего провайдера пользователей в качестве нового ключа в разделе security.providers и настроить его id.
Это id имя вашего пользовательского сервиса User Provider, который в последних версиях symfony соответствует FQCN.
# security.yaml
security:
providers:
# the name of your user provider can be anything
my_ldap_provider:
id: 'App\Security\MyLdapUserProvider'
Затем вы можете использовать этого провайдера для одного из брандмауэров следующим образом:
security:
# [..]
firewalls:
main:
pattern: '^/'
provider: 'my_ldap_provider'
Симфони LdapUserProvider выглядит так:
class LdapUserProvider implements UserProviderInterface
{
private $ldap;
private $baseDn;
private $searchDn;
private $searchPassword;
private $defaultRoles;
private $uidKey;
private $defaultSearch;
private $passwordAttribute;
private $extraFields;
public function __construct(
LdapInterface $ldap,
string $baseDn,
string $searchDn = null,
string $searchPassword = null,
array $defaultRoles = [],
string $uidKey = null,
string $filter = null,
string $passwordAttribute = null,
array $extraFields = []
)
{
Чтобы правильно создать службу MyLdapUserProvider, которая расширяет LdapUserProvider, вам нужно такое определение службы:
# services.yaml
services:
App\Security\MyLdapUserProvider:
arguments:
$adminEmail: '%admin_email%'
$ldap: '@Symfony\Component\Ldap\Ldap'
$baseDn: 'dc=XXXXXX,dc=com'
$searchDn: 'CN=XXXXXXXXXX,OU=LDAP,OU=Services Accounts,OU=Administration,DC=XXXXXXXXX,DC=com'
$searchPassword: 'ergergergergerg'
$defaultRoles: ['ROLE_USER']
$filter: '({uid_key} = {username})'
$uidKey: 'samAccountName'
Я обновил ответ. Вам нужно правильно настроить службу провайдера пользователя в services.yaml и избавиться от лишних аргументов в security.yaml под security.providers.<your-provider>. Достаточно просто id сервиса.
Почему это не нужно для пользовательского провайдера Symfony Ldap? Как он угадывает, что нужно?
Что ж, в случае поставщика Symfony Ldap вы предоставляете дополнительную информацию (baseDn, ... и т. д.) под security.providers, и оттуда она автоматически вводится компонентом безопасности ... в отличие от вашего случая, когда вы хотите использовать свой собственный сервис . Затем вам нужно внедрить зависимости «вручную» при создании службы. Это так просто.
Хорошо, все заработало, теперь мне нужно исправить некоторые ошибки в коде, но это не входит в рамки этой темы!
Рад слышать, что вы решили свою проблему. Удачного кодирования :)
ВЫ решили мою проблему ;) Спасибо! К сожалению, я не могу позволить себе прочитать весь документ. Я бы хотел, чтобы у меня не было таких глупых вопросов, но это не моя основная работа. Меня только попросили быстро написать кое-что и вернуться к моей работе системного администратора.
Поэтому мне нужно заменить ldap: на id: App\Security\MyLdapUserProvider и сохранить параметры внизу? Я получаю сообщение об ошибке синтаксического анализа... не содержит допустимого YAML: нельзя использовать двоеточие в значении сопоставления без кавычек в строке 13 (рядом с " uid_key: samAccountName")