处理Spring Security在配置好csrf后接口报401问题

本文介绍如何解决SpringSecurity配置CSRFToken后接口出现401未授权错误的问题,通过调整Cookie路径设置为根目录以支持servlet_context_path配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

处理Spring Security在配置好csrf后接口报401问题

现象:接口报401,csrf disable后接口正常200

项目是基于Java Spring boot 2.4.4 写的,原来是csrf是disable的,项目一直跑是没有问题。有一天项目需要配置csrf,不然会有潜在的CSRF风险(跨站请求伪造攻击)。

话不多说,改就完了。

原有配置

http.csrf().disable()

修改后的配置

http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()...

可是没有想到,本地跑没有问题,但是部署到服务器上接口就会报401未授权

分析

  1. 分析服务器上配置和本地的区别,本地没有配置servlet_context_path,但是服务器上因为需要加路径(前后端分离),所以配置了servlet_context_path
  2. 分析Cookie的Path,加上servlet_context_path后,所有的cookie Path都会加/xxx_context_path
  3. 所以只有http://xxxx.com/xxx_context_path/下面的页面才有访问这个cookie的权限,如果是SPA(Single Page Application)一般路由是和接口不一样的,所以是无法访问此cookie的

解决方案:配置csrf的Cookie为root path

  1. WebSecurityConfig.java添加一个函数来获取csrf token repository
private CsrfTokenRepository getCsrfTokenRepository() {
    CookieCsrfTokenRepository tokenRepository = CookieCsrfTokenRepository.withHttpOnlyFalse();
    //为了支持servlet context path, cookie需要被设置为根目录
    tokenRepository.setCookiePath("/");
    return tokenRepository;
}
  1. 修改WebSecurityConfig.java里面的configure函数
    原来是:
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()...

修改为:

http.csrf().csrfTokenRepository(this.getCsrfTokenRepository()).and()...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值