news 2026/6/25 22:14:47

SpringSecurity核心源码剖析+jwt+OAuth(一):SpringSecurity的初次邂逅(概念、认证、授权)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringSecurity核心源码剖析+jwt+OAuth(一):SpringSecurity的初次邂逅(概念、认证、授权)

SpringSecurity 核心概念

SpringSecurity 是一个功能强大且高度可定制的身份验证和访问控制框架,专注于为 Java 应用程序提供安全性。其核心功能围绕身份验证(Authentication)和授权(Authorization)展开。

身份验证是确认用户身份的过程,通常通过用户名密码、OAuth2、JWT 等方式实现。授权是确定已验证用户拥有哪些权限,例如访问特定资源或执行某些操作。

认证流程剖析

SpringSecurity 的认证流程主要由一系列过滤器链组成。核心过滤器包括UsernamePasswordAuthenticationFilter(处理表单登录)、BasicAuthenticationFilter(处理 HTTP Basic 认证)等。认证过程最终由AuthenticationManager协调,委托给ProviderManager和具体的AuthenticationProvider实现。

认证成功后,会生成Authentication对象并存入SecurityContextHolder,供后续授权流程使用。默认使用ThreadLocal存储安全上下文,确保线程安全。

授权机制解析

授权通过AccessDecisionManager实现,核心策略包括:

  • 基于投票的AffirmativeBased(一票通过即可)
  • 一致性通过的UnanimousBased(全部投票通过)
  • 多数通过的ConsensusBased

权限判断通常使用hasRole()hasAuthority()等表达式,或通过注解如@PreAuthorize实现方法级安全控制。配置示例:

http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasAnyRole("USER", "ADMIN") .anyRequest().authenticated();

JWT 集成实践

JWT(JSON Web Token)是一种无状态的认证方案,适合分布式系统。集成步骤:

创建 JWT 工具类处理令牌生成/验证:

public class JwtTokenUtil { private String secret = "your-secret-key"; public String generateToken(UserDetails userDetails) { return Jwts.builder() .setSubject(userDetails.getUsername()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 3600*1000)) .signWith(SignatureAlgorithm.HS512, secret) .compact(); } public Boolean validateToken(String token, UserDetails userDetails) { final String username = extractUsername(token); return (username.equals(userDetails.getUsername()) && !isTokenExpired(token)); } }

配置 JWT 过滤器:

public class JwtRequestFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { String token = extractToken(request); if (token != null && jwtUtil.validateToken(token, userDetails)) { UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken( userDetails, null, userDetails.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(auth); } chain.doFilter(request, response); } }

OAuth2 集成方案

SpringSecurity 提供完整的 OAuth2 支持,包括客户端和资源服务器配置:

资源服务器配置示例:

@EnableResourceServer @Configuration public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/**").authenticated(); } @Override public void configure(ResourceServerSecurityConfigurer resources) { resources.tokenServices(tokenServices()); } @Bean public TokenStore tokenStore() { return new JwtTokenStore(accessTokenConverter()); } @Bean public JwtAccessTokenConverter accessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); converter.setSigningKey("shared-secret"); return converter; } }

客户端配置示例:

@EnableOAuth2Client @Configuration public class OAuth2ClientConfig { @Bean public OAuth2RestTemplate oauth2RestTemplate( OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) { return new OAuth2RestTemplate(details, oauth2ClientContext); } }

安全配置最佳实践

生产环境建议配置:

  • 启用 CSRF 防护(对于有状态的 web 应用)
  • 配置 CORS 策略
  • 强制 HTTPS
  • 设置严格的内容安全策略
  • 使用安全密码编码器:
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }

典型安全配置示例:

@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().ignoringAntMatchers("/api/**") .and() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class) .authorizeRequests() .antMatchers("/auth/**").permitAll() .anyRequest().authenticated(); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 15:22:28

coze-loop多场景:支持VS Code远程开发容器中无缝调用

coze-loop多场景:支持VS Code远程开发容器中无缝调用 1. 什么是coze-loop?一个专为开发者打造的代码优化搭档 你有没有过这样的时刻:写完一段功能正常的Python代码,却总觉得它“不够漂亮”——变量名像密码、嵌套深得让人头晕、…

作者头像 李华
网站建设 2026/6/23 15:22:27

PowerPaint-V1智能填充体验:让老照片焕然一新的秘密武器

PowerPaint-V1智能填充体验:让老照片焕然一新的秘密武器 1. 为什么一张泛黄的老照片,值得你花5分钟试试这个工具? 你有没有翻出过抽屉深处的旧相册?那张爷爷年轻时站在梧桐树下的黑白照,右下角被水渍晕染得模糊不清&…

作者头像 李华
网站建设 2026/5/31 4:37:45

WAN2.2-文生视频+SDXL_Prompt风格实战教程:从ComfyUI部署到API封装全栈实现

WAN2.2-文生视频SDXL_Prompt风格实战教程:从ComfyUI部署到API封装全栈实现 1. 这个模型到底能做什么?先看效果再动手 你有没有试过把一段文字直接变成一段流畅的短视频?不是简单加个转场和配音,而是让画面里的人物会动、场景会变…

作者头像 李华
网站建设 2026/6/13 20:59:35

HY-Motion 1.0生产环境:K8s集群部署多实例动作生成服务

HY-Motion 1.0生产环境:K8s集群部署多实例动作生成服务 1. 为什么需要在K8s里跑动作生成服务? 你可能已经试过本地启动HY-Motion的Gradio界面——输入一句英文提示,几秒后,3D人形骨架就动起来了。但当你把这能力放进真实业务场景…

作者头像 李华
网站建设 2026/6/24 3:02:51

零样本学习-mT5中文版:打造高效文本增强工作流

零样本学习-mT5中文版:打造高效文本增强工作流 1. 引言 你是否遇到过这些场景? 做用户评论分析时,原始数据只有200条,模型训练效果差、泛化能力弱;写营销文案需要10个不同风格的版本,手动改写耗时又容易…

作者头像 李华
网站建设 2026/6/24 3:04:49

新手入门首选:Qwen2.5-7B 微调极简教程

新手入门首选:Qwen2.5-7B 微调极简教程 你是否曾被大模型微调的复杂流程劝退?下载依赖、配置环境、修改参数、调试报错……动辄一整天,最后连第一个训练步都没跑通。别担心,这篇教程专为新手设计——单卡十分钟完成 Qwen2.5-7B 首…

作者头像 李华