私は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ページの、同様のフォーマットされたエラーを返すようにリクエストとレスポンスのオブジェクトを持っていることを確認することができます。
可能な複製(https://stackoverflow.com/questions/19767267/handle-spring-security-authentication-exceptions-with-exceptionhandler) – dur