Sto usando Spring MVC @ControllerAdvice
e @ExceptionHandler
per gestire tutte le eccezioni di un'API REST. Funziona bene per le eccezioni lanciate dai controller web mvc ma non funziona per le eccezioni lanciate dai filtri personalizzati di sicurezza primaverile perché vengono eseguiti prima che i metodi del controller vengano richiamati.
Ho un filtro di sicurezza primaverile personalizzato che esegue un'autenticazione basata su 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);
}
}
}
Con questo punto di ingresso personalizzato:
@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());
}
}
E con questa classe per gestire le eccezioni a livello globale:
@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;
}
}
Quello che devo fare è restituire un corpo JSON dettagliato anche per AuthenticationException di sicurezza primaverile. Esiste un modo per far funzionare insieme AuthenticationEntryPoint e spring mvc @ExceptionHandler di Spring Security?
Sto usando spring security 3.1.4 e spring mvc 3.2.4.
(@)ExceptionHandler
Funzionerà solo se la richiesta viene gestita daDispatcherServlet
. Tuttavia questa eccezione si verifica prima poiché viene lanciata da un fileFilter
. Quindi non sarai mai in grado di gestire questa eccezione con un file(@)ExceptionHandler
.