2016-09-28 9 views
0

私たちはdropwizard 0.9.Xを使用しています。データを取得する前にユーザーが入力したトークンを認証するように作成されたカスタマイズされたクラスがあります。私は最初の不正なメッセージをカスタマイズしたい "資格はこのリソースにアクセスする必要があります。 JSON形式に変換すると、私は以下のように表示したいと思います。Javaのjsonフォーマットへのdropwizard初期無許可メッセージのカスタマイズ

{ 
 
    "code": 401, 
 
    "message": "HTTP 401 Unauthorized, Credentials are required to access this resource." 
 
}

私はStatusTypeを実装するためにAbstractStatusTypeを書いていると私は、ユーザーが無効なトークンまたは期限切れのトークンを入力するたびに上記の形式のメッセージを印刷することができています。例bearer 03cb9ebe-1c66-4d08-b9a4-afe69989ef21

しかし、私はまだ "このリソースにアクセスするには資格情報が必要です"という計画のテキストレスポンスボディを取得しています。ユーザーが「ベアラ」だけを入力した場合、またはトークン「03cb9ebe-1c66-4d08-b9a4-afe69989ef21」

をJSON形式より上位にカスタマイズする手助けをしてください。

以下は、「このリソースにアクセスするには資格情報が必要です」という応答を設定しているカスタマイズされたコードです。内部的にはdropWizardを使用していますOAuthCredentialAuthFilterクラス

public AuthDynamicFeature getAuthFilter(CachingAuthenticator<String, AuthenticatedPrincipal> cachingAuthenticator) { 
    OAuthCredentialAuthFilter<AuthenticatedPrincipal> authFilter = new OAuthCredentialAuthFilter.Builder<AuthenticatedPrincipal>() 
      .setAuthenticator(cachingAuthenticator) 
      .setAuthorizer(new OAuthAuthorizer()) 
      .setRealm(REALM) 
      .setPrefix(PREFIX) 
      .buildAuthFilter(); 
    return new AuthDynamicFeature(authFilter); 
} 

ありがとうございました!このため

答えて

1

、あなたはDWでUnauthorizedHandlerを設定する必要があります。

public AuthDynamicFeature getAuthFilter(CachingAuthenticator<String, AuthenticatedPrincipal> cachingAuthenticator) { 
    OAuthCredentialAuthFilter<AuthenticatedPrincipal> authFilter = new OAuthCredentialAuthFilter.Builder<AuthenticatedPrincipal>() 
      .setAuthenticator(cachingAuthenticator) 
      .setAuthorizer(new OAuthAuthorizer()) 
      .setRealm(REALM) 
      .setPrefix(PREFIX) 
      .setUnauthorizedHandler(new MyUnauthorizedHandler()) 
      .buildAuthFilter(); 
    return new AuthDynamicFeature(authFilter); 
} 

setUnauthorizedHandler方法は、このプロパティを設定します。

あなたは、そのインターフェイスを実装することにより、応答をカスタマイズすることができます。

public static class MyUnauthorizedHandler implements UnauthorizedHandler { 

     @Override 
     public Response buildResponse(String prefix, String realm) { 
      return Response.status(Status.UNAUTHORIZED).entity("").build(); 
     } 

    } 

希望に役立つこと、

アルトゥル

+0

@Arturは、あなたの提案のおかげでは、上記の溶液に、私は私がしたいメッセージを印刷することができますが、私はJSON形式のメッセージを取得しておりません。私はちょうど計画のテキスト形式を取得しています。あなたはJSON形式のメッセージをどのように出力するのですか?ありがとう。計画テキスト形式の代わりにJSON形式メッセージを設定する方法はありますか?事前にあなたの助けをありがとう! – Rags

0

@Arthur、

私は以下のようにJsonUnauthorizedHandlerでUnauthorizedHandlerを実装していますそれはうまく働いた。

public class JsonUnauthorizedHandler implements UnauthorizedHandler { 
    private static final String CHALLENGE_FORMAT = "%s realm=\"%s\""; 

    @Override 
    public Response buildResponse(String prefix, String realm) { 
     // Create an HTTP 401 Unauthorized response with a JSON payload of a 
     // human readable error 
     return Response.status(Response.Status.UNAUTHORIZED) 
       .header(HttpHeaders.WWW_AUTHENTICATE, 
         String.format(CHALLENGE_FORMAT, prefix, realm)) 
       .type(MediaType.APPLICATION_JSON_TYPE) 
       .entity(ImmutableMap.of("code","401", 
         "message", 
         "HTTP 401 Unauthorized, Credentials are required to access this resource.")) 
       .build(); 
    } 
} 

次に、これを以下のgetAuthFilterとして設定しました。

public AuthDynamicFeature getAuthFilter(CachingAuthenticator<String, AuthenticatedPrincipal> cachingAuthenticator) { 
    OAuthCredentialAuthFilter<AuthenticatedPrincipal> authFilter = new OAuthCredentialAuthFilter.Builder<AuthenticatedPrincipal>() 
      .setAuthenticator(cachingAuthenticator) 
      .setAuthorizer(new OAuthAuthorizer()) 
      .setRealm(REALM) 
      .setPrefix(PREFIX) 
      .setUnauthorizedHandler(new JsonUnauthorizedHandler()) 
      .buildAuthFilter(); 
    return new AuthDynamicFeature(authFilter); 
} 

以下は上記の変更をスワッガーで受け取ったレスポンスです。

{ 
    "code": 401, 
    "message": "HTTP 401 Unauthorized, Credentials are required to access this resource." 
} 

ありがとうございます。

おかげ ぼろ

+0

あなたがそれを見つけられたらうれしいです:)私にタグを付けることは、私にあなたのフォローアップが見えなかった理由です。あなたはそれのために私のユーザー名を使用する必要があります:) – pandaadb

関連する問題