আমি স্প্রিং এমভিসি ব্যবহার করছি @ControllerAdvice
এবং @ExceptionHandler
একটি রেস্ট এপিআইয়ের সমস্ত ব্যতিক্রম হ্যান্ডেল করতে। ওয়েব এমভিসি নিয়ন্ত্রণকারীদের ফেলে দেওয়া ব্যতিক্রমগুলির জন্য এটি দুর্দান্ত কাজ করে তবে এটি বসন্ত সুরক্ষা কাস্টম ফিল্টারগুলির দ্বারা ছুঁড়ে দেওয়া ব্যতিক্রমগুলির জন্য কাজ করে না কারণ তারা নিয়ন্ত্রণকারী পদ্ধতিগুলি চাওয়ার আগে চালিত হয়।
আমার কাছে একটি কাস্টম বসন্ত সুরক্ষা ফিল্টার রয়েছে যা টোকেন ভিত্তিক লেখককে দেয়:
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;
}
}
আমাকে যা করতে হবে তা হল বসন্ত সুরক্ষা প্রমাণীকরণের ধারণার জন্য এমনকি একটি বিশদ জেএসওএন বডি ফেরত। বসন্ত সুরক্ষা প্রমাণীকরণের এন্ট্রিপয়েন্ট এবং স্প্রিং এমভিসি @ এক্সপেশনহ্যান্ডলার একসাথে কাজ করার কোনও উপায় আছে কি?
আমি স্প্রিং সুরক্ষা 3.1.4 এবং স্প্রিং এমভিসি 3.2.4 ব্যবহার করছি।
(@)ExceptionHandler
অনুরোধটি যদি হ্যান্ডল করে তবেই কেবলমাত্র কাজ করবেDispatcherServlet
। তবে এই ব্যতিক্রমটি এর আগে ঘটে যেমন এটি দ্বারা নিক্ষেপ করা হয়Filter
। সুতরাং আপনি কখনই এই ব্যতিক্রমটি হ্যান্ডেল করতে সক্ষম হবেন না(@)ExceptionHandler
।