+-

我遇到多个标签问题.如果我从第一个选项卡注销并打开另一个选项卡,然后登录并注销,如果我返回第一个选项卡并登录,则得到403.例如, Spring Security和thymeleaf将第一个选项卡的注销页面添加到了表单中:
<input type="hidden" name="_csrf" value="7b9639ba-aaae-4ed2-aad2-bb4c5930458e">
在第二个标签页的登录表单中添加了一个不同的csrf令牌.
<input type="hidden" name="_csrf" value="659324d5-ec5c-4c57-9984-dab740746285">
现在,当我转到第一个选项卡并从那里登录时,我被禁止使用403.这是有道理的,因为csrf令牌现在已过时.但是我该如何解决呢?如果用户从不活动状态注销并重定向到登录页面,但仅在半个小时后才尝试再次登录,我也收到403禁止.
最佳答案
从Spring Security 3.2开始,我们具有CsrfTokenRepository接口,该接口允许您按自己认为合适的方式存储同步器令牌,例如在数据库中.这使您可以选择使那些令牌过期,但是要避免用例中的令牌过时.
如果您希望在出现问题时提供更好的错误消息,则可以提供一个自定义AccessDeniedHandler实现,该实现管理MissingCsrfTokenException和InvalidCsrfTokenException异常,以便产生更多信息.
更新:
我有一个拦截器来处理所有未捕获的异常,因此我刚刚构建了一个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 Security中使用CSRF令牌获取403 - 乐贴网