Googleが何日も調査し、F * Spring Security Manualを読み、テストした後、私は必死になっています...
コンテキスト:Eurekaなどを使用してマイクロサービスアーキテクチャを実装しています... MySQL認証データベースで非常にうまく機能する認証サービスを実装しました。しかし今、私は適切に機能するOpenLDAPを介して会社のLDAPに参加したいと思っています。
だから、私は私の春のセキュリティ認証でLDAPに参加しようとしています。
configure()メソッドのコード(会社名とドメイン名を置き換えました。アカウント{0}は「テスト」です):
auth.ldapAuthentication()
.contextSource()
.url("ldap://myldap/ou=users,dc=mydomain,dc=mycompany")
.and()
.userDnPatterns("cn={0}");
また、これを書くためのさまざまな方法を試しましたが、常にBadCredentialsまたはLDAP32エラーが発生します。userDnPattern、usersearchbaseメソッド、passwordcompare、passwordencoderなどを使用します。また、DCをroot()メソッドに、OUをgroup ...()メソッドに配置しようとしましたが、変更はありません(実際、Spring SecurityはLDAP要求を送信する前にこれらのパラメーターをスマートに並べ替えると思います)。正直なところ、configure()メソッドを書くために357654の異なる方法を試しました...
問題は次のとおりです。LDAPエクスプローラソフトウェアに同じ構成、資格情報、ドメインを配置すると、正しく機能します。
そこで、WiresharkとのLDAPネットワーク交換を監視しました。これを見ました:Wireshark画面
ご覧のとおり、8つのリクエストが交換されています。最初の5つはOKです。それは私のアカウントを正しく「テスト」します。しかし、3つのオーバーリクエストがあります(unbindRequestが戻ってきます)。
問題は、Springが最後のリクエストの結果を表示し、アカウントが存在しないか、資格情報が機能しないなどと言ってしまうことです...
これの手がかりはありますか?SpringSecurityがLDAPに質問するためにどのように機能するか知っていますか?LDAPをフレームワークに適切に接続するにはどうすればよいですか?
読んでくれてありがとう。
Stack Overflowを手伝ってください、あなたが私の唯一の希望です...
私はついに問題を見つけて解決策を得ました。
私のエンタープライズLDAPは、ADの上のLDAPです。
また、このLDAP + ADはバインド認証を必要とし、匿名のバインドと認証を許可しません。
Spring Securityには、これを実行できるオブジェクトがあります:BindAuthenticator
これが私がそれを使おうとする方法です(そしてそれは機能します)。
@Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
authManagerBuilder.authenticationProvider(ldapAuthenticationProvider()).userDetailsService(userDetailsService());
}
@Bean
public LdapAuthenticationProvider ldapAuthenticationProvider() throws Exception {
LdapAuthenticationProvider lAP = new LdapAuthenticationProvider(ldapAuthenticator(), ldapAuthoritiesPopulator());
return lAP;
}
@Bean
public LdapContextSource ldapContextSource() throws Exception {
DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource([URL of the LDAP]);
return contextSource;
}
@Bean
public LdapAuthenticator ldapAuthenticator() throws Exception {
BindAuthenticator authenticator = new BindAuthenticator(ldapContextSource());
authenticator.setUserDnPatterns(new String[] {"CN={0},"+[MY ENTERPRISE LDAP FILTER]});
return authenticator;
}
このサンプルコードが一部の人々に役立つことを願っています...
ありがとうございました !
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加