在 Spring 安全中自定义 CSRF 错误页面
Customizing CSRF error page in Spring Security
通常情况下,当页面一直保留到会话过期并且我尝试提交 POST 操作时,Spring 安全生成的 CSRF 令牌将与服务器的预期值不匹配。在这种情况下,错误是预期的结果。
但是,我总是得到默认的 Tomcat 403 错误,这非常难看。是安全过滤器抛出403错误导致的。
但是,我想拦截特定的 CSRF 错误以执行自定义操作。即,以下将不起作用,因为错误比 MVC 管道
更早抛出
@ExceptionHandler(CsrfException.class)
public String exception(CsrfException ex)
{
log.error(ex.getMessage(), ex);
return "redirect:/index.jsp";
}
重定向到索引页(或其他)似乎是一个很好的解决方案。如何拦截错误的 CSRF 令牌错误并自定义服务器响应?
用于检查 CSRF Spring 安全使用 CsrfFilter
。如果令牌丢失或无效,它使用 AccessDeniedHandler
if (missingToken) {
accessDeniedHandler.handle(request, response,
new MissingCsrfTokenException(actualToken));
}
else {
accessDeniedHandler.handle(request, response,
new InvalidCsrfTokenException(csrfToken, actualToken));
}
所以处理这个错误的一种方法可能是自己实现这个处理程序
@Override
public void configure(HttpSecurity http) throws Exception {
HttpSecurity http = http.exceptionHandling().accessDeniedHandler(myAccessDeniedHandler);
}
通常情况下,当页面一直保留到会话过期并且我尝试提交 POST 操作时,Spring 安全生成的 CSRF 令牌将与服务器的预期值不匹配。在这种情况下,错误是预期的结果。
但是,我总是得到默认的 Tomcat 403 错误,这非常难看。是安全过滤器抛出403错误导致的。
但是,我想拦截特定的 CSRF 错误以执行自定义操作。即,以下将不起作用,因为错误比 MVC 管道
更早抛出@ExceptionHandler(CsrfException.class)
public String exception(CsrfException ex)
{
log.error(ex.getMessage(), ex);
return "redirect:/index.jsp";
}
重定向到索引页(或其他)似乎是一个很好的解决方案。如何拦截错误的 CSRF 令牌错误并自定义服务器响应?
用于检查 CSRF Spring 安全使用 CsrfFilter
。如果令牌丢失或无效,它使用 AccessDeniedHandler
if (missingToken) {
accessDeniedHandler.handle(request, response,
new MissingCsrfTokenException(actualToken));
}
else {
accessDeniedHandler.handle(request, response,
new InvalidCsrfTokenException(csrfToken, actualToken));
}
所以处理这个错误的一种方法可能是自己实现这个处理程序
@Override
public void configure(HttpSecurity http) throws Exception {
HttpSecurity http = http.exceptionHandling().accessDeniedHandler(myAccessDeniedHandler);
}