ActiveDirectoryLdapAuthenticationProvider |如何提供主要资格

时间:2018-10-09 21:31:37

标签: spring-boot spring-security ldap spring-ldap

  1. 我正在使用Spring Boot应用程序。我不知道如何在AuthenticationManagerBuilder的身份验证提供程序ActiveDirectoryLdapAuthenticationProvider对象中设置主体凭据。它只是具有setSearchFilter来查找用户是否存在于组中。但是,如何提供用于认证Web用户的主要凭据?我注意到,当我提供正确的凭据时,重新加载需要花费2秒以上的时间,但是身份验证仍然失败(登录?错误重定向)。但是对于错误的credentails,将抛出无效的密码消息。

  2. 此外,如何将用户名从电子邮件ID覆盖为samaccountname

  3. (&&(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);
    

    }

1 个答案:

答案 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);
        }
    }
}