安全组件 (yudao-spring-boot-starter-security)
引用文件
本文引用的文件
- YudaoSecurityAutoConfiguration.java
- YudaoWebSecurityConfigurerAdapter.java
- SecurityProperties.java
- TokenAuthenticationFilter.java
- LoginUser.java
- SecurityFrameworkUtils.java
- SecurityFrameworkServiceImpl.java
- TokenAuthenticationFilter.java(网关版)
- SecurityFrameworkUtils.java(网关版)
- JmReportTokenServiceImpl.java
- DataPermissionContextHolder.java
- DataPermissionAnnotationAdvisor.java
- DataPermissionAnnotationInterceptor.java
- [《芋道 Spring Boot 安全框架 Spring Security 入门》.md](http://192.168.1.87:36927/IK/yudao-cloud/src/branch/master-jdk17/yudao-framework/yudao-spring-boot-starter-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md)
目录
简介
本文件面向 yudao-spring-boot-starter-security 安全组件,系统性阐述其与 Spring Security 的集成方式、JWT 令牌认证机制、权限控制策略与上下文设计。重点覆盖以下方面:
- Spring Security 配置与过滤链
- JWT 令牌校验与登录用户上下文(LoginUser)注入
- 密码加密策略与认证入口
- 权限注解与数据权限控制
- 自定义认证过滤器、权限拦截器与访问控制清单
- 最佳实践:密码加密、令牌刷新、权限缓存与安全配置
项目结构
该安全组件位于 yudao-framework 子模块中,围绕 Spring Security 自动配置、Web 安全适配器、令牌过滤器、上下文工具与权限服务展开;同时配合网关与报表模块的令牌透传与上下文注入。
图表来源
- YudaoSecurityAutoConfiguration.java
- YudaoWebSecurityConfigurerAdapter.java
- TokenAuthenticationFilter.java
- LoginUser.java
- SecurityFrameworkUtils.java
- SecurityProperties.java
- SecurityFrameworkServiceImpl.java
- DataPermissionContextHolder.java
- DataPermissionAnnotationAdvisor.java
- DataPermissionAnnotationInterceptor.java
- TokenAuthenticationFilter.java(网关版)
- SecurityFrameworkUtils.java(网关版)
- JmReportTokenServiceImpl.java
章节来源
核心组件
- 自动配置与Bean注册:负责认证入口、权限不足处理器、密码编码器、SecurityContextHolder策略等。
- Web安全适配器:定义 SecurityFilterChain,禁用CSRF与Session,配置异常处理、URL放行规则与自定义权限映射。
- 令牌认证过滤器:从请求头或参数提取令牌,调用系统令牌API校验,构建 LoginUser 并注入上下文;支持模拟登录。
- 登录用户上下文:承载用户标识、用户类型、租户、授权范围、过期时间与临时上下文。
- 上下文工具:统一从请求中提取令牌、设置/移除登录用户、构造认证对象。
- 权限服务:封装权限/角色查询与缓存,提升鉴权性能。
- 数据权限注解体系:通过上下文与拦截器在方法执行前后维护注解上下文,实现数据维度的权限控制。
- 网关与报表集成:网关侧透传登录用户信息,报表侧基于前端令牌注入上下文。
章节来源
- TokenAuthenticationFilter.java
- LoginUser.java
- SecurityFrameworkUtils.java
- SecurityFrameworkServiceImpl.java
- DataPermissionContextHolder.java
- DataPermissionAnnotationAdvisor.java
- DataPermissionAnnotationInterceptor.java
- TokenAuthenticationFilter.java(网关版)
- SecurityFrameworkUtils.java(网关版)
- JmReportTokenServiceImpl.java
架构总览
整体采用“请求级令牌校验 + 上下文注入 + 方法级权限注解 + 数据权限注解”的分层安全架构。请求进入后,先由令牌过滤器完成令牌校验与上下文设置;随后业务层通过注解与权限服务进行细粒度控制。
图表来源
组件详解
Spring Security 集成与配置
- 自动配置:注册认证入口、权限不足处理器、密码编码器、SecurityContextHolder 策略,确保线程本地上下文可跨线程传递。
- Web 安全适配器:禁用 CSRF 与 Session,开启 CORS;统一异常处理;基于注解与配置项收集免登录 URL;最后统一要求认证。
- 方法级安全:启用 securedEnabled,结合注解实现细粒度权限控制。
图表来源
章节来源
JWT 令牌认证机制
- 令牌来源:优先从请求头 Authorization 中提取,其次从 token 参数中提取;网关与报表模块另有透传与注入逻辑。
- 校验流程:调用系统令牌 API 校验令牌有效性,若有效则构建 LoginUser(包含用户ID、用户类型、租户ID、授权范围、过期时间),否则返回空(允许放行至业务自行判断)。
- 用户类型匹配:当请求中带有用户类型时,需与令牌中的用户类型一致,否则拒绝访问。
- 模拟登录:在开发模式下,可通过特定前缀+用户ID的令牌进行模拟登录,便于调试。
图表来源
章节来源
登录用户上下文(LoginUser)设计
- 字段:用户ID、用户类型、额外信息、租户ID、授权范围、过期时间、上下文缓存。
- 上下文缓存:用于按 LoginUser 维度的临时缓存,避免重复查询。
- 与上下文工具配合:通过工具类设置/获取/移除 登录用户,支持网关与服务间透传。
图表来源
章节来源
权限控制策略与注解使用
- URL放行:通过注解扫描与配置项收集免登录URL,静态资源与显式标注免登录的接口可匿名访问。
- 方法级权限:启用 securedEnabled 后,可在业务接口上使用权限注解实现细粒度控制。
- 数据权限:通过 DataPermission 注解与拦截器在方法执行前后维护注解上下文,实现数据维度的权限控制。
图表来源
- DataPermissionContextHolder.java
- DataPermissionAnnotationAdvisor.java
- DataPermissionAnnotationInterceptor.java
章节来源
- YudaoWebSecurityConfigurerAdapter.java
- DataPermissionContextHolder.java
- DataPermissionAnnotationAdvisor.java
- DataPermissionAnnotationInterceptor.java
自定义 认证过滤器与权限拦截器
- 认证过滤器:在 UsernamePasswordAuthenticationFilter 之前执行,负责令牌校验与上下文注入;异常时统一通过全局异常处理器转换为JSON响应。
- 权限拦截器:通过注解切面与拦截器在方法执行前后维护数据权限上下文,支持缓存与嵌套调用场景。
章节来源
- TokenAuthenticationFilter.java
- DataPermissionAnnotationAdvisor.java
- DataPermissionAnnotationInterceptor.java
访问控制清单与免登录策略
- 注解扫描:遍历RequestMappingHandlerMapping,收集带 @PermitAll 的接口,按HTTP方法分别归集URL。
- 配置项补充:支持通过 yudao.security.permit-all-urls 配置免登录URL清单。
- 兜底规则:异步请求与未命中上述规则的请求均需认证。
章节来源
会话管理与上下文传播
- 无状态:禁用Session,基于Token实现无状态认证。
- 线程本地:通过自定义 SecurityContextHolder 策略,确保上下文在线程间可传递。
- 网关透传:网关侧将登录用户信息通过 Header 透传至下游服务,下游服务再注入到本地上下文。
章节来源
- YudaoWebSecurityConfigurerAdapter.java
- YudaoSecurityAutoConfiguration.java
- TokenAuthenticationFilter.java(网关版)
- SecurityFrameworkUtils.java(网关版)
权限注解与权限服务
- 权限服务:封装 hasAnyRoles 等权限查询,并使用缓存降低频繁调用带来的开销。
- 缓存策略:针对角色/权限查询设置短期缓存,平衡实时性与性能。
章节来源
外部集成与令牌注入
- 网关集成:网关过滤器根据令牌解析用户信息,若过期则透传空用户,由下游服务自行判定。
- 报表集成: 报表模块基于前端传递的令牌,构建 LoginUser 并注入上下文,便于报表查询。
章节来源
依赖关系分析
- 组件耦合:过滤器依赖配置属性、全局异常处理器与系统令牌API;上下文工具贯穿请求生命周期;权限服务依赖权限API与缓存。
- 外部依赖:Spring Security、Spring Web、Guava Cache、系统权限API与OAuth2令牌API。
- 循环依赖:各模块职责清晰,未见循环依赖迹象。
图表来源
- YudaoWebSecurityConfigurerAdapter.java
- TokenAuthenticationFilter.java
- SecurityFrameworkServiceImpl.java
- DataPermissionContextHolder.java
性能与安全特性
- 密码加密:通过配置项设置 BCrypt 加密复杂度,兼顾安全性与性能。
- 权限缓存:角色/权限查询使用短期缓存,降低频繁调用成本。
- 令牌校验:请求级令牌校验,避免Session占用,适合高并发场景。
- 模拟登录:仅在开发环境启用 ,生产务必关闭,防止安全风险。
- 线程本地上下文:确保跨线程传递,避免上下文丢失。
章节来源
- YudaoSecurityAutoConfiguration.java
- SecurityProperties.java
- SecurityFrameworkServiceImpl.java
- TokenAuthenticationFilter.java
故障排查指南
- 令牌无效或过期:检查令牌来源与有效期,确认系统令牌API返回;必要时在开发环境启用模拟登录进行验证。
- 用户类型不匹配:确认请求中用户类型与令牌中的用户类型一致。
- 无状 态会话:如出现上下文丢失,检查线程本地策略与过滤器顺序。
- 免登录规则:确认注解扫描与配置项是否正确收集URL,避免误放行。
- 网关透传:确认网关是否正确设置 login-user 头,下游服务是否正确解析。
章节来源
- TokenAuthenticationFilter.java
- YudaoWebSecurityConfigurerAdapter.java
- TokenAuthenticationFilter.java(网关版)
结论
yudao-spring-boot-starter-security 通过“请求级令牌校验 + 上下文注入 + 方法级权限注解 + 数据权限注解”的组合,提供了高可用、高性能、易扩展的安全能力。建议在生产环境中严格关闭模拟登录、合理配置免登录URL、启用权限缓存,并结合网关与下游服务的上下文透传机制,确保安全与性能的平衡。