Ldap身份验证不适用于Spring Boot

时间:2020-05-22 06:48:54

标签: spring-boot spring-security active-directory ldap

我能够在Spring Boot ActiveDirectoryLdapAuthenticationProvider上使用LDAP身份验证。相同的代码可在其他客户端环境中使用,但对于一个客户端则无法正常工作。 我能够连接到LDAP并进行绑定,也可以访问roodn,一切正常。

在搜索过滤器中,代替使用默认值即:

(&(objectClass=user)(userPrincipalName={0}))

我正在使用:

(&(objectCategory=person)(objectClass=user)(sAMAccountName={0})) 

我尝试了很多搜索过滤器,但似乎无济于事。

任何人都可以帮忙,对LDAP不太了解。

2 个答案:

答案 0 :(得分:1)

问题是,您是否应该按userPrincipalNamesAMAccountName进行匹配。这实际上取决于用户的期望。

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权限。