Skip to content

安全架构设计

**本文引用的文件** - [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)

目录

  1. 引言
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

引言

本设计文档面向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):提供统一的认证授权工具、资源服务器自动装配、过滤器忽略配置等

图表来源

章节来源

核心组件

  • 授权服务器配置:集中定义OAuth2授权端点、令牌生成器、资源服务器、异常处理与CSRF关闭策略
  • 密码认证提供者:实现密码授权类型,完成客户端校验、作用域校验、用户认证、令牌发放与授权保存
  • DAO密码认证提供者:基于UserDetailsService与PasswordUtil实现密码匹配逻辑
  • 令牌定制与生成:在访问令牌中注入用户ID、用户名、权限集合等声明,并设置令牌格式与生命周期
  • 资源服务器与异常处理:启用不透明令牌内省、统一未认证与拒绝访问处理
  • 安全配置属性:通过配置项控制URL白名单与安全策略

章节来源

架构总览

DeviceMate的安全架构以“授权服务器 + 资源服务器 + 业务服务”三层协同实现:

  • 授权服务器:负责OAuth2授权与令牌签发,使用不透明令牌内省与自定义令牌增强
  • 资源服务器:对受保护资源进行访问控制,统一异常处理
  • 业务服务:通过资源服务器自动装配接入鉴权链路,控制器按需暴露

图表来源

详细组件分析

授权服务器配置与令牌管理

  • 授权端点与转换器:注册多种授权转换器(授权码、刷新令牌、客户端凭证、密码),并配置认证提供者与响应处理器
  • 令牌生成器:组合访问令牌生成器与刷新令牌生成器,支持自定义令牌增强
  • 资源服务器:启用不透明令牌内省,配置未认证与拒绝访问处理器
  • 过滤器忽略:结合配置属性对特定URL放行
  • CSRF关闭:针对授权服务器端点关闭CSRF

图表来源

章节来源

密码认证流程与令牌发放

  • 客户端认证:确保客户端已认证且允许该授权类型
  • 作用域校验:仅允许在客户端注册范围内的作用域
  • 用户认证:委托给认证管理器,失败时抛出OAuth2错误
  • 令牌生成:生成访问令牌与可选刷新令牌,保存授权记录
  • 声明注入:在访问令牌中注入用户ID、用户名与权限集合

图表来源

章节来源

密码加密与匹配机制

  • 加密模式:支持bcrypt与des两种模式,通过配置项切换
  • 匹配逻辑:bcrypt使用专用匹配方法;des通过解密后比较
  • 默认密码:在特定场景下提供默认密码回退策略

图表来源

章节来源

RBAC权限模型与控制器映射

  • 角色与权限:令牌中注入权限集合,控制器通过注解或拦截器实现RBAC
  • 用户/角色/权限控制器:提供用户、角色、权限的CRUD与关联操作
  • 数据权限:结合业务实体与部门/组织维度实现数据级权限控制
  • 操作权限:通过细粒度接口与参数校验实现操作级权限控制

章节来源

会话管理与并发控制

  • 单点登录(SSO):通过共享的授权服务器与不透明令牌实现跨应用会话
  • 会话超时:由令牌生命周期与资源服务器配置共同决定
  • 并发会话控制:可通过自定义会话策略与Redis存储实现并发登录限制与踢出逻辑

章节来源

安全防护措施

  • CSRF防护:授权服务器端点关闭CSRF,前端侧通过令牌传递替代CSRF
  • XSS防护:后端严格输出编码与输入校验,前端避免内联脚本
  • SQL注入防护:使用ORM与参数化查询,避免动态SQL拼接
  • 接口限流:结合网关与业务层限流策略,防止暴力破解与滥用

章节来源

敏感数据保护

  • 传输加密:建议在生产环境强制HTTPS
  • 存储加密:密码采用bcrypt或des加密;密钥通过配置中心管理
  • 令牌存储:刷新令牌与授权记录持久化,采用安全存储与序列化策略

章节来源

安全审计日志

  • 用户操作日志:记录登录、权限变更、数据操作等关键行为
  • 安全事件日志:记录认证失败、令牌异常、越权尝试等
  • 访问控制日志:记录资源访问与授权决策
  • 分析与告警:结合日志平台进行聚合分析与实时告警

(本节为概念性内容,无需代码来源)

依赖分析

  • 组件耦合:授权服务器配置与认证提供者紧密耦合,令牌生成与增强相互依赖
  • 外部依赖:不透明令牌内省依赖授权服务器,异常处理依赖统一入口
  • 循环依赖:当前结构未见循环依赖风险

图表来源

章节来源

性能考虑

  • 令牌生成与内省:优先使用引用型令牌与高效内省实现,减少内存占用
  • 缓存与序列化:合理配置Redis序列化策略,避免大对象频繁序列化
  • 并发与限流:在授权端点与资源端点实施限流,防止突发流量冲击
  • 日志与监控:异步化审计日志,避免阻塞主业务路径

(本节为通用建议,无需代码来源)

故障排查指南

  • 未认证与拒绝访问:检查资源服务器异常处理器与令牌内省配置
  • 认证失败:核对客户端凭证、作用域与用户凭据
  • 令牌异常:确认令牌生成器与声明定制逻辑
  • URL放行问题:核对安全配置属性与过滤器忽略列表

章节来源

结论

DeviceMate的安全架构以Spring Security与OAuth2为核心,结合不透明令牌内省与自定义令牌增强,实现了可控、可扩展的认证授权体系。通过RBAC模型与多层防护策略,满足企业级安全需求。建议在生产环境中强化传输加密、密钥管理与审计分析能力,并持续开展安全评估与合规检查。

附录

  • 安全部署指导:建议在网关层统一开启HTTPS与WAF,对授权端点实施速率限制与IP白名单,定期轮换密钥与证书
  • 渗透测试:对授权端点、令牌内省端点与业务控制器进行黑盒/白盒测试,重点验证越权、注入与会话劫持
  • 合规检查:遵循ISO 27001、等级保护等标准,完善安全管理制度与应急预案

(本节为通用建议,无需代码来源)