2014-10-30 4 views
2

Java 구성 및 LDAP 인증/권한 부여와 함께 Spring Security 3.2.5를 사용하고 있습니다.스프링 보안 Java 구성 다중 그룹 검색베이스

우리는 LDAP의 두 개의 별도 트리에서 그룹을 검색해야합니다.

OU = 그룹

OU = 그룹, OU = 웹 어플리케이션, OU =

응용 프로그램

내가 검색 한이 주제에 대한 정보를 찾을 수 없었습니다.

이 잘 작동 내 현재 코드 :

@Autowired 
public void configureGlobal(UserDetailsContextMapper userDetailsContextMapper, LdapContextSource contextSource, AuthenticationManagerBuilder builder) throws Exception { 


    builder 
    .ldapAuthentication() 
     .userDetailsContextMapper(userDetailsContextMapper) 
     .contextSource(contextSource) 
     .userSearchFilter("cn={0}") 
     .userSearchBase("ou=Users") 
     .groupSearchBase("ou=groups"); 


} 

나는 이런 식으로 뭔가를 할 :

builder 
    .ldapAuthentication() 
     .userDetailsContextMapper(userDetailsContextMapper) 
     .contextSource(contextSource) 
     .userSearchFilter("cn={0}") 
     .userSearchBase("ou=Users") 
     .groupSearchBase("ou=groups") 
     .groupSearchBase("ou=Groups,ou=webapps,ou=Applications"); 

당연히 작동하지 않습니다.

누구나 어디서부터 시작해야합니까?

+0

질문에 대한 해결책을 찾았습니까? 나는 똑같은 것을 찾고있다. 고맙습니다. –

답변

0

내 솔루션은 LdapAuthoritiesPopulator의 여러 인스턴스를 호출 할 수있는 org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator의 구현을 만드는 것이 었습니다. 그런 다음 쿼리하려는 'groupSearchBase'마다 하나씩 LdapAuthoritiesPopulator을 만듭니다.

@Autowired 
public void configureGlobal(UserDetailsContextMapper userDetailsContextMapper, LdapContextSource contextSource, AuthenticationManagerBuilder builder) throws Exception { 

    MultipleLdapAuthoritiesPopulator multipleLdapAuthoritiesPopulator = new MultipleLdapAuthoritiesPopulator(
     new DefaultLdapAuthoritiesPopulator(contextSource, "ou=Groups,ou=webapps,ou=Applications"), 
     new DefaultLdapAuthoritiesPopulator(contextSource, "ou=groups")); 

    builder 
     .ldapAuthentication() 
      .ldapAuthoritiesPopulator(multipleLdapAuthoritiesPopulator) 
      .userDetailsContextMapper(userDetailsContextMapper) 
      .contextSource(contextSource) 
      .userSearchFilter("cn={0}") 
      .userSearchBase("ou=Users"); 
} 

class MultipleLdapAuthoritiesPopulator implements LdapAuthoritiesPopulator { 
    private List<LdapAuthoritiesPopulator> authoritiesPopulators; 

    public MultipleLdapAuthoritiesPopulator(LdapAuthoritiesPopulator...authoritiesPopulators) { 
     this.authoritiesPopulators = asList(authoritiesPopulators); 
    } 

    @Override 
    public Collection<? extends GrantedAuthority> getGrantedAuthorities(DirContextOperations userData, String username) { 
     List<GrantedAuthority> grantedAuthorities = authoritiesPopulators.stream() 
      .map(authPopulator -> authPopulator.getGrantedAuthorities(userData, username)) 
      .flatMap(Collection::stream) 
      .collect(Collectors.toList()); 

     return grantedAuthorities; 
    } 
}