1

Spring Security と Spring Boot を使用して、4 つの異なる LDAP プロバイダーに渡されたユーザー資格情報をチェックする構成に成功しました。ユーザーが最初のサーバーに存在しない場合は、2 番目のサーバーがチェックされます。すべてのプロバイダーが利用可能な場合、これは完全に機能します。ただし、プロバイダーの 1 つがダウンしている場合、認証チェーンは停止し、Spring は承認されていない例外を返します。

認証は REST ベースのサービス用であるため、失敗ハンドラーを使用して別の URL にリダイレクトしても、状況が改善されるとは思えません。

コンテキスト ソースの urls プロパティについては知っていますが、プライマリ LDAP サーバーと同じ構成を持つミラーリングされた LDAP サーバーへのフェイルオーバーにのみ使用されると判断できます。この構成ではそうではなく、各 LDAP サーバーには独自の別個の構成があります。

複数の StackOverflow の質問と、Spring のドキュメントとアーカイブされたフォーラムを確認しました。私が見たすべての質問と構成は、ミラーリングされたフェイルオーバー構成に関するものであるか、基本的に私が使用している構成と同じものです。

Groovy クラスを介して構成された現在の構成と AuthenticationManager のセットアップは、次のようになります。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .anyRequest().authenticated()                                                   
            .and()
        .httpBasic()

    http.httpBasic().realmName("Service Authorization")
}


@Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception {

    authManagerBuilder.ldapAuthentication()
        .userSearchFilter("${ldapExtConfig.userSearchFilter}")
        .contextSource().url("${ldapExtConfig.url}/${ldapExtConfig.baseDn}")
        .managerDn("${ldapExtConfig.managerDn}")
        .managerPassword("${ldapExtConfig.managerPassword}")

    authManagerBuilder.ldapAuthentication()
        .userSearchFilter("${ldapAmerConfig.userSearchFilter}")
        .contextSource().url("${ldapAmerConfig.url}/${ldapAmerConfig.baseDn}")
            .managerDn("${ldapAmerConfig.managerDn}")
            .managerPassword("${ldapAmerConfig.managerPassword}")

    authManagerBuilder.ldapAuthentication()
        .userSearchFilter("${ldapEmeaConfig.userSearchFilter}")
        .contextSource().url("${ldapEmeaConfig.url}/${ldapEmeaConfig.baseDn}")
        .managerDn("${ldapEmeaConfig.managerDn}")
        .managerPassword("${ldapEmeaConfig.managerPassword}")

    authManagerBuilder.ldapAuthentication()
        .userSearchFilter("${ldapApacConfig.userSearchFilter}")
        .contextSource().url("${ldapApacConfig.url}/${ldapApacConfig.baseDn}")
        .managerDn("${ldapApacConfig.managerDn}")
        .managerPassword("${ldapApacConfig.managerPassword}")

}

Spring Boot は軽量であるため、これを複数の war/jar ファイルに分割できましたが、そのソリューションはサーバー マネージャーによって拒否されました。カスタム認証プロバイダーの実装を検討し、一連の試行をラップする必要がありますか?

最初の AuthenticationProvider が接続できない場合、Spring Security を構成して後続の AuthenticationProvider を引き続き試行する方法はありますか? これは可能であると思いますが、それ以外の場合、複数のタイプのプロバイダーを指定できることの有用性はいくぶん制限されます。ありがとう!

更新:これをローカルに複製するためにいくつかの作業を行いましたが、思うように動作させることができません。また、Spring Security のログを DEBUG に設定してもログ メッセージを取得できません。ただし、返された JSON 応答でいくつかの追加情報を取得できます。以下のメッセージでは、ホスト名が意図的に変更されています。

{
  "error": "Unauthorized",
  "message": "ldapserver:636; nested exception is javax.naming.CommunicationException: ldapserver:636 [Root exception is java.net.UnknownHostException: ldapserver]",
  "status": 401,
  "timestamp": 1404924353023
}

そのため、Spring Security LDAP プロバイダーが通信例外をラップし、ログに記録せず、自動的に Unauthorized 例外に変換しているように見えます。特に構成で複数のプロバイダーが指定されているため、これは私が予想する動作ではありません。

更新 2: 上記の不明なホストの例外と表示されていることはわかっています。通信タイプの例外を取得するために、意図的に最初のサーバーのホスト名を誤って入力しました。テスト中にネットワークがサーバーに一時的に到達できなかった場合も、同じようなことが起きていました。

4

0 に答える 0