3

org.springframework.ldap.core.LdapTemplate#ignorePartialResultException長い質問をお詫びしますが、要するに、 Spring Java Config を使用してフラグを設定するにはどうすればよいのか疑問に思っています。

長々とした質問は...

私は会社の Active Directory を認証 (これはユーザー/パスワードのチェックを意味します) に使用して開始し、その後、承認 (つまり、どのロールを使用する権限があるか) に取り組みたいと考えています。

の LDAP ガイドを使用して、ガイドの LDIF ファイルを使用する代わりに、会社の Active Directory に接続するように変更を加えました。デバッグから、プログラムが Active Directory に接続してユーザーを正しく認証することはわかっていますが、権限を取得するときに次の例外が発生します。

Unprocessed Continuation Reference(s); nested exception is javax.naming.PartialResultException

グーグルで調べたところ、これは一般的な LDAP/ActiveDirectory の問題であり、参照を無視するようにフラグを設定する必要があることがわかりました。この SO questionの例に従いました。ただし、それでも例外が発生し、デバッグから、ユーザーのロールを検索するときに次のメソッドでエラーが発生していることがわかります。

org.springframework.ldap.core.LdapTemplate#search(org.springframework.ldap.core.SearchExecutor, org.springframework.ldap.core.NameClassPairCallbackHandler, org.springframework.ldap.core.DirContextProcessor) 

参考までに、私の WebSecurityConfig ファイル:

    @Bean
    public BaseLdapPathContextSource contextSource() throws Exception {
        DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource("ldap://<ad-host>:389/");

        contextSource.setUserDn(/*principleCN*/);
        contextSource.setPassword(/*principlePassword*/);
        contextSource.setReferral("ignore"); 
        contextSource.afterPropertiesSet();

        return contextSource;
    }

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        auth.ldapAuthentication()
                .userSearchFilter("(&(sAMAccountName={0})(objectclass=user))")
                .userSearchBase("dc=<company>,dc=local")
                .groupSearchBase("dc=<company>,dc=local")
                .contextSource(contextSource());
    }
4

1 に答える 1

6

を介してこれを達成できると私が言えることはDefaultLdapAuthoritiesPopulatorsetIgnorePartialResultException(boolean)まさにこれを達成する方法があります。

したがって、構成クラスでは、次の行に沿って何かを行う必要があります。

@Bean
public LdapAuthoritiesPopulator ldapAuthoritiesPopulator() throws Exception {
    DefaultLdapAuthoritiesPopulator populator = new DefaultLdapAuthoritiesPopulator(contextSource(), "dc=<company>,dc=local");
    populator.setIgnorePartialResultException(true);
    return populator;
}

@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
    auth.ldapAuthentication()
            .userSearchFilter("(&(sAMAccountName={0})(objectclass=user))")
            .userSearchBase("dc=<company>,dc=local")
            .contextSource(contextSource())
            .ldapAuthoritiesPopulator(ldapAuthoritiesPopulator());
}

1 つの注意点は、これを明示的にテストしていないため、構成を少しいじる必要があるかもしれないということです。

于 2014-12-19T11:03:05.350 に答える