spring之在 spring security 中使用 CSRF token 获取 403

Free-Thinker 阅读:126 2025-02-15 21:57:57 评论:0

我遇到了多个选项卡的问题。如果我从第一个选项卡注销并打开另一个选项卡,然后登录并注销,如果我返回第一个选项卡并登录,我会得到 403。例如,第一个选项卡的注销页面已由 spring security 和 thymeleaf 添加到表单中:

<input type="hidden" name="_csrf" value="7b9639ba-aaae-4ed2-aad2-bb4c5930458e"> 

第二个选项卡的登录表单添加了不同的 csrf token 。

<input type="hidden" name="_csrf" value="659324d5-ec5c-4c57-9984-dab740746285"> 

现在当我转到第一个选项卡并从那里登录时,我得到 403 禁止。这是有道理的,因为 csrf token 现在已经过时了。但我该如何解决这个问题?如果用户从不活动状态注销并重定向到登录页面,但仅在一段时间后再次尝试登录,比如半小时,我也会收到 403 forbidden。

请您参考如下方法:

从 Spring Security 3.2 开始,我们有 CsrfTokenRepository 接口(interface),它允许您以您认为合适的方式存储同步器 token ,例如在数据库中。这使您可以根据需要选择使这些 token 过期,以避免在您的用例中使用过时的 token 。

如果您想在某些确实出错时提供更好的错误消息,您可以提供自定义AccessDeniedHandler 实现来管理MissingCsrfTokenExceptionInvalidCsrfTokenException 异常,以便生成信息更丰富的消息。

更新:

我有一个拦截器可以处理所有未捕获的异常,所以我只是构建了一个小的 AccessDeniedHandler 来重新抛出与 CSRF 相关的异常:

public class CustomAccessDeniedHandler extends AccessDeniedHandlerImpl { 
    @Override 
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException { 
        if(accessDeniedException instanceof MissingCsrfTokenException 
                || accessDeniedException instanceof InvalidCsrfTokenException) { 
            throw new ServletException(accessDeniedException); 
        } 
        super.handle(request, response, accessDeniedException); 
    } 
} 


标签:Spring
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号