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

时间:2019-07-18 10:58:27

标签: symfony symfony4

我正在努力替换LdapUserProvider。

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

最后,我要检索用户的组和displayName。

这是我的配置:

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

security.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配置> CustomeUSerProvider ...之间重定向的无穷循环。

1 个答案:

答案 0 :(得分:3)

如文档章节Creating A Custom User Provider中所述,您需要在security.providers下将您的用户提供程序添加为新密钥,并将其配置为id

id是您的自定义用户提供程序服务的名称,在新版本的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'

Symfony的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的{​​{1}}服务,您需要这样的服务定义:

LdapUserProvider