2016-04-07 6 views
0

BacicAuthのヘッダーが指定されていない場合、私の認証メカニズムがデフォルトユーザーを返すようにします。私は、このようにそれを実行しようとしました:Dropwizard Auth - ヘッダーが指定されていない場合にデフォルトユーザーを返す方法

@Override 
    public Optional<User> authenticate(final BasicCredentials basicCredentials) throws AuthenticationException { 

     String email = basicCredentials.getUsername(); 
     String plaintextPassword = basicCredentials.getPassword(); 

     final Optional<User> user = Optional.of(userDao.getUserByEmail(email)); 

     if (user.isPresent()) { 
      return user; 
      } 
     else { 
      return Optional.of(defaultUser); 
     } 
    } 

しかし、私は適切なヘッダーのない要求を行う際に何らかの形で、私はまだ401を取得します。

どうすればいいですか?

答えて

2

したがって、基本認証ヘッダーがない場合、ヌルBasicCredentialsが事前認証プロセスに渡され、認証されていないエラーの自動応答が行われます。ヘッダーがあることを確認する必要があります。これを行うには、Dropwizard認証フィルタの前に実行するJerseyフィルタを登録します。デフォルトのユーザー名とパスワードのヘッダーを追加できます。

import java.io.IOException; 
import javax.annotation.Priority; 
import javax.ws.rs.Priorities; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.core.HttpHeaders; 
import org.glassfish.jersey.internal.util.Base64; 

@Priority(Priorities.AUTHENTICATION - 100) 
public class PreAuthenticationFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext request) throws IOException { 
     boolean hasValidHeader = false; 
     if (request.getHeaders().containsKey(HttpHeaders.AUTHORIZATION)) { 
      final String header = request.getHeaderString(HttpHeaders.AUTHORIZATION); 
      if (header.toLowerCase().startsWith("basic")) { 
       hasValidHeader = true; 
      } 
     } 
     if (!hasValidHeader) { 
      final String defaultUser = "defaultUser"; 
      final String defaultPassword = "defaultPassword"; 
      final String base64 = Base64.encodeAsString(defaultUser + ":" + defaultPassword); 
      request.getHeaders().putSingle(HttpHeaders.AUTHORIZATION, "Basic " + base64); 
     } 
    } 
} 

それからちょうど感謝

+0

DW env.jersey().register(PreAuthenticationFilter.class);に登録!それは完全に働いた – VanDavv

+0

質問は、フィルタを使用する場合は、なぜそのフィルタですぐに認証をしないのですか?私の意見では、DW認証は、私が重要だと感じる制御を取り除くので、少し欠陥があります。私はDWのアプローチを使用して、フィルタでauthを行うことを好む。多くの人が私と同じ問題に遭遇しました。 – pandaadb

+0

authN/authZチェーンにはいくつかのフィルタがあります。まず、認証フィルタです。 Dropwizardは、このフィルタでオーセンティケータを使用します。認可者を呼び出すJersey認可(rolesallowed)フィルター。異なるフィルタでは異なる処理が行われます。たぶん、あなたが欠点を見るのはプロセスではなく、認証フィルタの実装です。特定のユースケースについては、はい、私はそれがこの作品を使用しなければならない負担であることに同意します。しかし、それは実装されている方法です。 –

関連する問題