我仍在学习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}))”;
这将是理想的情况,但我不知道这是否可以覆盖任何地方,而且我找不到任何文档?
当我发现这对解决我自己的问题非常有帮助时,我只想补充一点,@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进行查询以找到一天中的所有储备,无论是小时还是同一年的月份和日期,而我正在这样做 … 我真的不知道如何进行比较,并只带给我指定日期的信息,没有任何帮助吗? 问题答案: 我希望有一种与日期无关的将日期时间转换为日期的方法。通常,这就是我处理您的情况的方式。