34 KiB
34 KiB
安全设计
**本文引用的文件** - [安全设计.md](file://docs/technical-overview/10-安全设计.md) - [ViewshSecurityAutoConfiguration.java](file://viewsh-framework/viewsh-spring-boot-starter-security/src/main/java/com/viewsh/framework/security/config/ViewshSecurityAutoConfiguration.java) - [ViewshTenantAutoConfiguration.java](file://viewsh-framework/viewsh-spring-boot-starter-biz-tenant/src/main/java/com/viewsh/framework/tenant/config/ViewshTenantAutoConfiguration.java) - [ViewshDataPermissionAutoConfiguration.java](file://viewsh-framework/viewsh-spring-boot-starter-biz-data-permission/src/main/java/com/viewsh/framework/datapermission/config/ViewshDataPermissionAutoConfiguration.java) - [ApiEncryptProperties.java](file://viewsh-framework/viewsh-spring-boot-starter-web/src/main/java/com/viewsh/framework/encrypt/config/ApiEncryptProperties.java) - [RateLimiter.java](file://viewsh-framework/viewsh-spring-boot-starter-protection/src/main/java/com/viewsh/framework/ratelimiter/core/annotation/RateLimiter.java) - [ViewshRateLimiterConfiguration.java](file://viewsh-framework/viewsh-spring-boot-starter-protection/src/main/java/com/viewsh/framework/ratelimiter/config/ViewshRateLimiterConfiguration.java) - [RateLimiterAspect.java](file://viewsh-framework/viewsh-spring-boot-starter-protection/src/main/java/com/viewsh/framework/ratelimiter/core/aop/RateLimiterAspect.java) - [RateLimiterRedisDAO.java](file://viewsh-framework/viewsh-spring-boot-starter-protection/src/main/java/com/viewsh/framework/ratelimiter/core/redis/RateLimiterRedisDAO.java) - [IotAuthTypeEnum.java](file://viewsh-module-iot/viewsh-module-iot-core/src/main/java/com/viewsh/module/iot/core/enums/IotAuthTypeEnum.java) - [IotDeviceService.java](file://viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/device/IotDeviceService.java) - [IotDeviceServiceImpl.java](file://viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/service/device/IotDeviceServiceImpl.java) - [IotDeviceAuthInfoRespVO.java](file://viewsh-module-iot/viewsh-module-iot-server/src/main/java/com/viewsh/module/iot/controller/admin/device/vo/device/IotDeviceAuthInfoRespVO.java) - [CleanOrderAuditEvent.java](file://viewsh-module-iot/viewsh-module-iot-core/src/main/java/com/viewsh/module/iot/core/integration/event/clean/CleanOrderAuditEvent.java) - [CleanOrderAuditEventHandler.java](file://viewsh-module-ops/viewsh-module-environment-biz/src/main/java/com/viewsh/module/ops/environment/integration/consumer/CleanOrderAuditEventHandler.java) - [ruoyi-vue-pro.sql](file://sql/sqlserver/ruoyi-vue-pro.sql)目录
引言
本文件面向AIOT平台云项目,系统化阐述安全设计与实现,覆盖身份认证、权限控制、数据保护、网络防护、设备安全、安全审计与合规等方面。内容以仓库现有实现为依据,结合组件交互与流程图,帮助开发者与运维人员快速理解与落地安全策略。
项目结构
围绕安全主题的关键模块与文件分布如下:
- 安全基础与框架
- 安全自动装配与过滤器:Spring Security 扩展、认证入口、密码编码器、Token过滤器
- 多租户安全:租户上下文过滤、租户安全过滤、租户忽略URL解析
- 数据权限:MyBatis Plus 数据权限拦截器与规则工厂
- API保护与加密
- API加解密配置(对称/非对称算法、请求/响应密钥)
- 限流注解与切面、Redisson限流DAO
- 设备侧安全
- 设备认证类型枚举(一机一密、一型一密、动态注册、免鉴权)
- 设备认证服务与实现、设备认证信息响应VO
- 安全审计
- 清洁工单审计事件与事件处理器(发布业务日志、扩展字段、TTS联动)
- 登录日志表结构(含链路追踪、用户类型、结果等字段)
graph TB
subgraph "安全基础"
SEC["安全自动装配<br/>ViewshSecurityAutoConfiguration"]
TEN["多租户自动装配<br/>ViewshTenantAutoConfiguration"]
DP["数据权限自动装配<br/>ViewshDataPermissionAutoConfiguration"]
end
subgraph "API保护与加密"
ENC["API加解密配置<br/>ApiEncryptProperties"]
RL_ANN["限流注解<br/>RateLimiter"]
RL_CFG["限流配置<br/>ViewshRateLimiterConfiguration"]
RL_AOP["限流切面<br/>RateLimiterAspect"]
RL_DAO["限流DAO<br/>RateLimiterRedisDAO"]
end
subgraph "设备安全"
AUTH_ENUM["认证类型枚举<br/>IotAuthTypeEnum"]
AUTH_SVC["设备认证服务接口<br/>IotDeviceService"]
AUTH_IMPL["设备认证实现<br/>IotDeviceServiceImpl"]
AUTH_VO["认证信息响应VO<br/>IotDeviceAuthInfoRespVO"]
end
subgraph "安全审计"
EVT["审计事件模型<br/>CleanOrderAuditEvent"]
EH["审计事件处理器<br/>CleanOrderAuditEventHandler"]
LOGIN_LOG["登录日志表结构<br/>ruoyi-vue-pro.sql"]
end
SEC --> RL_CFG
SEC --> ENC
SEC --> EVT
TEN --> SEC
DP --> SEC
RL_CFG --> RL_AOP
RL_AOP --> RL_DAO
AUTH_IMPL --> AUTH_ENUM
AUTH_IMPL --> AUTH_SVC
EH --> EVT
EH --> AUTH_IMPL
LOGIN_LOG --> SEC
图表来源
- ViewshSecurityAutoConfiguration.java
- ViewshTenantAutoConfiguration.java
- ViewshDataPermissionAutoConfiguration.java
- ApiEncryptProperties.java
- RateLimiter.java
- ViewshRateLimiterConfiguration.java
- RateLimiterAspect.java
- RateLimiterRedisDAO.java
- IotAuthTypeEnum.java
- IotDeviceService.java
- IotDeviceServiceImpl.java
- IotDeviceAuthInfoRespVO.java
- CleanOrderAuditEvent.java
- CleanOrderAuditEventHandler.java
- ruoyi-vue-pro.sql
章节来源
- 安全设计.md
- ViewshSecurityAutoConfiguration.java
- ViewshTenantAutoConfiguration.java
- ViewshDataPermissionAutoConfiguration.java
- ApiEncryptProperties.java
- RateLimiter.java
- ViewshRateLimiterConfiguration.java
- RateLimiterAspect.java
- RateLimiterRedisDAO.java
- IotAuthTypeEnum.java
- IotDeviceService.java
- IotDeviceServiceImpl.java
- IotDeviceAuthInfoRespVO.java
- CleanOrderAuditEvent.java
- CleanOrderAuditEventHandler.java
- ruoyi-vue-pro.sql
核心组件
- 身份认证与OAuth2资源服务器
- 采用标准OAuth2 Resource Server架构,登录生成JWT,网关校验Authorization头并解析JWT,支持Redis白名单踢下线。
- 多端认证:管理端用户名/密码+图形验证码;移动端手机号/验证码+微信一键登录;设备端一机一密/一型一密/动态注册/免鉴权。
- 权限控制(RBAC与数据权限)
- RBAC:基于Spring Security的动态权限控制,注解式鉴权,服务启动时扫描Controller注解并上报权限标识。
- 数据权限:MyBatis Plus拦截器,支持全部数据、本部门及以下、本部门、仅本人、自定义部门等策略。
- 多租户权限隔离
- 通过租户上下文过滤、租户安全过滤、租户忽略URL解析、租户数据库拦截器等,实现跨模块的租户隔离。
- API安全防护
- API加解密:对称/非对称算法配置,请求/响应密钥分离,前后端约定一致。
- 限流:基于Redisson的分布式限流,支持全局、用户、IP、节点、表达式等Key解析器。
- 防重放与接口签名:关键接口携带Timestamp/Nonce,服务端校验时间窗与Nonce缓存;第三方开放API采用MD5(AppSecret)签名。
- 数据安全
- 敏感字段脱敏:注解驱动,序列化时自动掩码。
- 密码存储:BCrypt哈希+随机Salt。
- 日志审计:操作日志与异常监控。
- 设备安全
- 设备认证类型:一机一密、一型一密、动态注册、免鉴权。
- 设备认证服务:校验设备名、产品密钥、目标密钥,支持动态注册场景。
- 设备认证信息:客户端ID、用户名、密码等。
- 安全审计
- 审计事件模型:设备Key、区域ID、事件级别、审计数据、消息、事件时间、租户ID等。
- 事件处理器:根据审计类型确定日志类型与成功状态,发布业务日志,必要时联动IoT模块下发TTS。
- 登录日志表结构:包含链路追踪、用户类型、结果、IP、UA等字段。
章节来源
- 安全设计.md
- ViewshSecurityAutoConfiguration.java
- ViewshTenantAutoConfiguration.java
- ViewshDataPermissionAutoConfiguration.java
- ApiEncryptProperties.java
- RateLimiter.java
- ViewshRateLimiterConfiguration.java
- RateLimiterAspect.java
- RateLimiterRedisDAO.java
- IotAuthTypeEnum.java
- IotDeviceService.java
- IotDeviceServiceImpl.java
- IotDeviceAuthInfoRespVO.java
- CleanOrderAuditEvent.java
- CleanOrderAuditEventHandler.java
- ruoyi-vue-pro.sql
架构总览
下图展示认证、授权、数据权限、多租户与API保护的整体交互关系:
graph TB
GW["网关层"]
SEC["安全自动装配<br/>SecurityAutoConfiguration"]
TOK["Token认证过滤器"]
TEN["多租户自动装配<br/>TenantAutoConfiguration"]
DP["数据权限自动装配<br/>DataPermissionAutoConfiguration"]
ENC["API加解密配置<br/>ApiEncryptProperties"]
RL["限流配置/切面/DAO"]
GW --> SEC
SEC --> TOK
SEC --> TEN
SEC --> DP
SEC --> ENC
SEC --> RL
图表来源
- ViewshSecurityAutoConfiguration.java
- ViewshTenantAutoConfiguration.java
- ViewshDataPermissionAutoConfiguration.java
- ApiEncryptProperties.java
- ViewshRateLimiterConfiguration.java
详细组件分析
认证授权机制(JWT、OAuth2、多租户)
- OAuth2资源服务器
- 登录生成JWT,包含uid、tenant_id、scopes;网关校验Authorization头并解析JWT;支持Redis白名单踢下线。
- 多端认证
- 管理端:用户名/密码+图形验证码
- 移动端:手机号/验证码+微信一键登录
- 设备端:一机一密、一型一密、动态注册、免鉴权
- 多租户权限控制
- 租户上下文过滤、租户安全过滤、租户数据库拦截器、租户忽略URL解析、租户缓存管理器等协同工作,确保跨模块的租户隔离。
sequenceDiagram
participant C as "客户端"
participant G as "网关"
participant S as "安全自动装配"
participant T as "Token过滤器"
participant R as "Redis白名单"
C->>G : "携带Authorization : Bearer {token}"
G->>S : "进入安全过滤链"
S->>T : "校验JWT签名"
T-->>S : "签名有效/无效"
alt "签名有效"
S->>R : "检查token是否在白名单"
R-->>S : "在/不在"
alt "在白名单"
S-->>G : "放行"
G-->>C : "透传用户信息到下游"
else "不在白名单"
S-->>G : "拒绝"
G-->>C : "401 Unauthorized"
end
else "签名无效"
S-->>G : "拒绝"
G-->>C : "401 Unauthorized"
end
图表来源
章节来源
权限控制策略(RBAC与数据权限)
- RBAC
- 用户->角色->菜单/按钮(权限标识),注解式鉴权,服务启动时扫描Controller注解并上报权限标识。
- 数据权限
- MyBatis Plus拦截器,支持全部数据、本部门及以下、本部门、仅本人、自定义部门等策略。
flowchart TD
Start(["请求进入"]) --> RBAC["注解鉴权<br/>@PreAuthorize"]
RBAC --> RBAC_OK{"RBAC通过?"}
RBAC_OK --> |否| Deny["返回403"]
RBAC_OK --> |是| DP["数据权限拦截器"]
DP --> DP_OK{"数据权限通过?"}
DP_OK --> |否| Deny
DP_OK --> |是| Allow["放行执行业务"]
Deny --> End(["结束"])
Allow --> End
图表来源
章节来源
API安全防护(请求验证、限流、防攻击)
- 限流
- 注解@RateLimiter声明限流策略,切面统一拦截,Redisson实现分布式限流,支持多种Key解析器(全局、用户、IP、节点、表达式)。
- 防重放与接口签名
- 关键接口携带Timestamp与Nonce,服务端校验时间窗与Nonce缓存;第三方开放API采用MD5(AppSecret)签名。
sequenceDiagram
participant C as "客户端"
participant S as "控制器方法"
participant A as "限流切面"
participant D as "限流DAO(Redisson)"
participant E as "异常处理"
C->>S : "发起请求"
S->>A : "进入@RateLimiter切面"
A->>D : "计算Key并检查/更新限流状态"
alt "超过阈值"
A->>E : "抛出限流异常"
E-->>C : "返回限流错误"
else "未超限"
A-->>S : "放行"
S-->>C : "正常响应"
end
图表来源
- RateLimiter.java
- RateLimiterAspect.java
- ViewshRateLimiterConfiguration.java
- RateLimiterRedisDAO.java
章节来源
- 安全设计.md
- RateLimiter.java
- ViewshRateLimiterConfiguration.java
- RateLimiterAspect.java
- RateLimiterRedisDAO.java
数据加密方案(传输加密、存储加密、密钥管理)
- 传输加密
- API加解密配置支持对称/非对称算法,请求头约定用于区分前后端密钥用途,请求/响应密钥可分别配置。
- 存储加密
- 密码存储采用BCrypt(Spring Security默认),每个用户随机Salt,抵御彩虹表攻击。
- 密钥管理
- 建议:对称密钥(AES/SM4)与非对称密钥(RSA/SM2)按需配置,密钥轮换与最小权限原则,密钥存储于安全密管或环境变量。
flowchart TD
Req["请求到达"] --> CheckHeader["检查加密请求头"]
CheckHeader --> EncType{"对称/非对称?"}
EncType --> |对称| SymKey["使用对称密钥解密"]
EncType --> |非对称| AsymKey["使用私钥解密"]
SymKey --> Parse["解析参数"]
AsymKey --> Parse
Parse --> Resp["响应加密"]
Resp --> EncType2{"对称/非对称?"}
EncType2 --> |对称| SymResp["使用对称密钥加密"]
EncType2 --> |非对称| AsymResp["使用公钥加密"]
SymResp --> Send["发送响应"]
AsymResp --> Send
图表来源
章节来源
设备安全(认证、通信加密、固件安全)
- 设备认证类型
- 一机一密(DeviceSecret)、一型一密(ProductSecret)、动态注册、免鉴权。
- 设备认证流程
- 校验设备名、产品密钥、目标密钥;支持动态注册场景下的策略选择。
- 设备认证信息
- 客户端ID、用户名、密码等,便于设备侧接入与运维。
- 固件安全
- OTA固件管理,建议在固件下载与升级链路中引入完整性校验与签名验证(当前仓库未提供签名实现,建议补充)。
classDiagram
class IotAuthTypeEnum {
+SECRET
+PRODUCT_SECRET
+DYNAMIC
+NONE
}
class IotDeviceService {
+authDevice(authReqDTO) boolean
+validateDeviceListExists(ids) List
+getDeviceList(ids) List
+updateDeviceFirmware(deviceId, firmwareId) void
}
class IotDeviceServiceImpl {
+authDevice(authReqDTO) boolean
}
class IotDeviceAuthInfoRespVO {
+clientId
+username
+password
}
IotDeviceServiceImpl ..|> IotDeviceService
IotDeviceServiceImpl --> IotAuthTypeEnum : "使用认证类型"
IotDeviceServiceImpl --> IotDeviceAuthInfoRespVO : "返回认证信息"
图表来源
章节来源
安全审计(操作日志与事件监控)
- 审计事件模型
- 包含设备Key、区域ID、事件级别、审计数据、消息、事件时间、租户ID等字段。
- 事件处理器
- 根据审计类型确定日志类型与成功状态,发布业务日志;对特定事件(如TTS_REQUEST)联动IoT模块下发语音。
- 登录日志
- 表结构包含链路追踪、用户类型、结果、IP、UA等字段,便于审计与溯源。
sequenceDiagram
participant M as "业务模块"
participant E as "审计事件"
participant H as "事件处理器"
participant P as "业务日志发布器"
participant I as "IoT模块"
M->>E : "构建审计事件"
E->>H : "投递事件"
H->>H : "确定日志类型/成功状态"
alt "成功"
H->>P : "publishSuccess(context)"
else "失败"
H->>P : "publishFailure(context, message)"
end
alt "TTS_REQUEST"
H->>I : "下发语音播报"
end
图表来源
章节来源
依赖关系分析
- 组件耦合
- 安全自动装配为其他安全组件提供基础设施(认证入口、密码编码器、Token过滤器、上下文策略)。
- 多租户与数据权限均依赖MyBatis Plus拦截器,形成“租户隔离 + 数据权限”的双重保障。
- API保护(加解密、限流)与Redisson、Spring AOP协作,形成横切关注点。
- 外部依赖
- Redis/Redisson用于限流与白名单缓存。
- Spring Security用于认证与授权框架。
- MyBatis Plus用于数据权限拦截与租户行级隔离。
graph LR
SEC["SecurityAutoConfiguration"] --> TOK["TokenAuthenticationFilter"]
SEC --> ENC["ApiEncryptProperties"]
SEC --> RL["RateLimiter*"]
SEC --> TEN["TenantAutoConfiguration"]
SEC --> DP["DataPermissionAutoConfiguration"]
TEN --> DB["TenantDatabaseInterceptor"]
DP --> MP["MyBatisPlusInterceptor"]
RL --> RS["RedissonClient"]
图表来源
- ViewshSecurityAutoConfiguration.java
- ViewshTenantAutoConfiguration.java
- ViewshDataPermissionAutoConfiguration.java
- ViewshRateLimiterConfiguration.java
章节来源
- ViewshSecurityAutoConfiguration.java
- ViewshTenantAutoConfiguration.java
- ViewshDataPermissionAutoConfiguration.java
- ViewshRateLimiterConfiguration.java
性能考量
- 限流策略
- 合理设置time与count,避免过度限流影响用户体验;优先使用用户/IP/节点等细粒度Key解析器降低误伤。
- 缓存与白名单
- Redis白名单与Nonce缓存需设置合理TTL,避免内存膨胀;定期清理过期键。
- 数据权限与租户拦截
- 将数据权限拦截器置于分页插件之前,确保查询条件正确注入;避免复杂规则导致SQL性能下降。
- 设备认证
- 对高频认证接口启用限流;密钥校验逻辑尽量走缓存与常量时间比较,减少时序差异。
[本节为通用指导,无需列出章节来源]
故障排查指南
- 认证失败
- 检查Authorization头格式与JWT签名有效性;确认Redis白名单中是否存在该token。
- 权限不足
- 确认用户角色与权限标识是否正确上报;检查@PreAuthorize注解是否生效。
- 数据越权
- 核对数据权限规则配置;确认MyBatis Plus拦截器顺序与租户行级隔离是否启用。
- 限流触发
- 检查@RateLimiter注解配置与Key解析器;查看Redisson限流状态与TTL。
- 设备认证失败
- 校验设备名、产品密钥、目标密钥;确认认证类型与动态注册策略。
- 审计日志缺失
- 检查事件处理器是否正确发布业务日志;核对审计事件字段与日志类型判定逻辑。
章节来源
- 安全设计.md
- ViewshSecurityAutoConfiguration.java
- ViewshDataPermissionAutoConfiguration.java
- ViewshRateLimiterConfiguration.java
- IotDeviceServiceImpl.java
- CleanOrderAuditEventHandler.java
结论
本项目在安全设计上形成了“认证(OAuth2/JWT)+ 授权(RBAC/数据权限/多租户)+ API保护(限流/加解密/防重放)+ 设备安全(认证/通信/固件)+ 审计监控”的完整闭环。建议后续在以下方面持续完善:强化设备固件签名与完整性校验、细化密钥轮换与密管集成、扩展API签名与证书绑定、完善安全事件响应流程与演练。
[本节为总结性内容,无需列出章节来源]
附录
- 合规性与安全标准
- 建议对照《网络安全法》《数据安全法》《个人信息保护法》及行业标准(如等级保护2.0、商用密码应用评估)进行合规自评与整改。
- 安全事件响应流程(建议)
- 事件发现与分级 -> 应急处置与隔离 -> 影响评估与恢复 -> 根因分析与加固 -> 复盘与演练 -> 持续改进。
[本节为通用指导,无需列出章节来源]