1

你好,我有使用LDAP创建简单的登录问题。我已经从spring.io网站下载了入门项目:link它与ldif文件完美结合,但我想用运行ldap服务器替换它。我已经尝试了好几天没有进展。我与这段代码(在WebSecurityConfig取代入门项目)春季启动LDAP安全

@Configuration 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception { 
     authManagerBuilder.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).userDetailsService(userDetailsService()); 
    } 

    @Bean 
    public AuthenticationManager authenticationManager() { 
     return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider())); 
    } 
    @Bean 
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() { 
     ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(null, "ldap://ip:port/", "ou=GROUP,dc=domain,dc=com"); 
     provider.setConvertSubErrorCodesToExceptions(true); 
     provider.setUseAuthenticationRequestCredentials(true); 

     return provider; 
    } 
} 

如果我尝试用格式“用户名”,“密码”控制台输出良好的用户名和密码登录最好的结果:ActiveDirectoryLdapAuthenticationProvider:活动目录身份验证失败:提供的密码无效

如果我使用“[email protected]”和良好的密码,页面只是没有输出到控制台重新加载。

如果我使用随机用户名和密码控制台:Active Directory身份验证失败:提供的密码无效

有人能帮忙吗?

+0

正如你在ActiveDirectoryLdapAuthenticationProvider的构造函数中使用“空”的域名,则必须使用“的UserPrincipalName”([email protected])来验证 您可以启用日志记录,以找出为什么这不工作或如果你不使用LDAPS或StartTLS扩展操作的网络跟踪会肯定地告诉如果LDAP BIND请求成功 –

回答

0

正如评论所说我已经打开了记录,发现这个问题是同为“[email protected]”了。

问题已在aciveDirectoryLdapAuthenticationProvider()有在它3点的问题。

  1. 我已删除OU组从根DN并添加域,所以我们可以只使用用户名进行登录。

    ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("domain.com", "ldap://ip:port/", "dc=domain,dc=com"); 
    
  2. 改变searchfilter提供商的

    provider.setSearchFilter("(&(objectClass=user)(sAMAccountName={0}))"); 
    
  3. 最后我必须更改ActiveDirectoryLdapAuthProvider searchForUser方法,因为它与“[email protected]”匹配,而sAMAccountName不是“用户名”。这:

    return SpringSecurityLdapTemplate.searchForSingleEntryInternal(context, 
           searchControls, searchRoot, searchFilter, 
           new Object[] { bindPrincipal });  
    

    替换为:

    return SpringSecurityLdapTemplate.searchForSingleEntryInternal(context, 
          searchControls, searchRoot, searchFilter, 
          new Object[] { username }); 
    

完全aciveDirectoryLdapAuthenticationProvider():

@Bean 
    public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() { 
     ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("domain.com", "ldap://ip:port/", "dc=domain,dc=com"); 
     provider.setSearchFilter("(&(objectClass=user)(sAMAccountName={0}))"); 
     provider.setConvertSubErrorCodesToExceptions(true); 
     provider.setUseAuthenticationRequestCredentials(true); 
     return provider; 
    } 

有人可以提供第二/第三个问题更好的解决方案?也许更好的searchfilter?我在ldap中没有任何与使用ActiveDirectoryLdapAuthProvider的bindPrincipal的“[email protected]”格式匹配的字段。

+0

嗨@ user3551808,可以请你告诉我怎么和你在哪里打开日志记录?我也有类似的错误,我希望看到更多的日志记录,但它似乎并没有发生,我用logback.xml,我只是做了在logback.xml的开始此项:'调试=‘真’,但它似乎没有帮助。 –