当前位置: 首页 > 知识库问答 >
问题:

Spring Security for Active Directory按“User PrincipalName”进行搜索--有办法改变这一点吗?

归明诚
2023-03-14

我仍在学习LDAP/Active Directory,如果我的术语完全错误,请纠正我:)

在我们的Java Web应用程序中,我试图使用Spring Security LDAP来保护它。我设法让Spring Security使用内存身份验证,但我们需要将其绑定到广告服务器上。

我将用com.test屏蔽我们的实际域

以下是当我试图从应用程序登录时收到的错误

13:39:55,701错误ActiveDirectoryLDAPAuthenticationProvider:133-未能找到经过身份验证的用户的目录项:johnsmit javax.naming.NameNotFoundException:[LDAP:错误html" target="_blank">代码32-0000208D:NameERR:DSID-0310020A,问题2001(NO_OBJECT),数据0,最佳匹配:'CN=Users,DC=AD,DC=Test,DC=COM'

我在Spring中使用基于类的配置,这里是我的SecurityConfiguration类

@Configuration
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Bean
    public ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
          provider = new ActiveDirectoryLdapAuthenticationProvider("ad.test.com", "ldap://servername.ad.test.com:389/cn=Users,dc=ad,dc=test,dc=com");

        provider.setUseAuthenticationRequestCredentials(true);


        return provider;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider());

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.
                authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin().failureUrl("/login?error")
                .loginPage("/login")
                .permitAll()
                .and()
                .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login")
                .permitAll()
                .and()
                .httpBasic();

    }
}

所以问题来了(至少我认为)...在我们的广告服务器中,我们有我们的cn、name、sAMAccountName和uid作为我们登录的用户名,在上面的例子中是johnsmit。

我们的userPrincipalName(在我们的广告服务器中)是我们的电子邮件地址so john.smith@test.com。

我查看了ActiveDirectoryLdapAuthenticationProvider类,它说它使用UserPrincipalName。在github上查看这里的代码,它显示它使用的是UserPrincipalName。我检查了Spring Security的较新版本,它还没有普遍可用性,但它是一样的。

一定有办法,我可以用用户名“johnsmit”搜索广告,而不是“john.smith@test.com”...

如果searchFilter是string searchFilter=“(&(objectclass=user)(SamAccountName={0}))”;这将是理想的情况,但我不知道这是否可以覆盖任何地方,而且我找不到任何文档?

共有1个答案

鞠通
2023-03-14

当我发现这对解决我自己的问题非常有帮助时,我只想补充一点,@JantheGun建议的更改似乎已经折叠到Spring Security 5.0.8中。Release/Spring Boot 2.0.5

ActiveDirectoryLDAPAuthenticationProvider.setSearchFilter(String)的JavaDoc将读取:

要搜索正在进行身份验证的用户的LDAP筛选器字符串。出现的{0}被替换为用户名@domain。出现的{1}仅替换为用户名。

因此,在Spring Security 5.0.8.Release中,可以使用建议的搜索过滤器更改,而不必复制任何Spring Security类!

 类似资料:
  • 我想做一个算法,在leetcode上发现了这个问题 给定一个整数数组,找到两个数字,使它们相加为一个特定的目标数。 函数twoSum应该返回两个数字的索引,使它们相加为目标,其中index1必须小于index2。请注意,您返回的答案(index1和index2)都不是从零开始的。 输出:index1=1,index2=2 我的解是O(n^2)。我想知道有没有更好的办法?如O(n)或O(nlogn)

  • 问题内容: 在Unix上,是否有任何方法可以使一个进程更改另一个环境的变量(假设它们都由同一用户运行)?一般的解决方案是最好的,但如果不是,那么一个孩子是另一个孩子的特殊情况呢? 编辑:如何通过gdb? 问题答案: 通过gdb: 当然,这是一个很讨厌的黑客,应该只在调试场景中进行。

  • 但我得到以下错误: 我错在哪里?

  • 问题内容: 我正在尝试为我的网站创建一个产品搜索,用户可以在其中搜索多种语言的产品,如果没有完全匹配的内容,则(希望)获得模糊的搜索结果。 我有一个带有列的表。 该列指的是其各自表中产品的ID。 这些列具有各种语言的每种产品的翻译后的meta。 元只是由空格分隔的关键字 是搜索词。 指用户选择的语言 因此,首先,我执行一个基本的“ LIKE” SQL查询以查看是否存在匹配项,如果没有结果,则查询所

  • 我最近接受了一次采访,采访者给了我以下场景,并问我将使用什么数据结构来实现它: 你有100个大理石,每个大理石是红色、蓝色或绿色。这些大理石被扔进一个袋子里,你需要有一些机制来取回一个随机的彩色大理石(带有替换品)。 好吧,很简单。在问了一些关于约束的问题后,我告诉他我会使用一个简单的数组,其中每个桶代表一个大理石。随机数函数可以用来索引数组,从而产生一个随机的彩色大理石。 这个解决方案很好,但他

  • 问题内容: 大家好,我有以下问题。我的MySQL数据库中有一个保留表,日期列定义为DATETIME。我需要使用hibernate进行查询以找到一天中的所有储备,无论是小时还是同一年的月份和日期,而我正在这样做 … 我真的不知道如何进行比较,并只带给我指定日期的信息,没有任何帮助吗? 问题答案: 我希望有一种与日期无关的将日期时间转换为日期的方法。通常,这就是我处理您的情况的方式。