在 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);
}