Spring MVC'leri kullanıyorum @ControllerAdvice
ve @ExceptionHandler
REST Api'nin tüm istisnalarını işlemek için. Web mvc denetleyicileri tarafından atılan istisnalar için iyi çalışır, ancak denetleyici yöntemleri çağrılmadan önce çalıştıkları için bahar güvenliği özel filtreleri tarafından atılan istisnalar için çalışmaz.
Belirteç tabanlı kimlik doğrulaması yapan özel bir yay güvenlik filtrem var:
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);
}
}
}
Bu özel giriş noktasıyla:
@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());
}
}
Ve bu sınıfla küresel olarak istisnaları ele almak için:
@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;
}
}
Yapmam gereken şey, bahar güvenliği AuthenticationException için bile ayrıntılı bir JSON gövdesi döndürmek. Yay güvenliği AuthenticationEntryPoint ve spring mvc @ExceptionHandler'ın birlikte çalışmasının bir yolu var mı?
Yay güvenliği 3.1.4 ve yay mvc 3.2.4 kullanıyorum.
(@)ExceptionHandler
Yalnızca istek tarafından ele alınırsa çalışacaktırDispatcherServlet
. Ancak bu istisna, birFilter
. Yani bu istisnayı asla bir(@)ExceptionHandler
.