配置 AccessDeniedHandler 以处理无效的 csrf 令牌

Posted

技术标签:

【中文标题】配置 AccessDeniedHandler 以处理无效的 csrf 令牌【英文标题】:Configuring an AccessDeniedHandler in order to process an invalid csrf token 【发布时间】:2015-05-21 08:14:44 【问题描述】:

我参考了关于配置 CSRF 保护的 Spring Security 文档:

默认情况下 Spring Security 的 CSRF 保护会产生一个 HTTP 403 访问被拒绝。这可以通过配置来自定义 AccessDeniedHandler 以不同方式处理 InvalidCsrfTokenException。

请看这里:http://docs.spring.io/spring-security/site/docs/3.2.6.RELEASE/reference/htmlsingle/#csrf-configure

我不确定如何配置我的处理程序以处理无效的 CSRF 令牌。

private AccessDeniedHandler accessDeniedHandler() 
        return new AccessDeniedHandler() 
            @Override
            public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException 
                // TODO: deal with InvalidCsrfTokenException
                response.setStatus(HttpStatus.FORBIDDEN.value());
            
        ;
    

我在客户端使用 Angular 在 REST 中与我的 Spring 应用程序进行通信。

处理陈旧/无效的 CSRF 令牌的最佳方法是什么?

我应该使用AccessDeniedHandler 来添加一个自定义的http 响应标头,指示CSRF 令牌无效并在客户端进行处理吗?但是如何从 JS 请求一个新的 CSRF 令牌呢?

还有其他更好的方法吗?我该怎么做

以不同方式处理 InvalidCsrfTokenException

?

【问题讨论】:

【参考方案1】:

如果您提供详细的错误消息,请使用AccessDeniedHandler。处理程序管理InvalidCsrfTokenExceptionMissingCsrfTokenException

为什么要生成 csrf 令牌?每次您请求站点时,spring 都会为您生成它。但如果你真的想实现自己的 csrf 策略,请查看CsrfAuthenticationStrategy

Spring每次在SessionManagementFilter中调用这个类

【讨论】:

以上是关于配置 AccessDeniedHandler 以处理无效的 csrf 令牌的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security教程---- 自定义AccessDeniedHandler

如何在grails中编写accessDeniedHandler

Spring WebFlux 安全自定义 AccessDeniedHandler

Spring Boot permitAll 在 WebSecurityConfigurerAdapter 中不起作用

crt文件上传下载

Python 和 JavaScript 之间的 JSON 日期时间