当前位置: 首页 > news >正文

Spring Security鉴权:文件上传需要携带token

在Spring Security的配置流程里,请求携带token时,会先执行 addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class) 所添加的过滤器,之后再进行 authorizeHttpRequests 里的权限判断,下面为你详细解释:

1. 过滤器链的执行顺序

Spring Security是基于过滤器链来处理请求的。在配置中通过 addFilterBefore 添加的过滤器会按照配置的顺序插入到过滤器链中。authenticationTokenFilter 通常用于解析请求头中的token,验证其有效性,并且将用户信息加载到Spring Security的上下文里。

UsernamePasswordAuthenticationFilter 是Spring Security默认用于处理表单登录的过滤器。当你使用 addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class) 时,意味着 authenticationTokenFilter 会在 UsernamePasswordAuthenticationFilter 之前执行。

2. 权限判断的时机

authorizeHttpRequests 方法用于配置请求的访问规则,这些规则是在过滤器链执行完成之后才进行判断的。也就是说,在请求经过一系列过滤器(包含 authenticationTokenFilter)处理之后,才会依据 authorizeHttpRequests 中配置的规则来判断该请求是否被允许访问。

3. 执行流程示例

以下是一个简化的执行流程:

  1. 请求进入:客户端发送携带token的请求到服务器。
  2. 过滤器链执行:请求首先进入 authenticationTokenFilter,该过滤器会从请求头中提取token,对其进行验证,若验证通过,就会将用户信息加载到Spring Security的上下文里。
  3. 其他过滤器处理:请求继续通过过滤器链中的其他过滤器进行处理。
  4. 权限判断:当请求通过所有过滤器之后,会依据 authorizeHttpRequests 中配置的规则进行权限判断。若请求的URL匹配到 permitAll 的规则,那么请求会被允许访问;若匹配到 authenticated 规则,就会检查Spring Security上下文中是否存在有效的认证信息,若存在则允许访问,反之则拒绝访问。

4. 代码示例说明

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;import javax.annotation.Resource;@Configuration
@EnableWebSecurity
public class SecurityConfig {@Resourceprivate JwtAuthenticationTokenFilter authenticationTokenFilter;@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http// 关闭csrf.csrf().disable()// 不通过Session获取SecurityContext.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class).authorizeHttpRequests((requests) -> {// 允许匿名访问的URL列表permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());// 对于登录login 注册register 验证码captchaImage 允许匿名访问requests.antMatchers("/login", "/system/device/deviceData", "/register", "/captchaImage").permitAll().antMatchers("/system/category/**").permitAll()// 静态资源,可匿名访问.antMatchers(org.springframework.http.HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll().antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()// 除上面外的所有请求全部需要鉴权认证.anyRequest().authenticated();});return http.build();}
}

在这个配置中,authenticationTokenFilter 会在 UsernamePasswordAuthenticationFilter 之前执行,之后才会进行 authorizeHttpRequests 中的权限判断。

综上所述,携带token的请求会先经过 addFilterBefore 添加的过滤器,然后再进行 authorizeHttpRequests 中的权限判断。

http://www.xdnf.cn/news/296659.html

相关文章:

  • 【开源深度解析】从零打造AI暗棋对战系统:Python实现中国象棋暗棋全攻略
  • 昇腾Atlas 200I DK A2 开发者套件无法上网问题的解决
  • 【JVM】从零开始深度解析JVM
  • 【Java学习】反射
  • Kubernetes排错(九)-节点排错
  • 测试因strcpy执行拷贝引起的内存溢出
  • 五一假期集训【补题】
  • Python cv2图像几何变换全攻略:从理论到实战
  • Python 函数装饰器和闭包(闭包)
  • 人工智能在心理健康领域的创新应用:从诊断到干预
  • Tensorrt 基础入门
  • 民主与民族主义作为暴力时代的财政策略
  • Python小酷库系列:bidict,可以双向查询的dict
  • 代码随想录第33天:动态规划6(完全背包基础)
  • RHCSA笔记2
  • 2025年PMP 学习五
  • 关于麒麟服务器实现docker-compose服务开机自启
  • 浔川AI测试版内测报告
  • DeepWiki 是什么,怎么使用
  • 《深度剖析:SOAP与REST,API集成的两极选择》
  • 访问者模式(Visitor Pattern)
  • STC单片机与淘晶驰串口屏通讯例程之03【单片机程序解析】
  • 名词解释DCDC
  • 位运算-详细总结
  • 人工智能浪潮中Python的核心作用与重要地位
  • 《人件》第四章 高效团队养成
  • 林业数智化转型初步设计方案
  • 网络原理(6)—— 应用层之HTTP协议
  • 广东省省考备考(第二天5.5)—申论作文
  • Baklib的数字化内容管理核心是什么?