gpt4 book ai didi

java - Spring Security for Active Directory 搜索为 'userPrincipalName'——有办法改变这个吗?

转载 作者:行者123 更新时间:2023-12-02 05:42:14 25 4
gpt4 key购买 nike

我仍在学习 LDAP/Active Directory,因此如果我的术语有任何错误,请纠正我:)

在我们的 Java Web 应用程序中,我尝试使用 Spring Security LDAP 来保护它。我设法让 Spring Security 与内存中身份验证一起工作,但我们需要将其绑定(bind)到我们的 AD 服务器。

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

这是我尝试从应用程序登录时收到的错误

13:39:55,701 ERROR ActiveDirectoryLdapAuthenticationProvider:133 - Failed to locate directory entry for authenticated user: johnsmit javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of: '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();

}
}

所以这就是问题(至少我认为)......在我们的 AD 服务器中,我们有cnnamesAMAccountNameuid 作为我们登录的用户名,johnsmit 在我上面的例子中。

我们的 userPrincipalName(在我们的 AD 服务器中)是我们的电子邮件地址,因此 john.smith@test.com

我正在查看ActiveDirectoryLdapAuthenticationProvider类,它说它使用 userPrincipalName。查看代码here on github它表明它正在使用 userPrincipalName。我检查了 Spring Security 的较新版本,虽然还没有正式发布,但它是一样的。

我一定可以通过某种方式使用用户名“johnsmit”而不是“john.smith@test.com”搜索 AD...

如果 searchFilter 是String searchFilter = "(&(objectClass=user)(sAMAccountName={0}))"; 这将是理想的情况,但我不知道是否可以在任何地方覆盖,我可以找不到任何文档?

最佳答案

由于我发现这对于解决我自己的问题非常有帮助,所以我想补充一下 @JanTheGun 建议的更改似乎已合并到 Spring Security 5.0.8.RELEASE/Spring Boot 2.0.5

ActiveDirectoryLdapAuthenticationProvider.setSearchFilter(String) 的 JavaDoc 内容如下:

The LDAP filter string to search for the user being authenticated. Occurrences of {0} are replaced with the username@domain. Occurrences of {1} are replaced with the username only.

Defaults to: (&(objectClass=user)(userPrincipalName={0})))

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

关于java - Spring Security for Active Directory 搜索为 'userPrincipalName'——有办法改变这个吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24418952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com