我能够在Spring Boot ActiveDirectoryLdapAuthenticationProvider
上使用LDAP身份验证。相同的代码可在其他客户端环境中使用,但对于一个客户端则无法正常工作。
我能够连接到LDAP并进行绑定,也可以访问roodn,一切正常。
在搜索过滤器中,代替使用默认值即:
(&(objectClass=user)(userPrincipalName={0}))
我正在使用:
(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))
我尝试了很多搜索过滤器,但似乎无济于事。
任何人都可以帮忙,对LDAP不太了解。
答案 0 :(得分:1)
问题是,您是否应该按userPrincipalName
或sAMAccountName
进行匹配。这实际上取决于用户的期望。
sAMAccountName
是您通常所说的“用户名”。
userPrincipalName
看起来像一个电子邮件地址。 通常与sAMAccountName
后跟@
和域名DNS名称相同,但这不是必须的。
您可以在此处查看有关以下内容的更多信息:User Naming Attributes
无论用户键入的用户名值是什么,都应与您在此处选择的属性匹配。
答案 1 :(得分:0)
@gariel用户期望仅使用sAMAccountName严格登录。我使用电子邮件ID(&(objectClass = user)(userPrincipalName = {0}))过滤器进行登录。但是要使其与带有其LDAP的sAMAccountName一起使用,将其更改为(&(objectClass = user)(sAMAccountName = {0}))就是行不通的。它们的sAMAccountName和userprincipalname不相同。
作为一种解决方法,与其完全依靠spring安全性进行身份验证, 用户输入sAMAccoutName,然后使用自定义过滤器拦截请求。在自定义过滤器中,我使用JAVA代码查询LDAP,以向我提供该sAMAccountName的emailId。获得用户的emailID后,我将请求中的username字段从sAMAccountName更新为emailID,然后继续进行身份验证请求(请记住我已经使用LDAPID进行LDAP身份验证)。
在SecurityConfig文件中:.addFilterBefore(new CustomFilter(),UsernamePasswordAuthenticationFilter.class) CustomFilter是我做上面提到的所有事情的地方。
现在一切正常,但是我有新问题。当用户成功进行身份验证时,如果该用户不在本地数据库中并且不需要任何权限,它就可以正常工作。但是该用户在本地数据库中被定义为ADMIN,由于某些原因,由于自定义过滤器的原因,该用户进入了循环,因此在身份验证后,我们向其提供了ADMIN权限。