SpringSecurity版本的不同配置

旧版 (5.x 及更早)

传统的、全手动的方案。它适用于需要高度定制化 JWT 处理逻辑和错误响应格式的场景,或者是在遗留的 Spring Security 5.7 以下版本的项目中。

  • 使用了一个自定义的 JwtAuthenticationFilter,并通过 addFilterBefore 将其插入到安全过滤器链中,放置在 UsernamePasswordAuthenticationFilter 之前。

工作流程:

  1. 请求到达 JwtAuthenticationFilter
  2. 该过滤器从请求头(如 Authorization: Bearer )中提取 JWT
  3. 过滤器自行验证 JWT 的签名、过期时间等(可能使用 JwtParser)
  4. 如果有效,则手动创建 Authentication 对象(通常是 UsernamePasswordAuthenticationToken)并存入 SecurityContextHolder
  5. 如果无效或没有令牌,则请求继续向下传递。由于后续过滤器无法认证,最终会由自定义的 AuthenticationEntryPoint 处理异常(返回 401 等)

异常处理:显式地设置了一个自定义的 authenticationEntryPoint。这意味着当用户未认证或 Token 无效时,你可以完全控制返回给客户端的 HTTP 响应体格式

java 复制代码
@Configuration
@EnableWebSecurity
@RequiredArgsConstuctor
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	
	private final JwtAuthenticationFilter jwtAuthenticationFilter;//认证过滤器
	private final AuthenticationEntryPoint authenticationEntryPoint;//认证入口点

	@Bean
	public PasswordEncoder passwordEncoder(){
		return new BCryptPasswordEncoder();//密码编码器
	}

	@Override
	protected void configure(HttpSecurity http)throws Exception{
		http.csrf().disable()
			.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
			.and()
            .authorizeRequests()
            .antMatchers("/api/v1/user/register", "/api/v1/user/login").permitAll()
            .antMatchers("/api/v1/user/**").authenticated()
            .anyRequest().authenticated()
            .and()
            .exceptionHandling()
            .authenticationEntryPoint(authenticationEntryPoint)
            .and()
            .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
	}
}

新版 (5.7+, 推荐用于 6.x)

现代的、基于标准的方案。它更简洁、更安全(受益于框架的内置安全特性),是新项目的首选。它将你从编写繁琐的 JWT 解析和验证代码中解放出来,让你更专注于业务逻辑。

  • 使用了 .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt) 配置。这是 Spring Security 为 OAuth 2.0 Bearer Token 处理提供的开箱即用的功能

工作流程:

  1. 框架自动配置了一个 BearerTokenAuthenticationFilter
  2. 该过滤器从请求中提取 Bearer Token
  3. 它将 Token 传递给自动配置的 AuthenticationManager,该管理器会使用你定义的 JwtDecoder Bean 来解码和验证 JWT
  4. 如果有效,AuthenticationManager 会自动创建 JwtAuthenticationToken 并存入安全上下文
  5. 如果无效,资源服务器会自动处理异常,返回标准化的错误响应

异常处理:没有显式配置异常处理。OAuth2ResourceServer 会使用其默认的异常处理机制,返回类似 { "error": "invalid_token", "error_description": "..." } 这样的标准错误信息

java 复制代码
@Configuration
@EnableWebSecurity //web安全
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(authorize -> authorize
            	//特定路径公开,其他路径需要验证
                .antMatchers("/auth/login", "/auth/token/refresh").permitAll()
                .anyRequest().authenticated()
            )
            //简单的JWT配置
            .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
            //明确配置为无状态
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            //明确禁用CSRF
            .csrf(AbstractHttpConfigurer::disable);
        return http.build();
    }

	//内置HMAC密钥解码器
    @Bean
    public JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withSecretKey(
            Keys.hmacShaKeyFor("my-secret-key-which-must-be-at-least-32-characters-long".getBytes())
        ).build();
    }
}
相关推荐
闲人编程1 天前
JWT认证与OAuth2集成
python·认证·jwt·签名·头部·负载·codecapsule
黑客思维者11 天前
数字配电系统安全配置检查
系统安全·安全威胁分析·安全配置
佛祖让我来巡山20 天前
小明网站双登录系统实现——微信授权登录+用户名密码登录完整指南
oauth2·springsecurity·微信授权登录
佛祖让我来巡山21 天前
Spring Security 鉴权流程与过滤器链深度剖析
springsecurity·authenticationmanager
佛祖让我来巡山21 天前
大型项目基于Spring Security的登录鉴权与数据权限控制完整方案
springsecurity·保姆级鉴权·大型项目登录认证
佛祖让我来巡山21 天前
Spring Security前后端分离接入流程保姆级教程
权限校验·springsecurity·登录认证
佛祖让我来巡山22 天前
Spring Security 认证流程闭环与调用链路详解
springsecurity·authenticationmanager
佛祖让我来巡山22 天前
小明的Spring Security入门到深入实战
springsecurity
佛祖让我来巡山23 天前
⚠️登录认证功能的成长过程:整体概述
安全·登录·springsecurity·登录认证·认证授权
ら陈佚晨3 个月前
electron在windows系统上如何进行用户授权
javascript·windows·electron·认证·授权