Ich benutze Spring MVCs @ControllerAdvice
und @ExceptionHandler
um alle Ausnahmen einer REST-API zu behandeln. Es funktioniert gut für Ausnahmen, die von Web-MVC-Controllern ausgelöst werden, aber nicht für Ausnahmen, die von benutzerdefinierten Spring Security-Filtern ausgelöst werden, da sie ausgeführt werden, bevor die Controller-Methoden aufgerufen werden.
Ich habe einen benutzerdefinierten Federsicherheitsfilter, der eine tokenbasierte Authentifizierung ausführt:
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);
}
}
}
Mit diesem benutzerdefinierten Einstiegspunkt:
@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());
}
}
Und mit dieser Klasse können Ausnahmen global behandelt werden:
@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;
}
}
Was ich tun muss, ist, einen detaillierten JSON-Body auch für Spring Security AuthenticationException zurückzugeben. Gibt es eine Möglichkeit, Spring Security AuthenticationEntryPoint und Spring MVC @ExceptionHandler zusammenzuarbeiten?
Ich benutze Spring Security 3.1.4 und Spring MVC 3.2.4.
EntryPoint
. Möglicherweise möchten Sie das Objekt dort erstellen und dort ein Objekt einfügen MappingJackson2HttpMessageConverter
.
(@)ExceptionHandler
wird nur funktionieren, wenn die Anfrage von der bearbeitet wirdDispatcherServlet
. Diese Ausnahme tritt jedoch vorher auf, da sie von a ausgelöst wirdFilter
. Sie werden diese Ausnahme also niemals mit einem behandeln können(@)ExceptionHandler
.