我正在构建一个应用程序,它只允许我的组织中的一组特定用户登录。只有属于特定AD组的用户才能登录。例如:GDL -我的团队是一个GDL,只有谁的成员,我想允许进入。我检查了亚特兰蒂斯的tutorial,汇合的tutorial以及Megha的答案here。
与其他堆栈溢出问题相比,我的例子中的不同之处在于我使用了ActiveDirectoryLdapAuthenticationProvider
,正如下面的代码片段所示,这是一个指定的术语。
然而,我的应用程序仍然允许组织中的任何用户进入我的应用程序。我真的不能理解它使用什么标准来允许任何人。我完全是一个新手ldiff语法和过滤ldap使用Java。合并springboot,我真的不知道我是否应该使用组搜索库或用户搜索库。我只是希望我的GDL的人能够进入。Rest应收到身份验证失败。
下面是我的代码文件以供参考:
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
configureLdap(auth);
configureActiveDirectory(auth);
}
private void configureLdap(AuthenticationManagerBuilder auth) throws Exception {
auth
.ldapAuthentication()
.contextSource(contextSource())
.userSearchFilter("(&(objectClass=user)(sAMAccountName=*)(memberOf=cn=GDL-MyTeam,ou=users,dc=myCompany,dc=com)))")
.passwordCompare()
.passwordEncoder(passwordEncoder())
.passwordAttribute("userPassword");
}
private void configureActiveDirectory(AuthenticationManagerBuilder auth) {
ActiveDirectoryLdapAuthenticationProvider adProvider = activeDirectoryLdapAuthenticationProvider();
if (adProvider != null) {
auth.authenticationProvider(adProvider);
auth.eraseCredentials(false);
}
}
@Bean(BeanIds.AUTHENTICATION_MANAGER)
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Bean
public LdapContextSource contextSource() {
LdapContextSource contextSource = new LdapContextSource();
contextSource.setUrl(ldapUrls); //mycompany.com:389
contextSource.setBase(ldapBaseDn); //dc=myCompany,dc=com
contextSource.setUserDn(env.getProperty(ldapSecurityPrincipal));
contextSource.setPassword(env.getProperty(ldapPrincipalPassword));
contextSource.setReferral("follow");
contextSource.afterPropertiesSet();
return contextSource;
}
@Bean
protected ActiveDirectoryLdapAuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("myCompany.com", ldapUrls,
ldapBaseDn);
provider.setConvertSubErrorCodesToExceptions(true);
provider.setUseAuthenticationRequestCredentials(true);
provider.setUserDetailsContextMapper(new CustomUserDetailsContextMapper());
return provider;
}
@Bean
public LdapTemplate ldapTemplate() {
LdapTemplate template = new LdapTemplate();
template.setContextSource(contextSource());
template.setIgnoreNameNotFoundException(true);
template.setIgnorePartialResultException(true);
return template;
}
我相信这个过滤器是我指定正确匹配条件的地方,但是由于某种原因,它允许每个人而不仅仅是我的团队的特定GDL。
.userSearchFilter("(&(objectClass=user)(sAMAccountName=*)(memberOf=cn=GDL-MyTeam,ou=users,dc=myCompany,dc=com)))")
有没有人能提供指导,我哪里错了。非常感谢!
编辑:我发现是ActiveDirectoryLdapAuthenticationProvider
决定了搜索条件。我相信这就是我需要放入搜索过滤器的地方。如果我放入与其他答案完全相同的过滤器
In order to perform this operation a successful bind must be completed on the connection., data 0, v3839]; remaining name '/'
但我真的不知道该写些什么。能给点建议吗?
1条答案
按热度按时间w3nuxt5m1#
我想知道这是否是问题所在:
您使用
sAMAccountName=*
(带 *)。在我看来像是通配符,表示任何人?。如果您将其替换为{1}
,如