所以这是我第一次与Spring合作,所以请多多包涵!
我很确定问题是我对DnPatterns和组搜索基础的设置不正确。
我正在尝试连接一个外部AD。使用广告资源管理器,我找到了一个条目,下面是用户的dn,然后是他们通常用于登录的ID登录
在AD Explorer视图中用户的个人资料中所听的
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");
}
答案 0 :(得分:1)
首先,上下文源URL应包含用于搜索和/或验证用户身份的基本DN。
.contextSource()
.url('ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com')
userDnPatterns()
用于匹配用户登录名中出现的用户登录名-(如果显示!)-然后服务器替换登录名用户为{0}占位符输入的名称,然后通过从LDAP URL附加基本dn来重新创建用户dn。问题在于,在您的目录中,用户dn是不是根据其用户名而是根据其cn
属性而构建的,而不是根据其用户名构建的,因此您无法进行匹配(LastName, FirstName ≠ LastFirst5
),因此您无法使用此方法对用户进行身份验证(但如果用户名和cn等效,则正确的模式应类似于cn={0},ou=Users
)。
userSearchFilter()
可用于匹配用户使用常规搜索过滤器提供的登录名。可选地,userSearchBase()
可以与它一起使用,以设置可选的分支rdn,用户条目位于该分支并从中执行搜索,如果未指定,则搜索包括从LDAP URL的基本dn开始的整个目录。 / p>
.and()
.userSearchBase('ou=Users,ou=Calgary')
.userSearchFilter('(sAMAccountName={0})')
请注意,如果您在OU=Users,OU=OtherCity,DC=...
之类的其他城市有用户,则将需要另一种配置来对他们进行身份验证,而不知道从哪个城市开始搜索。在这种情况下,您将重置搜索基础以匹配基础dn下的所有条目,并且由于只希望用户能够登录,因此可以优化过滤器
相应地:
.and()
.userSearchBase('')
.userSearchFilter('(&(sAMAccountName={0})(objectClass=user)')
如果没有groupSearchBase()
,则不需要groupSearchFilter()
,这两个仅用于授权(验证用户具有给定角色<=>是给定组的成员) 。
要能够搜索和匹配用户条目,身份验证请求本身需要连接并绑定到LDAP服务器,大多数服务器不接受匿名绑定,因此您可能需要设置managerDn()和managerPassword ():
.contextSource()
.url('ldap://corp.Ad.com:389/DC=CORP,DC=DEPARTMENT,DC=com')
.managerDn('admin')
.managerPassword('password')