在Spring Security中传播AccessDeniedException
在我的Web应用程序中,我正在使用Spring Security和Spring
MVC。我已经使用@Secured
批注保护了几种方法,并以某种方式配置了Spring
Security,使得当其中一种方法没有适当的角色被访问时,用户将被带到登录页面。但是,当令人讨厌的请求来自Ajax时,我不希望这种行为,因此我实现了自定义带@ExceptionHandler
注释的方法来确定请求的上下文。
这是我的异常处理程序:
@ExceptionHandler(AccessDeniedException.class)public void handleAccessDeniedException(AccessDeniedException ex, HttpServletRequest request, HttpServletResponse response) throws Exception {
if (isAjax(request)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
} else {
throw ex;
}
}
这样,我既可以自己处理异常(例如,记录访问@Secured
方法的尝试),然后让Spring发挥作用,并通过重新抛出AccessDeniedException将用户重定向到登录页面。另外,当请求来自Ajax时,我将响应状态设置为,SC_UNAUTHORIZED
并在客户端处理错误。现在,这
似乎 工作正常,但是每次我从handleAccessDeniedException
方法中抛出异常时,我都会收到以下错误:
ERROR org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver - Failed to invoke @ExceptionHandler method: public void app.controller.BaseController.handleAccessDeniedException(org.springframework.security.access.AccessDeniedException,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse) throws java.lang.Exceptionorg.springframework.security.access.AccessDeniedException:
at app.controller.BaseController.handleAccessDeniedException(BaseController.java:23)
at app.controller.BaseController$$FastClassByCGLIB$$8f052058.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
(...)
我没有向spring xml配置文件添加任何异常处理细节。
我看不到应用程序本身有任何问题,但是存在错误,并且由于我是Spring MVC和Spring
Security的新手,所以我猜测我没有正确执行此操作。有什么建议么?谢谢!
回答:
您的异常处理程序不应该引发另一个异常。应该处理并发送响应。如果您从类中收到错误以查看其行为,那么检查代码是个好主意。
对于非ajax情况,最好将响应重定向到登录页面。另外,您可以AuthenticationEntryPoint
改为自定义Spring
Security使用的,并AccessDeniedExceptions
从MVC处理中省略。该行为本质上与默认值相同,LoginUrlAuthenticationEntryPoint
但是当检测到ajax请求时,可以将其扩展为返回403。
以上是 在Spring Security中传播AccessDeniedException 的全部内容, 来源链接: utcz.com/qa/416420.html