【问题标题】:Ldap Authentication not working with spring bootLdap 身份验证不适用于 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 了解不多。

【问题讨论】:

  • 日志在说什么?

标签: spring-boot spring-security active-directory 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

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

    【讨论】:

      猜你喜欢
      • 2017-04-12
      • 2022-10-04
      • 2022-01-20
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2013-12-19
      • 2017-07-30
      相关资源
      最近更新 更多