Saya menggunakan Spring MVC @ControllerAdvice
dan @ExceptionHandler
untuk menangani semua pengecualian dari REST Api. Ini berfungsi dengan baik untuk pengecualian yang dilemparkan oleh pengontrol mvc web tetapi tidak berfungsi untuk pengecualian yang dilemparkan oleh filter khusus keamanan pegas karena mereka berjalan sebelum metode pengontrol dipanggil.
Saya memiliki filter keamanan pegas khusus yang melakukan autentikasi berbasis token:
public class AegisAuthenticationFilter extends GenericFilterBean {
...
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
try {
...
} catch(AuthenticationException authenticationException) {
SecurityContextHolder.clearContext();
authenticationEntryPoint.commence(request, response, authenticationException);
}
}
}
Dengan titik masuk khusus ini:
@Component("restAuthenticationEntryPoint")
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint{
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) throws IOException, ServletException {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authenticationException.getMessage());
}
}
Dan dengan kelas ini untuk menangani pengecualian secara global:
@ControllerAdvice
public class RestEntityResponseExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler({ InvalidTokenException.class, AuthenticationException.class })
@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
@ResponseBody
public RestError handleAuthenticationException(Exception ex) {
int errorCode = AegisErrorCode.GenericAuthenticationError;
if(ex instanceof AegisException) {
errorCode = ((AegisException)ex).getCode();
}
RestError re = new RestError(
HttpStatus.UNAUTHORIZED,
errorCode,
"...",
ex.getMessage());
return re;
}
}
Yang perlu saya lakukan adalah mengembalikan badan JSON mendetail bahkan untuk keamanan musim semi AuthenticationException. Apakah ada cara agar keamanan pegas AuthenticationEntryPoint dan pegas mvc @ExceptionHandler berfungsi bersama?
Saya menggunakan keamanan pegas 3.1.4 dan pegas mvc 3.2.4.
(@)ExceptionHandler
hanya akan berfungsi jika permintaan ditangani olehDispatcherServlet
. Namun pengecualian ini terjadi sebelum itu karena dilemparkan oleh aFilter
. Jadi, Anda tidak akan pernah bisa menangani pengecualian ini dengan file(@)ExceptionHandler
.