ฉันใช้ Spring MVC @ControllerAdvice
และ@ExceptionHandler
จัดการข้อยกเว้นทั้งหมดของ REST Api ใช้งานได้ดีสำหรับข้อยกเว้นที่ส่งโดยตัวควบคุมเว็บ mvc แต่ไม่ได้ผลสำหรับข้อยกเว้นที่เกิดจากตัวกรองแบบกำหนดเองสำหรับการรักษาความปลอดภัยแบบสปริงเนื่องจากทำงานก่อนที่จะเรียกใช้เมธอดคอนโทรลเลอร์
ฉันมีตัวกรองความปลอดภัยแบบสปริงที่กำหนดเองซึ่งทำการรับรองความถูกต้องตามโทเค็น:
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);
}
}
}
ด้วยจุดเข้าที่กำหนดเองนี้:
@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());
}
}
และด้วยคลาสนี้เพื่อจัดการกับข้อยกเว้นทั่วโลก:
@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;
}
}
สิ่งที่ฉันต้องทำคือส่งคืนเนื้อความ JSON โดยละเอียดแม้กระทั่งการรับรองความปลอดภัยในฤดูใบไม้ผลิ มีวิธีที่ทำให้ Spring Security AuthenticationEntryPoint และ spring mvc @ExceptionHandler ทำงานร่วมกันได้หรือไม่
ฉันใช้ spring security 3.1.4 และ spring mvc 3.2.4
(@)ExceptionHandler
จะใช้ได้ผลก็ต่อเมื่อคำขอได้รับการจัดการโดยDispatcherServlet
. อย่างไรก็ตามข้อยกเว้นนี้เกิดขึ้นก่อนหน้านั้นเนื่องจากไฟล์Filter
. ดังนั้นคุณจะไม่สามารถจัดการกับข้อยกเว้นนี้ด้วย(@)ExceptionHandler
ไฟล์.