我正在使用Spring Boot应用程序。我不知道如何在AuthenticationManagerBuilder的身份验证提供程序ActiveDirectoryLdapAuthenticationProvider对象中设置主体凭据。它只是具有setSearchFilter来查找用户是否存在于组中。但是,如何提供用于认证Web用户的主要凭据?我注意到,当我提供正确的凭据时,重新加载需要花费2秒以上的时间,但是身份验证仍然失败(登录?错误重定向)。但是对于错误的credentails,将抛出无效的密码消息。
此外,如何将用户名从电子邮件ID覆盖为samaccountname
(&&(objectClass = user)(userPrincipalName = {0})(memberOf = groupname))-这失败了,userPrincipalName = {0}代表什么?
@Override 公共无效configure(AuthenticationManagerBuilder auth)引发异常 { ActiveDirectoryLdapAuthenticationProvider adProvider = 新的ActiveDirectoryLdapAuthenticationProvider(domain,url,userBaseDn); adProvider.setConvertSubErrorCodesToExceptions(true); adProvider.setUseAuthenticationRequestCredentials(true);
// set pattern if it exists
// The following example would authenticate a user if they were a member
// of the ServiceAccounts group
// (&(objectClass=user)(userPrincipalName={0})
// (memberof=CN=ServiceAccounts,OU=alfresco,DC=mycompany,DC=com))
if (userDnPattern != null && userDnPattern.trim().length() > 0)
{
adProvider.setSearchFilter(userDnPattern);
}
auth.authenticationProvider(adProvider);
// don't erase credentials if you plan to get them later
// (e.g using them for another web service call)
auth.eraseCredentials(false);
}
答案 0 :(得分:0)
我可以回答您的一些问题,但分享您的主要问题。
2和3的答案有关。
(&(objectClass=user)(userPrincipalName={0})
是默认搜索过滤器可以替换为
sAMAccountName={0}
对于过滤器,如果发现它适合您的设置。
((&cn={0})) // works for me
这仅与通过LDAP返回的AD记录中的字段匹配,表达式{0}
是搜索时将替换凭证ID的位置。您将调整此语句以匹配要应用于Active Directory搜索的目录结构和筛选。如果提供的过滤条件太少或不够充分,则会引发类似以下的异常:
预期1但发现5
但是,我怀疑像您一样,但不知道是否可以直接设置主体安全性。翻阅test cases,它似乎是一个带有Spring自动魔术功能的函数,因为这样做的方法被隐藏在隐藏的ContextFactory中。
但是,如果您愿意为此尝试其他Spring类,this answer着重介绍了将GlobalAuthenticationConfigurerAdapter作为嵌套类扩展到WebSecurityConfigurerAdapter的方法,您可以 设置基础DN:
contextSource.setBase("OU=MyCo Global,DC=myco");
完整代码取自上面链接的示例:
@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/css/**").permitAll().anyRequest()
.fullyAuthenticated().and().formLogin();
}
@Configuration
protected static class AuthenticationConfiguration extends
GlobalAuthenticationConfigurerAdapter {
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource("ldap://<url>");
contextSource.setUserDn("<username>");
contextSource.setPassword("<password>");
contextSource.setReferral("follow");
contextSource.afterPropertiesSet();
LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthenticationProviderConfigurer = auth.ldapAuthentication();
ldapAuthenticationProviderConfigurer
.userSearchFilter("(&(cn={0}))")
.userSearchBase("")
.contextSource(contextSource);
}
}
}