Ldap 身份验证不适用于 Spring Boot

Posted

技术标签:

【中文标题】Ldap 身份验证不适用于 Spring Boot【英文标题】:Ldap Authentication not working with spring boot 【发布时间】:2020-09-08 22:58:50 【问题描述】:

我能够使用 spring boot ActiveDirectoryLdapAuthenticationProvider 进行 LDAP 身份验证。相同的代码适用于其他客户端环境,但不知何故,对于一个客户端它不起作用。 我能够连接到 LDAP 并绑定并到达 roodn,一切正常。

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

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

我正在使用:

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

我尝试了很多搜索过滤器,但似乎没有任何效果。

任何人都可以帮忙解决这个问题,对 LDAP 了解不多。

【问题讨论】:

日志在说什么? 【参考方案1】:

@gariel 用户希望仅使用 sAMAccountName 严格登录。我使用电子邮件 ID (&(objectClass=user)(userPrincipalName=0)) 过滤器登录。但是要使其与 sAMAccountName 及其 LDAP 一起使用,将其更改为 (&(objectClass=user)(sAMAccountName=0)) 是行不通的。他们的 sAMAccountName 和 userprincipalname 不一样。

作为一种解决方法,而不是完全依赖于 spring security 进行身份验证, 用户输入 sAMAccoutName,我使用自定义过滤器拦截请求。在自定义过滤器中,我使用 JAVA 代码查询 LDAP 以向我提供该 sAMAccountName 的 emailId。获得用户的 emailID 后,我将请求中的用户名字段从 sAMAccountName 更新为 emailID,然后继续进行身份验证请求(请记住,我已经使用 emailID 进行了 LDAP 身份验证)。

在 SecurityConfig 文件中:.addFilterBefore(new CustomFilter(), UsernamePasswordAuthenticationFilter.class) CustomFilter 是我做上述所有事情的地方。

现在一切正常,但我有新问题。当用户成功通过身份验证时,如果用户不在本地数据库中并且不需要任何权限,则它可以正常工作。但是用户在本地数据库中被定义为 ADMIN,并且在身份验证后我们为它提供了 ADMIN 权限,由于某种原因,由于自定义过滤器,它进入了循环。

【讨论】:

【参考方案2】:

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

sAMAccountName 是您在说“用户名”时通常会想到的。

userPrincipalName 看起来像一个电子邮件地址。它通常sAMAccountName 后跟@ 和域名DNS 名称相同,但并非必须如此。

您可以在此处查看更多信息:User Naming Attributes

用户作为用户名输入的任何值都应与您在此处选择的属性相匹配。

【讨论】:

以上是关于Ldap 身份验证不适用于 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章

身份验证过滤器不适用于 Spring Boot

如何在 Spring Boot 中为 Spring LDAP 身份验证设置覆盖 BindAuthenticator handleBindException

从 Spring Boot 应用程序使用 AD LDP 进行 LDAP 身份验证

LDAP 身份验证不适用于 Jenkins

LDAP 身份验证不适用于 websvn

使用 Spring Boot/Spring Security 对 LDAP 进行证书身份验证