千家信息网

springboot中怎么利用security自定义CSRF防御

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,今天就跟大家聊聊有关springboot中怎么利用security自定义CSRF防御,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。查看csrf
千家信息网最后更新 2026年11月02日springboot中怎么利用security自定义CSRF防御

今天就跟大家聊聊有关springboot中怎么利用security自定义CSRF防御,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

查看csrfFilter源码,会先去HttpSessionCsrfTokenRepository.loadToken加载CsrfToken ,其实就是从session中获取。

public CsrfToken loadToken(HttpServletRequest request) {    HttpSession session = request.getSession(false);    if (session == null) {        return null;    }    return (CsrfToken) session.getAttribute(this.sessionAttributeName);}

如果不存在,会创建一个CsrfToken 并放入session

public void saveToken(CsrfToken token, HttpServletRequest request, HttpServletResponse response) {    if (token == null) {        HttpSession session = request.getSession(false);        if (session != null) {            session.removeAttribute(this.sessionAttributeName);        }    } else {        HttpSession session = request.getSession();        session.setAttribute(this.sessionAttributeName, token);    }}

之后会从request中取token,与从session中取出的token对比,所以这里开启csrf认证后,这四种请求是不验证csrf的"GET", "HEAD", "TRACE", "OPTIONS",常用的POST请求,每次都要么在请求头上加上X-CSRF-TOKEN:csrf值,或者在POST中加入参数_csrf:csrf值,这样才能取出request中的csrf和session中的对比。

    String actualToken = request.getHeader(csrfToken.getHeaderName());    if (actualToken == null) {        actualToken = request.getParameter(csrfToken.getParameterName());    }    if (!csrfToken.getToken().equals(actualToken)) {        if (this.logger.isDebugEnabled()) {            this.logger.debug("Invalid CSRF token found for "                    + UrlUtils.buildFullRequestUrl(request));        }        if (missingToken) {            this.accessDeniedHandler.handle(request, response,                    new MissingCsrfTokenException(actualToken));        }else {            this.accessDeniedHandler.handle(request, response,                    new InvalidCsrfTokenException(csrfToken, actualToken));        }        return;    }

如果request中取出的csrf和session中取出的不相等,会进入accessDeniedHandler.handle,这个accessDeniedHandler是AccessDeniedHandlerImpl,里面方法如下:

public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException)throws IOException, ServletException {    if(!response.isCommitted()) {      if(this.errorPage != null) {        request.setAttribute("SPRING_SECURITY_403_EXCEPTION", accessDeniedException);        response.setStatus(403);        RequestDispatcher dispatcher = request.getRequestDispatcher(this.errorPage);        dispatcher.forward(request, response);      } else {        response.sendError(403, accessDeniedException.getMessage());      }    }}

如果设置了errorPage会服务器内部转发到该路径,之后还是会经过security的各个filter进行登陆操作,最终登陆成功。这不是我要的,,所以需要自定义一个accessDeniedHandler。代码如下,如果不是登陆请求的 csrf不匹配,都退出当前用户,登陆用户不做csrf校验。

@Componentpublic class CsrfAccessDeniedHandler implements AccessDeniedHandler {    private SecurityContextLogoutHandler logoutHandler = new SecurityContextLogoutHandler();    @Autowired    private AjaxLogoutSuccessHandler ajaxLogoutSuccessHandler;    @Override    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e)        throws IOException, ServletException {        Authentication auth = SecurityContextHolder.getContext().getAuthentication();        logoutHandler.logout(request, response, auth);        ajaxLogoutSuccessHandler.onLogoutSuccess(request, response, auth);    }}

然后在securityConfig里配置

@Overrideprotected void configure(HttpSecurity http) throws Exception {    // 允许iframe    http.headers().frameOptions().sameOrigin();    //登陆页面不做csrf校验    http.csrf().ignoringAntMatchers("/login");    //异常处理    http.exceptionHandling().        accessDeniedHandler(csrfAccessDeniedHandler)}

看完上述内容,你们对springboot中怎么利用security自定义CSRF防御有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

登陆 内容 防御 用户 成功 这不 代码 会创 参数 常用 我要 方法 更多 服务器 源码 知识 篇文章 行业 要么 资讯 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 天津市摩尔互联网科技 互联网佳科技有限公司 为想互联网科技怎么样 金融科技还是互联网 兼蜜互联网科技 郑州华宇互联网科技 互联网科技大会案例 彤创互联网科技有限公司 青岛科技大学互联网大赛研究生 新兴科技互联网创新大赛颁奖典礼 允成互联网科技有限公司融资 上海京穆互联网科技有限公司 领航科技大厦互联网公司 互联网相关科技技术 本届互联网大会上的黑科技 新氧科技和美国互联网有关系吗 互联网科技平台产品运营 艺电能源互联网科技有限公司招聘 青岛易易互联网科技 高科技和互联网的现代国家 广州万易互联网科技有限公司 互联网的科技 金融科技创新监管互联网金融 中国 科技 互联网 互联网科技英文 互联网科技小额贷款 苏州大垚互联网科技 富国互联网科技创新基金 安徽零酒互联网科技有限公司 绵阳真晨互联网科技有限公司
0