【问题标题】:Spring LDAP authentication NO_OBJECTSpring LDAP 身份验证 NO_OBJECT
【发布时间】:2019-12-16 14:33:57
【问题描述】:

我正在尝试将 Spring 应用程序连接到 AD-LDAP 服务器。如果我输入正确的用户/密码,我会在日志中得到NO_OBJECT-error:

DEBUG o.s.s.l.s.FilterBasedLdapUserSearch - Searching for user 'THEUSER', with user search [ searchFilter: '(sAMAccountName={0})', searchBase: 'DC=dev,DC=company,DC=local', scope: subtree, searchTimeLimit: 0, derefLinkFlag: false ]
DEBUG o.s.s.l.SpringSecurityLdapTemplate - Searching for entry under DN '', base = 'dc=entwicklung,dc=Lemken,dc=local', filter = '(sAMAccountName={0})'
DEBUG o.s.s.l.SpringSecurityLdapTemplate - Found DN: CN=THEUSER\, FirstName,OU=users,DC=dev,DC=company,DC=local
DEBUG o.s.s.l.a.BindAuthenticator - Attempting to bind as cn=THEUSER\, FirstName,ou=users,dc=dev,dc=company,dc=local
DEBUG o.s.s.l.DefaultSpringSecurityContextSource - Removing pooling flag for user cn=THEUSER\, FirstName,ou=users,dc=dev,dc=company,dc=local
DEBUG o.s.s.l.u.DefaultLdapAuthoritiesPopulator - Getting authorities for user cn=THEUSER\, FirstName,ou=users,dc=dev,dc=company,dc=local
DEBUG o.s.s.l.u.DefaultLdapAuthoritiesPopulator - Searching for roles for user 'THEUSER', DN = 'cn=THEUSER\, FirstName,ou=users,dc=dev,dc=company,dc=local', with filter (uniqueMember={0}) in search base ''
DEBUG o.s.s.l.SpringSecurityLdapTemplate - Using filter: (uniqueMember=cn=THEUSER\5c, FirstName,ou=users,dc=dev,dc=company,dc=local)
ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
org.springframework.ldap.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-03100213, problem 2001 (NO_OBJECT), data 0, best match of:
    ''

这是我的配置:

ContextSourceBuilder context = auth.ldapAuthentication()
  .userSearchFilter("(sAMAccountName={0})")
  .userSearchBase("dc=dev,dc=company,dc=local")
  .contextSource();

context.port(389);
context
  .root("dc=dev,dc=company,dc=local")
  .url("ldap://example.com")
  .managerDn("cn=manager,ou=users,dc=dev,dc=company,dc=local")
  .managerPassword("thepassword");

如果我输入了错误的密码,我会得到“密码错误”,所以这部分有效。

我做错了什么?

【问题讨论】:

    标签: java spring active-directory ldap


    【解决方案1】:

    关键部分是:

    Searching for roles
    ...
    Using filter: (uniqueMember=
    

    它正在尝试查找用户的角色 - 在 AD 中,这些是用户所属的组。但它是通过搜索将uniqueMember 属性设置为用户的组来实现的。 AD中不存在该属性。这是它使用的默认属性名称,因为这就是 OpenLDAP 中使用的名称。

    您将需要使用groupSearchFilter() 更改它查看的属性以查找组。 AD 使用member 属性。

    ContextSourceBuilder context = auth.ldapAuthentication()
      .userSearchFilter("(sAMAccountName={0})")
      .userSearchBase("dc=dev,dc=company,dc=local")
      .groupSearchFilter("(member={0})")
      .contextSource();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-12
      • 2012-02-18
      • 2011-05-04
      • 2016-09-01
      • 1970-01-01
      • 2015-10-20
      • 2016-10-07
      • 1970-01-01
      相关资源
      最近更新 更多