如何在 Symfony 中扩展 LdapUserProvider 并使用自定义 LDAP 用户提供程序?

Jea*_*4RK 4 symfony symfony4

我正在努力更换 LdapUserProvider。

我创建了我自己的提供程序(基于 LdapUserProvider 但检索更多信息的 App\Security\MyLdapUserProvider)和我自己的用户界面(App\Security\MyUser),具有更多属性来存储数据。

最后我想检索用户的组和显示名称。

这是我的配置:

服务.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
Run Code Online (Sandbox Code Playgroud)

安全.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: /
Run Code Online (Sandbox Code Playgroud)

我在哪里可以告诉安全提供程序使用我自己的 ldap 提供程序而不是默认提供程序?

Symfony 进程对我来说仍然有点复杂,所以如果有人能花时间解释一下..

Symfony 文档是在 CustomUserProvider > Ldap config > CustomeUserProvider... 之间重定向的无限循环。

Nic*_*ich 6

如在文档章节所述创建自定义用户提供您需要添加您的用户提供作为下一个新的密钥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'
Run Code Online (Sandbox Code Playgroud)

然后,您可以将此提供程序用于防火墙之一,如下所示:

security:
  # [..]
  firewalls:
    main:
      pattern: '^/'
      provider: 'my_ldap_provider'
Run Code Online (Sandbox Code Playgroud)

SymfonyLdapUserProvider看起来像这样:

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 = []
    )
    {
Run Code Online (Sandbox Code Playgroud)

为了创建正确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'
Run Code Online (Sandbox Code Playgroud)