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】:问题是你是否应该匹配userPrincipalName
或sAMAccountName
。这实际上取决于您的用户的期望。
sAMAccountName
是您在说“用户名”时通常会想到的。
userPrincipalName
看起来像一个电子邮件地址。它通常与sAMAccountName
后跟@
和域名DNS 名称相同,但并非必须如此。
您可以在此处查看更多信息:User Naming Attributes
用户作为用户名输入的任何值都应与您在此处选择的属性相匹配。
【讨论】:
以上是关于Ldap 身份验证不适用于 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中为 Spring LDAP 身份验证设置覆盖 BindAuthenticator handleBindException