2017-11-23 32 views
1

私のWebアプリケーションのユーザをLDAPおよびその他のカスタム認証で認証する必要があります。これはKotlinで書かれたSpring Bootアプリケーションです。 CustomAuthenticationProviderの認証が成功した場合(機能認証がスローされません)ように、認証はLDAP認証プロバイダを使用し続けてチェーンに私が欲しいSpring Security複数の認証プロバイダが成功しました

@Autowired 
lateinit var authenticationProvider: CustomAuthenticationProvider 

override fun configure(auth: AuthenticationManagerBuilder) { 
    auth 
      .authenticationProvider(authenticationProvider) 

    auth 
      .ldapAuthentication() 
       .userDnPatterns("uid={0},ou=people") 
       .groupSearchBase("ou=groups") 
       .contextSource() 
       .url("ldap://localhost:8389/dc=example,dc=com") 
      .and() 
       .passwordCompare() 
       .passwordEncoder(PlaintextPasswordEncoder()) 
       .passwordAttribute("userPassword") 
} 

認証を次のように私はAuthenticationManagerBuilderを設定しています。

CustomAuthenticationProviderが正常に認証された場合、LDAP認証(およびその後の認証プロバイダ)は評価されません。 CustomAuthenticationProviderがスローする場合のみ、LDAP認証が実行されます。

私は複数の認証プロバイダを持っているが、AND動作ではなくOR動作をしていることを詳述している記事(例:Multiple Authentication Providers in Spring Security)を読んでいます。助言がありますか?

+1

どうすればよいですか?認証プロバイダが認証を公開している場合、LDAP認証はなぜ認証されているのですか?すでに認証されています。唯一の方法は、認証プロバイダが認証を公開しないことです。あなたはまだ認証されていません。 – dur

答えて

1

多分私はいくつか持っています。しかし、これまでに何が起こっているのかを分析してみましょう。

Spring Security(ProviderManager)のデフォルトの認証マネージャ実装では、認証プロバイダのリストが維持され、正常な認証を実行する最初のものがチェーンを停止します。残りは呼び出されません。あなたはそれを変えることはできないと確信しています。 AuthenticationManagerBuilderを使用する場合は、ProviderManagerに認証プロバイダを追加します。 (詳細は簡潔のためにスキップされ)、これは次のようになり、ソースコード内の

Security architecture

何が起こっているかの高レベルの概要は、以下の画像に示されている

public Authentication authenticate(Authentication authentication) 
      throws AuthenticationException { 
     Class<? extends Authentication> toTest = authentication.getClass(); 
     ... 
     for (AuthenticationProvider provider : getProviders()) { 
      if (!provider.supports(toTest)) { 
       continue; 
      } 

      try { 
       result = provider.authenticate(authentication); 

       if (result != null) { 
      ... 
        break; 
       } 
      } 
     ... 
      catch (AuthenticationException e) { 
       lastException = e; 
      } 
     } 

     if (result != null) { 
      ... 
      return result; 
     } 
    } 

あなたは何をすることができますか... hm。 @durの質問はまず有効です:-)第2に、あなたが私に合った標準の認証マネージャーであなたがしたいことをすることができないことは明らかです。

  1. は、あなたのフィルタチェーンの独自の認証マネージャの実装を提供します:私は考えて何

    あなたはまだそのように行きたい場合は、二つのことを試すことができることです。これは私にとっては少し難しいようです。

  2. カスタム認証プロバイダが必要なすべての認証処理を処理していることを確認します。
関連する問題