1

안녕하세요 저는 Ldap으로 간단한 로그인을 만드는 데 문제가 있습니다. spring.io 웹 사이트에서 시작 프로젝트를 다운로드했습니다 : link 완벽하게 ldif 파일과 함께 작동하지만 ldap 서버를 실행하는 것으로 교체하고 싶습니다. 나는 진전이없는 날 동안 그것을 시도했다. ActiveDirectoryLdapAuthenticationProvider : Active Directory의 난 (시작 프로젝트의 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; 
    } 
} 

내가 "비밀번호"콘솔 출력 형식 "사용자 이름"좋은 사용자 이름과 암호로 로그인하려고하면 최상의 결과를 얻을 수 인증 실패 : 제공된 비밀번호가 잘못되었습니다.

"[email protected]"과 비밀번호를 사용하면 페이지가 콘솔에 출력되지 않고 다시로드됩니다.

I 임의의 사용자 이름과 암호 콘솔을 사용하는 경우 : 유효하지 않은

누군가가 도와 드릴까요 된 공급 비밀번호 : Active Directory 인증 실패를?

+0

당신이 ActiveDirectoryLdapAuthenticationProvider의 생성자에서 도메인에 대한 '널 (null)'에 사용 된 바와 같이, 당신은 'userPrincipalName 사용'을 사용해야합니다 ([email protected])이 작동하지 않는 이유를 찾기 위해 당신은 로깅을 설정 할 수 있습니다 를 인증하거나 LDAPS 또는 StartTLS 확장 작업을 사용하지 않는 경우 네트워크 추적에서 LDAP BIND 요청이 성공한 경우 –

답변

0

의견에서 제안한대로 로깅을 켜고 문제가 "[email protected]"과 동일하다는 것을 알았습니다.

문제는 aciveDirectoryLdapAuthenticationProvider()에 3 가지 문제점이있었습니다.

  1. 내가 여기서 rootdn에서 OU 그룹을 제거하고 추가 도메인 그래서 우리는 단지 사용하여 로그인 username을 할 수 있습니다.

    provider.setSearchFilter("(&(objectClass=user)(sAMAccountName={0}))"); 
    
  2. 마지막 I 공급자의

    ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider("domain.com", "ldap://ip:port/", "dc=domain,dc=com"); 
    
  3. 변경된 searchfilter "[email protected]"과 "username"의 sAMAccountName istead를 일치시키기 때문에 ActiveDirectoryLdapAuthProvider searchForUser 메서드를 변경해야했습니다. 이 :

    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; 
    } 

누군가가 두 번째/세 번째 문제에 대한 더 나은 솔루션을 제공 할 수 있습니까? 어쩌면 더 나은 검색 필터일까요? ActiveDirectoryLdapAuthProvider를 사용하는 bindPrincipal의 "[email protected]"형식과 일치하는 모든 필드가 ldap에 없습니다.

+0

안녕하십니까? user3551808, 로깅을 어떻게 설정했는지 알려주실 수 있습니까? 비슷한 오류가있어 더 많은 로깅을보고 싶지만 logback.xml을 사용하고 logback.xml 시작 부분에이 항목을 그냥했습니다. 'debug = "true", 그러나 도움이되지 않았다. –