2017-09-21 7 views
0

私はSpringを公開し、より大きなアプリケーションでAPIを使用しています。認証された()コンフィギュレーションの背後にあるエンドポイントにアクセスすると、私のアプリケーションは、次の理由コードの醜いTomcatのHTMLエラーがスローされます。しかしSpring AuthenticationEntryPointはJSONの代わりにTomcat HTMLエラーを返します

@Component 
public class EntryPointUnauthorizedHandler implements AuthenticationEntryPoint { 

    @Override 
    public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, 
      AuthenticationException e) throws IOException, ServletException { 
     httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Access Denied"); 
    } 
} 

、これは私だけのように、JSONを返すようにしたいAPIであるため、私のAPIの残りの部分。通常の例外処理のために、私は@ControllerAdvice次セットアップ:

@ControllerAdvice 
public class DefaultExceptionHandler extends ResponseEntityExceptionHandler { 

    /** 
    * Default internal BadCredentialsException handler. Respond with 401 Unauthorized 
    */ 
    @ExceptionHandler(value = BadCredentialsException.class) 
    public ResponseEntity<Object> handleBadCredentialsException(BadCredentialsException e, WebRequest request) { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentType(MediaType.APPLICATION_JSON); 
     return handleExceptionInternal(e, null, headers, HttpStatus.UNAUTHORIZED, request); 
    } 

    /** 
    * Fallback default exception handler. Respond with 500 
    */ 
    @ExceptionHandler(value = Exception.class) 
    public ResponseEntity<Object> handleFallbackException(Exception e, WebRequest request) { 
     HttpHeaders headers = new HttpHeaders(); 
     headers.setContentType(MediaType.APPLICATION_JSON); 
     return handleExceptionInternal(e, null, headers, HttpStatus.INTERNAL_SERVER_ERROR, request); 
    } 

    @Override 
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, 
      HttpHeaders headers, HttpStatus status, WebRequest request) { 

     final ErrorResponse error = new ErrorResponse(status, ex.getMessage()); 

     if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) { 
      request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST); 
     } 

     return new ResponseEntity<Object>(error, headers, status); 
    } 
} 

ErrorResponseははhttpStatusコードと例外メッセージを保持し、私自身の小さな応答ラッパーです。これは、細かいJSONにフォーマットさ:

{ 
    "status": 401, 
    "message": "Bad credentials" 
} 

は、どのように私は私のAuthenticationEntryPointのみ代わりに醜いTomcatのHTMLページの、同様のフォーマットされたエラーを返すようにリクエストとレスポンスのオブジェクトを持っていることを確認することができます。

+2

可能な複製(https://stackoverflow.com/questions/19767267/handle-spring-security-authentication-exceptions-with-exceptionhandler) – dur

答えて

0

HttpServletResponseは必要に応じて変更できます。 を見てみましょう:https://stackoverflow.com/a/19788700/1490806

[@ExceptionHandlerとハンドル春のセキュリティ認証例外]の
+0

マニュアルJSON文字列を書くか、ObjectMapperを使用すると、非常に醜くてハッキリです。本当にこれを行う適切な方法はありますか?私は春を間違って使っているように感じます。このAuthenticationEntryPointで再度処理する必要がある場合は、例外処理を1か所で定義する点は何ですか? – ChrisDekker

+0

スプリングセキュリティフィルタは、スプリングディスパッチャサーブレットの前に発生します。だから私は、春にはセキュリティフィルターチェーンで発生した例外についてのコントロールがないと思います。 https://visola.github.io/img/blog/spring-security-architecture.pngそれ以外の方法はありません。 – ilopezluna

関連する問題