2017-05-04 4 views
5

저는 스프링 데이터를 사용합니다. LDAP 및 스프링 부트는 임베디드 언 바운드 ID 서버에 대한 즉시 지원을 제공합니다. 그러나 스프링 데이터 LDAP의 @Entry 주석을 사용할 때 포함 된 UnboundID LDAP 서버를 사용하는지 또는 원격 Active Directory 서버를 사용하는지에 따라 주석에 다른 base을 지정해야합니다.SpEL은 Spring 어노테이션 @ Entry.base에서 지원되지 않습니다.

내가 지정하여 SpEL을하고 프로파일 기반 특성이 작업을 수행하려고 시도했습니다 :

@Entry(base = "${ldap.person.base}", ...) 

가 그럼 난 ldap.person.base=OU=AD Person Baseapplication.propretiesldap.person.base=OU=Embedded Person Baseapplication-embedded.properties 있습니다.

javax.naming.InvalidNameException :

그러나, @Entry 주석 SpEL을 평가를 지원하지 않는 것 잘못된 이름 : $ {ldap.person.base}

open issue있다 이를 지원하기 위해 Spring LDAP에서,하지만 해결 방법이나 Spring LDAP에서 지원 될 때까지 이것을 수행 할 수있는 다른 방법이 있습니까?

+0

https://github.com/spring-projects/spring-ldap/issues/444에 공개 된 문제가 있습니다. –

+0

@PavanKumarJorrigala 감사합니다. 질문에 대한 링크가 추가되었습니다.나는 최근에 그것도 발견했다. –

답변

1

스프링이 을 ContextSource에 설정하지 않았기 때문에 처음에는 다른 base이 필요했던 이유가 나타납니다. 당신이 할 때

봄 부팅은 EmbeddedLdapAutoConfiguration에서 같은 ContextSource 생성, 포함 된 LDAP 서버를 자동 구성 : 당신이 볼 수 있듯이,이 않습니다 어디에서이 source.setBase() 전화

@Bean 
@DependsOn("directoryServer") 
@ConditionalOnMissingBean 
public ContextSource ldapContextSource() { 
    LdapContextSource source = new LdapContextSource(); 
    if (hasCredentials(this.embeddedProperties.getCredential())) { 
     source.setUserDn(this.embeddedProperties.getCredential().getUsername()); 
     source.setPassword(this.embeddedProperties.getCredential().getPassword()); 
    } 
    source.setUrls(this.properties.determineUrls(this.environment)); 
    return source; 
} 

. 그래서이 문제를 해결하기 위해, 나는 (I가 포함 된 서버에 대한 자격 증명을 사용하지 않기 때문에 나는 자격 증명 부분을 생략 할) @Profile("embedded")로 구성 파일을 추가하고 수동 나는 base에게 자신을 설정 어디 ContextSource을 만들어 :

@Configuration 
@Profile("embedded") 
@EnableConfigurationProperties({ LdapProperties.class }) 
public class EmbeddedLdapConfig { 

    private final Environment environment; 
    private final LdapProperties properties; 

    public EmbeddedLdapConfig(final Environment environment, final LdapProperties properties) { 
     this.environment = environment; 
     this.properties = properties; 
    } 

    @Bean 
    @DependsOn("directoryServer") 
    public ContextSource ldapContextSource() { 
     final LdapContextSource source = new LdapContextSource(); 
     source.setUrls(this.properties.determineUrls(this.environment)); 
     source.setBase(this.properties.getBase()); 
     return source; 
    } 
} 

이제 base 속성의 값을 내 @Entry의 Active Directory 서버와 포함 된 UnboundID 서버에 대해 동일하게 유지하면 제대로 작동합니다.

+0

잘 작동하고 있습니다! 당신이 분명히 그것을 해결하기 위해 제안한 방법을 사용했기 때문에 내 대답을 upvoting 고려하십시오. –

2

여기서는 잘 모르겠지만 스프링 부트에서 LDAP 자동 구성을 사용한다고 가정하면 spring.ldap.base 속성을 설정하는 것만으로 충분하지 않으므로 (OU=AD Person Base 또는 OU=Embedded Person Base) 기반으로합니다. 당신이 사용하고있는 프로파일에?

모두 EmbeddedLdapAutoConfigurationLdapAutoConfigurationbase 포함, 콩 만드는 동안 LdapContextSource에 다양한 속성을 설정하는 LdapProperties 객체를 사용합니다. 지금까지 말할 수있는 한, LdapContextSource.base이 설정되어 있으면 코드베이스에 각각 @Entry에 대해 정의하지 않아도됩니다.

자동 구성을 사용하지 않고 제 가정에서 맞다면 자신 만의 LdapContextSource 빈을 만들고 스프링 등록 정보에 따라 base을 원하는 값으로 설정할 수 있어야합니다.

+0

이렇게하면, 임베디드 버전에서 작동하지만'javax.naming.PartialResultException : Unprocessed Continuation Reference (s); 응용 프로그램이 Active Directory에 대해 LDAP 검색을 수행 할 때 나머지 이름은 '/'입니다. 내'Person' 엔트리에'base = "OU = Domain Users"를 지정하면 작동하지만 그 다음에는 내장 버전이 깨집니다. –