Tôi đang sử dụng Spring MVC @ControllerAdvice
và @ExceptionHandler
để xử lý tất cả các ngoại lệ của REST Api. Nó hoạt động tốt đối với các ngoại lệ do bộ điều khiển mvc web ném ra nhưng nó không hoạt động đối với các ngoại lệ do các bộ lọc tùy chỉnh bảo mật mùa xuân đưa ra vì chúng chạy trước khi các phương thức bộ điều khiển được gọi.
Tôi có một bộ lọc bảo mật mùa xuân tùy chỉnh thực hiện xác thực dựa trên mã thông báo:
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);
}
}
}
Với điểm nhập tùy chỉnh này:
@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());
}
}
Và với lớp này để xử lý các ngoại lệ trên toàn cầu:
@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;
}
}
Những gì tôi cần làm là trả về một nội dung JSON chi tiết ngay cả cho AuthenticationException bảo mật mùa xuân. Có cách nào giúp bảo mật mùa xuân AuthenticationEntryPoint và spring mvc @ExceptionHandler hoạt động cùng nhau không?
Tôi đang sử dụng spring security 3.1.4 và spring mvc 3.2.4.
(@)ExceptionHandler
chúc chỉ hoạt động nếu yêu cầu được xử lý bởiDispatcherServlet
. Tuy nhiên ngoại lệ này xảy ra trước đó vì nó được ném bởi aFilter
. Vì vậy, bạn sẽ không bao giờ có thể xử lý ngoại lệ này với một(@)ExceptionHandler
.