Java SpringLDAP身份验证出现问题
这是我第一次和Spring一起工作,所以请容忍我 我很确定问题在于我对DnPatterns和group search base的设置不正确 有一个外部广告,我正试图连接。使用ad explorer,我发现了一个条目,下面是用户的dn,然后是他们通常用于登录的登录id 作为AD Explorer视图中用户配置文件中的列表Java SpringLDAP身份验证出现问题,java,spring-boot,authentication,ldap,Java,Spring Boot,Authentication,Ldap,这是我第一次和Spring一起工作,所以请容忍我 我很确定问题在于我对DnPatterns和group search base的设置不正确 有一个外部广告,我正试图连接。使用ad explorer,我发现了一个条目,下面是用户的dn,然后是他们通常用于登录的登录id 作为AD Explorer视图中用户配置文件中的列表 DN -> CN=LastName\, FirstName, OU=Users,OU=Calgary,DC=CORP,DC=DEPARTMENT,DC=com 用户登录
DN -> CN=LastName\, FirstName, OU=Users,OU=Calgary,DC=CORP,DC=DEPARTMENT,DC=com
用户登录时提供的用户名和密码:
UserName -> LastFirst5
Password -> Password
在目录资源管理器中访问用户信息的路径如图所示
DC=CORP,DC=DEPARTMENT,DC=com -> OU=Calgary -> OU=Users -> CN=LastName,FirstName
这是我的配置设置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().fullyAuthenticated()
.and()
.formLogin();
}
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.ldapAuthentication()
.userDnPatterns("DC=corp,DC=department,DC=com")
.groupSearchBase("OU=Users,OU=Calgary,DC=CORP,DC=Department,DC=com")
.contextSource()
.url("ldap://corp.Ad.com/")
.and()
.passwordCompare()
.passwordEncoder(new LdapShaPasswordEncoder())
.passwordAttribute("userPassword");
}
- 首先,上下文源url应包括用于搜索和/或验证用户的基本DN
.contextSource() .url('ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com')
用于匹配用户条目的RDN中出现的用户登录名(如果出现!)然后,服务器用用户输入的登录名替换{0}占位符,然后通过从LDAP url中附加基本dn来重新创建用户dn。问题是,在您的目录中,用户dn不是根据其用户名生成的,而是根据其userDnPatterns()
属性生成的,该属性不同,因此您不能有匹配项(cn
),因此您无法使用此方法对用户进行身份验证(但如果username和cn是等效的,则正确的模式将类似于LastName,FirstName≠ LastFirst5
)cn={0},ou=users
- 另一方面,
可用于匹配用户使用常规搜索筛选器提供的登录名。(可选)userSearchFilter()
可与它一起使用,以设置可选的分支rdn,用户条目位于该分支rdn,并从该分支rdn执行搜索,如果未指定,则搜索包括从LDAP url的基本dn开始的整个目录userSearchBase()
请注意,如果您在其他城市有用户,如.and() .userSearchBase('ou=Users,ou=Calgary') .userSearchFilter('(sAMAccountName={0})')
,则需要另一种配置,以便在不知道从哪个城市开始搜索的情况下对其进行身份验证。在这种情况下,您将重置搜索库以匹配基本dn下的所有条目,并且由于您只希望用户能够登录,因此您将优化过滤器 因此:OU=users,OU=OtherCity,DC=…
.and() .userSearchBase('') .userSearchFilter('(&(sAMAccountName={0})(objectClass=user)')
- 如果没有
,则不需要groupSearchFilter()
,而这两个角色仅用于授权(验证用户是否具有给定角色以及是否为给定组的成员)groupSearchBase()
- 为了能够搜索和匹配用户条目,身份验证请求本身需要连接并绑定到LDAP服务器,大多数服务器不接受匿名绑定,因此您可能需要设置managerDn()和managerPassword():
感谢您的详细回复!我会试试看,url中的389号是什么?”ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com'它只是指定ldap端口,它是可选的,默认为389,但我认为最好是显式的。ldap URL遵循以下通用语法:
ldap://主机[:端口]/[dc=xxx]
。
.contextSource()
.url('ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com')
.managerDn('admin')
.managerPassword('password')