Appearance
安全架构设计
**本文引用的文件** - [AuthorizationServerConfig.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/config/AuthorizationServerConfig.java) - [SecurityConfig.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-server/src/main/java/com/lenovo/lemes/service/dm/common/config/SecurityConfig.java) - [PasswordAuthenticationProvider.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/password/PasswordAuthenticationProvider.java) - [PasswordDaoAuthenticationProvider.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/password/PasswordDaoAuthenticationProvider.java) - [PasswordUtil.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/util/PasswordUtil.java) - [CustomOAuth2TokenCustomizer.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/CustomOAuth2TokenCustomizer.java) - [CustomOAuth2AccessTokenGenerator.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/security/CustomOAuth2AccessTokenGenerator.java) - [CustomOpaqueTokenIntrospector.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/CustomOpaqueTokenIntrospector.java) - [AuthExceptionEntryPoint.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/exception/AuthExceptionEntryPoint.java) - [CustomAccessDeniedHandler.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/exception/CustomAccessDeniedHandler.java) - [Jackson2JsonRedisTokenStoreSerializationStrategy.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/security/Jackson2JsonRedisTokenStoreSerializationStrategy.java) - [DefaultOauth2RefreshTokenDeserializer.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/security/DefaultOauth2RefreshTokenDeserializer.java) - [OAuth2AuthenticationDeserialize.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/security/OAuth2AuthenticationDeserialize.java) - [SysLoginController.java](file://lemes-cloud/lemes-auth/src/main/java/com/lenovo/lemes/auth/controller/SysLoginController.java) - [UserController.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-server/src/main/java/com/lenovo/lemes/service/dm/common/controller/UserController.java) - [PermissionController.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-server/src/main/java/com/lenovo/lemes/service/dm/common/controller/PermissionController.java) - [RoleController.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-server/src/main/java/com/lenovo/lemes/service/dm/common/controller/RoleController.java) - [RedisController.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-server/src/main/java/com/lenovo/lemes/service/dm/common/controller/RedisController.java) - [DepartmentController.java](file://lemes-cloud/lemes-business-devicemate/lemes-service-dm-common/lemes-service-dm-common-server/src/main/java/com/lenovo/lemes/service/dm/common/controller/DepartmentController.java) - [ResourceServerAutoConfiguration.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/ResourceServerAutoConfiguration.java) - [LemesAuthProperties.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/LemesAuthProperties.java) - [LemesClientProperty.java](file://lemes-cloud/lemes-framework/lemes-framework-auth/src/main/java/com/lenovo/lemes/framework/auth/config/LemesClientProperty.java) - [bootstrap.yml](file://lemes-cloud/lemes-auth/src/main/resources/bootstrap.yml) - [FilterIgnoreProperties.java](file://lemes-cloud/lemes-framework/lemes-framework-core/src/main/java/com/lenovo/lemes/framework/core/config/FilterIgnoreProperties.java)目录
引言
本设计文档面向DeviceMate项目的安全架构,围绕基于Spring Security与OAuth2的认证授权体系进行系统化阐述,覆盖以下主题:
- 认证授权体系:OAuth2授权服务器配置、JWT令牌管理、用户密码加密存储机制
- 权限控制策略:基于角色的访问控制(RBAC)、菜单权限、数据权限、操作权限
- 安全防护措施:CSRF防护、XSS防护、SQL注入防护、接口限流策略
- 会话管理机制:单点登录(SSO)、会话超时、并发会话控制
- 敏感数据保护:加密算法选择、密钥管理、传输加密、存储加密
- 安全审计日志:用户操作日志、安全事件日志、访问控制日志
- 安全运维:漏洞扫描、渗透测试、安全合规检查
项目结构
DeviceMate采用微服务与网关架构,安全相关能力主要分布在“授权服务”与“通用业务服务”的安全配置模块中:
- 授权服务(lemes-auth):负责OAuth2授权服务器、令牌签发与校验、资源访问控制
- 通用业务服务(lemes-service-dm-common-server):负责业务控制器与安全配置属性
- 框架层(lemes-framework-auth、lemes-framework-core):提供统一的认证授权工具、资源服务器自动装配、过滤器忽略配置等
图表来源
- AuthorizationServerConfig.java:64-112
- PasswordAuthenticationProvider.java:57-173
- PasswordDaoAuthenticationProvider.java:17-35
- CustomOAuth2TokenCustomizer.java:22-44
- CustomOAuth2AccessTokenGenerator.java:29-92
- SysLoginController.java
- SecurityConfig.java:19-23
- ResourceServerAutoConfiguration.java
- CustomOpaqueTokenIntrospector.java
- AuthExceptionEntryPoint.java
- CustomAccessDeniedHandler.java
- Jackson2JsonRedisTokenStoreSerializationStrategy.java
- DefaultOauth2RefreshTokenDeserializer.java
- OAuth2AuthenticationDeserialize.java
章节来源
核心组件
- 授权服务器配置:集中定义OAuth2授权端点、令牌生成器、资源服务器、异常处理与CSRF关闭策略
- 密码认证提供者:实现密码授权类型,完成客户端校验、作用域校验、用户认证、令牌发放与授权保存
- DAO密码认证提供者:基于UserDetailsService与PasswordUtil实现密码匹配逻辑
- 令牌定制与生成:在访问令牌中注入用户ID、用户名、权限集合等声明,并设置令牌格式与生命周期
- 资源服务器与异常处理:启用不透明令牌内省、统一未认证与拒绝访问处理
- 安全配置属性:通过配置项控制URL白名单与安全策略
章节来源
- AuthorizationServerConfig.java:62-149
- PasswordAuthenticationProvider.java:38-190
- PasswordDaoAuthenticationProvider.java:17-35
- CustomOAuth2TokenCustomizer.java:22-44
- CustomOAuth2AccessTokenGenerator.java:29-121
- ResourceServerAutoConfiguration.java
- SecurityConfig.java:19-23
架构总览
DeviceMate的安全架构以“授权服务器 + 资源服务器 + 业务服务”三层协同实现:
- 授权服务器:负责OAuth2授权与令牌签发,使用不透明令牌内省与自定义令牌增强
- 资源服务器:对受保护资源进行访问控制,统一异常处理
- 业务服务:通过资源服务器自动装配接入鉴权链路,控制器按需暴露
图表来源
- AuthorizationServerConfig.java:72-109
- PasswordAuthenticationProvider.java:57-173
- CustomOpaqueTokenIntrospector.java
- ResourceServerAutoConfiguration.java
详细组件分析
授权服务器配置与令牌管理
- 授权端点与转换器:注册多种授权转换器(授权码、刷新令牌、客户端凭证、密码),并配置认证提供者与响应处理器
- 令牌生成器:组合访问令牌生成器与刷新令牌生成器,支持自定义令牌增强
- 资源服务器:启用不透明令牌内省,配置未认证与拒绝访问处理器
- 过滤器忽略:结合配置属性对特定URL放行
- CSRF关闭:针对授权服务器端点关闭CSRF
图表来源
- AuthorizationServerConfig.java:62-149
- PasswordAuthenticationProvider.java:38-190
- CustomOAuth2AccessTokenGenerator.java:29-121
- CustomOAuth2TokenCustomizer.java:22-44
- CustomOpaqueTokenIntrospector.java
- AuthExceptionEntryPoint.java
- CustomAccessDeniedHandler.java
章节来源
密码认证流程与令牌发放
- 客户端认证:确保客户端已认证且允许该授权类型
- 作用域校验:仅允许在客户端注册范围内的作用域
- 用户认证:委托给认证管理器,失败时抛出OAuth2错误
- 令牌生成:生成访问令牌与可选刷新令牌,保存授权记录
- 声明注入:在访问令牌中注入用户ID、用户名与权限集合
图表来源
- PasswordAuthenticationProvider.java:57-173
- CustomOAuth2AccessTokenGenerator.java:34-92
- CustomOAuth2TokenCustomizer.java:24-43
章节来源
密码加密与匹配机制
- 加密模式:支持bcrypt与des两种模式,通过配置项切换
- 匹配逻辑:bcrypt使用专用匹配方法;des通过解密后比较
- 默认密码:在特定场景下提供默认密码回退策略
图表来源
章节来源
RBAC权限模型与控制器映射
- 角色与权限:令牌中注入权限集合,控制器通过注解或拦截器实现RBAC
- 用户/角色/权限控制器:提供用户、角色、权限的CRUD与关联操作
- 数据权限:结合业务实体与部门/组织维度实现数据级权限控制
- 操作权限:通过细粒度接口与参数校验实现操作级权限控制
章节来源
- CustomOAuth2TokenCustomizer.java:29-43
- UserController.java
- RoleController.java
- PermissionController.java
- DepartmentController.java
会话管理与并发控制
- 单点登录(SSO):通过共享的授权服务器与不透明令牌实现跨应用会话
- 会话超时:由令牌生命周期与资源服务器配置共同决定
- 并发会话控制:可通过自定义会话策略与Redis存储实现并发登录限制与踢出逻辑
章节来源
- CustomOpaqueTokenIntrospector.java
- Jackson2JsonRedisTokenStoreSerializationStrategy.java
- DefaultOauth2RefreshTokenDeserializer.java
- OAuth2AuthenticationDeserialize.java
安全防护措施
- CSRF防护:授权服务器端点关闭CSRF,前端侧通过令牌传递替代CSRF
- XSS防护:后端严格输出编码与输入校验,前端避免内联脚本
- SQL注入防护:使用ORM与参数化查询,避免动态SQL拼接
- 接口限流:结合网关与业务层限流策略,防止暴力破解与滥用
章节来源
敏感数据保护
- 传输加密:建议在生产环境强制HTTPS
- 存储加密:密码采用bcrypt或des加密;密钥通过配置中心管理
- 令牌存储:刷新令牌与授权记录持久化,采用安全存储与序列化策略
章节来源
- PasswordUtil.java:26-47
- Jackson2JsonRedisTokenStoreSerializationStrategy.java
- DefaultOauth2RefreshTokenDeserializer.java
安全审计日志
- 用户操作日志:记录登录、权限变更、数据操作等关键行为
- 安全事件日志:记录认证失败、令牌异常、越权尝试等
- 访问控制日志:记录资源访问与授权决策
- 分析与告警:结合日志平台进行聚合分析与实时告警
(本节为概念性内容,无需代码来源)
依赖分析
- 组件耦合:授权服务器配置与认证提供者紧密耦合,令牌生成与增强相互依赖
- 外部依赖:不透明令牌内省依赖授权服务器,异常处理依赖统一入口
- 循环依赖:当前结构未见循环依赖风险
图表来源
- AuthorizationServerConfig.java:62-149
- PasswordAuthenticationProvider.java:38-190
- PasswordDaoAuthenticationProvider.java:17-35
- CustomOAuth2TokenCustomizer.java:22-44
- CustomOAuth2AccessTokenGenerator.java:29-121
- CustomOpaqueTokenIntrospector.java
- AuthExceptionEntryPoint.java
- CustomAccessDeniedHandler.java
- SecurityConfig.java:19-23
章节来源
性能考虑
- 令牌生成与内省:优先使用引用型令牌与高效内省实现,减少内存占用
- 缓存与序列化:合理配置Redis序列化策略,避免大对象频繁序列化
- 并发与限流:在授权端点与资源端点实施限流,防止突发流量冲击
- 日志与监控:异步化审计日志,避免阻塞主业务路径
(本节为通用建议,无需代码来源)
故障排查指南
- 未认证与拒绝访问:检查资源服务器异常处理器与令牌内省配置
- 认证失败:核对客户端凭证、作用域与用户凭据
- 令牌异常:确认令牌生成器与声明定制逻辑
- URL放行问题:核对安全配置属性与过滤器忽略列表
章节来源
- AuthExceptionEntryPoint.java
- CustomAccessDeniedHandler.java
- SecurityConfig.java:19-23
- FilterIgnoreProperties.java
结论
DeviceMate的安全架构以Spring Security与OAuth2为核心,结合不透明令牌内省与自定义令牌增强,实现了可控、可扩展的认证授权体系。通过RBAC模型与多层防护策略,满足企业级安全需求。建议在生产环境中强化传输加密、密钥管理与审计分析能力,并持续开展安全评估与合规检查。
附录
- 安全部署指导:建议在网关层统一开启HTTPS与WAF,对授权端点实施速率限制与IP白名单,定期轮换密钥与证书
- 渗透测试:对授权端点、令牌内省端点与业务控制器进行黑盒/白盒测试,重点验证越权、注入与会话劫持
- 合规检查:遵循ISO 27001、等级保护等标准,完善安全管理制度与应急预案
(本节为通用建议,无需代码来源)