2017-05-04 21 views
5

私はSpringデータを使用しています。LDAPとSpring Bootは、組み込みのUnboundIDサーバのサポートをすぐに提供します。ただし、Spring Data LDAPの@Entry注釈を使用する場合、埋め込みUnboundID LDAPサーバを使用しているのか、リモートActive Directoryサーバを使用しているのかに基づいて、別のbaseを注釈に指定する必要があります。SpELはSpringアノテーションでサポートされていません@ Entry.base

私が指定することにより、SpeIおよびプロファイルベースのプロパティでこれを行うにしようとした

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

その後、私はldap.person.base=OU=Embedded Person Baseldap.person.base=OU=AD Person Baseapplication-embedded.propertiesapplication.propretiesを持っています。

しかし、@Entry注釈はSPEL評価をサポートしていないよう:

javax.naming.InvalidNameException:無効な名:$ {} ldap.person.base

open issueがありますこれをサポートするにはSpring LDAPでサポートしますが、Spring LDAPでサポートされるまでこれを回避する方法や他の方法がありますか?

+0

https://github.com/spring-projects/spring-ldap/issues/444に公開されている問題があります。 –

+0

@PavanKumarJorrigalaありがとうございました - 質問へのリンクを追加しました。私はちょうど最近、同様にそれを発見した。 –

答えて

1

最初に別のbaseが必要な理由がわかりました。なぜなら、春はをContextSourceに設定していなかったからです。あなたが聞かせたとき

は春ブーツは、それが 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; 
} 

。だから、これを解決するために、私は@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

ここではわかりませんが、SpringブートでLDAP自動設定を使用していると仮定して、プロパティーspring.ldap.baseを設定するだけでは不十分ですか(OU=AD Person BaseまたはOU=Embedded Person Base)あなたが使っているプロフィールで?

両方EmbeddedLdapAutoConfigurationLdapAutoConfigurationそのbase含む、豆の作成時LdapContextSource上の様々な属性を設定するLdapPropertiesオブジェクトを使用します。私が言うことができる限り、LdapContextSource.baseが設定されている場合は、コードベース内の各@Entryに対して定義する必要はありません。

自動設定を使用しておらず、自分の前提に合っていれば、独自のLdapContextSource beanを作成して、baseをSpringプロパティに基づいて希望の値に設定することができます。

+0

これを行うと、埋め込みバージョンで動作しますが、 'javax.naming.PartialResultException:未処理の継続参照。アプリケーションがActive Directoryに対してLDAP検索を実行するときに残りの名前 '/'を返します。私の 'Person'エントリに' base = "OU = Domain Users"を指定すると、それは動作しますが、それは埋め込みバージョンを破ります。 –

関連する問題