package com.mzl.flower.config;
|
|
import com.mzl.flower.config.exception.SelfAuth2Exception;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpStatus;
|
import org.springframework.http.ResponseEntity;
|
import org.springframework.security.access.AccessDeniedException;
|
import org.springframework.security.core.AuthenticationException;
|
import org.springframework.security.oauth2.common.DefaultThrowableAnalyzer;
|
import org.springframework.security.oauth2.common.OAuth2AccessToken;
|
import org.springframework.security.oauth2.common.exceptions.InsufficientScopeException;
|
import org.springframework.security.oauth2.common.exceptions.InvalidGrantException;
|
import org.springframework.security.oauth2.common.exceptions.OAuth2Exception;
|
import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator;
|
import org.springframework.security.web.util.ThrowableAnalyzer;
|
import org.springframework.web.HttpRequestMethodNotSupportedException;
|
|
import java.io.IOException;
|
|
public class SelfWebResponseExceptionTranslator implements WebResponseExceptionTranslator {
|
|
private ThrowableAnalyzer throwableAnalyzer = new DefaultThrowableAnalyzer();
|
|
@Override
|
public ResponseEntity<OAuth2Exception> translate(Exception e) throws Exception {
|
Throwable[] causeChain = throwableAnalyzer.determineCauseChain(e);
|
|
Exception ase = (AuthenticationException) throwableAnalyzer.getFirstThrowableOfType(AuthenticationException.class,
|
causeChain);
|
if (ase != null) {
|
return handleOAuth2Exception(new UnauthorizedException(e.getMessage(), e));
|
}
|
|
ase = (AccessDeniedException) throwableAnalyzer
|
.getFirstThrowableOfType(AccessDeniedException.class, causeChain);
|
if (ase instanceof AccessDeniedException) {
|
return handleOAuth2Exception(new ForbiddenException(ase.getMessage(), ase));
|
}
|
|
ase = (InvalidGrantException) throwableAnalyzer
|
.getFirstThrowableOfType(InvalidGrantException.class, causeChain);
|
if (ase != null) {
|
return handleOAuth2Exception(new InvalidException(ase.getMessage(), ase));
|
}
|
|
ase = (AccessDeniedException) throwableAnalyzer
|
.getFirstThrowableOfType(AccessDeniedException.class, causeChain);
|
if (ase instanceof AccessDeniedException) {
|
return handleOAuth2Exception(new ForbiddenException(ase.getMessage(), ase));
|
}
|
|
ase = (HttpRequestMethodNotSupportedException) throwableAnalyzer.getFirstThrowableOfType(
|
HttpRequestMethodNotSupportedException.class, causeChain);
|
if (ase instanceof HttpRequestMethodNotSupportedException) {
|
return handleOAuth2Exception(new MethodNotAllowed(ase.getMessage(), ase));
|
}
|
|
ase = (OAuth2Exception) throwableAnalyzer.getFirstThrowableOfType(OAuth2Exception.class, causeChain);
|
if (ase != null) {
|
return handleOAuth2Exception((OAuth2Exception) ase);
|
}
|
|
return handleOAuth2Exception(new ServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase(), e));
|
|
}
|
|
private ResponseEntity<OAuth2Exception> handleOAuth2Exception(OAuth2Exception e) throws IOException {
|
int status = e.getHttpErrorCode();
|
HttpHeaders headers = new HttpHeaders();
|
headers.set("Cache-Control", "no-store");
|
headers.set("Pragma", "no-cache");
|
if (status == HttpStatus.UNAUTHORIZED.value() || (e instanceof InsufficientScopeException)) {
|
headers.set("WWW-Authenticate", String.format("%s %s", OAuth2AccessToken.BEARER_TYPE, e.getSummary()));
|
}
|
|
ResponseEntity<OAuth2Exception> response = new ResponseEntity<OAuth2Exception>(new SelfAuth2Exception(e.getMessage(), String.valueOf(e.getHttpErrorCode())), headers,
|
HttpStatus.valueOf(status));
|
|
return response;
|
|
}
|
|
private static class InvalidException extends SelfAuth2Exception {
|
|
public InvalidException(String msg, Throwable t) {
|
super(msg, t);
|
}
|
|
@Override
|
public String getOAuth2ErrorCode() {
|
return "invalid_exception";
|
}
|
|
@Override
|
public int getHttpErrorCode() {
|
return 426;
|
}
|
|
}
|
|
|
private static class ForbiddenException extends SelfAuth2Exception {
|
|
public ForbiddenException(String msg, Throwable t) {
|
super(msg, t);
|
}
|
|
@Override
|
public String getOAuth2ErrorCode() {
|
return "access_denied";
|
}
|
|
@Override
|
public int getHttpErrorCode() {
|
return 403;
|
}
|
|
}
|
|
private static class ServerErrorException extends SelfAuth2Exception {
|
|
public ServerErrorException(String msg, Throwable t) {
|
super(msg, t);
|
}
|
|
@Override
|
public String getOAuth2ErrorCode() {
|
return "server_error";
|
}
|
|
@Override
|
public int getHttpErrorCode() {
|
return 500;
|
}
|
|
}
|
|
private static class UnauthorizedException extends SelfAuth2Exception {
|
|
public UnauthorizedException(String msg, Throwable t) {
|
super(msg, t);
|
}
|
|
@Override
|
public String getOAuth2ErrorCode() {
|
return "unauthorized";
|
}
|
|
@Override
|
public int getHttpErrorCode() {
|
return 401;
|
}
|
|
}
|
|
private static class MethodNotAllowed extends SelfAuth2Exception {
|
|
public MethodNotAllowed(String msg, Throwable t) {
|
super(msg, t);
|
}
|
|
@Override
|
public String getOAuth2ErrorCode() {
|
return "method_not_allowed";
|
}
|
|
@Override
|
public int getHttpErrorCode() {
|
return 405;
|
}
|
|
}
|
|
}
|