如何在Spring-Security LDAP中使用ActiveDirectory

时间:2016-05-09 21:26:50

标签: spring spring-security spring-security-ldap

我正在尝试在Spring MVC应用程序上设置Spring Security for LDAP身份验证。我似乎无法使用简单/主体身份验证来使用LdapAuthenticationProvider,所以我正在尝试使用ActiveDirectoryLdapAuthenticationProvider,默认情况下会这样做。

在创建上下文(我认为发生了LDAP绑定)后,我从此行(ActiveDirectoryLdapAuthenticationProvider.java中的310)获取了带有detailMessage的NameNotFoundException:

return SpringSecurityLdapTemplate.searchForSingleEntryInternal(context,
                searchControls, searchRoot, searchFilter,
                new Object[] { bindPrincipal });

错误讯息:

[LDAP: error code 32 - 0000208D: NameErr: DSID-03100213, problem 2001 (NO_OBJECT), data 0, best match of:
'DC=my,DC=company,DC=com']

搜索过滤器正在查找具有“user”类的对象,其userPrincipalName等于我通过身份验证的用户名,并与我的域的域名连接。例如,“me@my.company.com”。具有该值的属性存在,因为我可以在此方法中使用JXplorer进行身份验证,然后执行该搜索以查找我的用户对象。

我的WebSecurityConfigurerAdapter子类的配置,我在AuthenticationManagerBuilder中连接,基本上是这样的:

@Autowired
public void init(AuthenticationManagerBuilder auth) throws Exception {
   ActiveDirectoryLdapAuthenticationProvider provider =
            new ActiveDirectoryLdapAuthenticationProvider("my.company.com", "LDAPS://ad.my.company.com:636/dc=my,dc=company,dc=com");
   provider.setConvertSubErrorCodesToExceptions(true);
   auth.authenticationProvider(provider);
}

导致NameNotFoundException的原因是什么?这是配置ActiveDirectory身份验证的正确方法吗?

1 个答案:

答案 0 :(得分:0)

面掌。 LDAP服务器的URL不应包含X.501域组件部分,至少在我的目录中是这样。我想这是有道理的,因为第一个构造函数参数是域的名称(在FQDN样式中)。所以构造函数参数应该是......

new ActiveDirectoryLdapAuthenticationProvider("my.company.com", "ldaps://ad.my.company.com:636");

在绑定完成时,此错误消息暗示,但搜索失败。确切的错误是“NO_OBJECT”的原因,这是搜索基础关闭的线索。我最初配置的搜索基本上添加了两次搜索库(DC)。