sup-iam数据库设计说明书
数据库设计说明书
项目名称: sup-iam 身份识别与访问管理系统
编写人: 沈冬法
日期: 2025年12月15日
版本号: V1.0
1.设计目标与约束
1.1 设计目标
- 持久化存储元数据
- 高效的数据查询
- 安全的数据存储
- 可审计的数据处理
- 可演进的表结构
1.2 设计约束
- 确保明文存储的SK的安全
2.核心实体关系
我们有三大核心实体
- User:控制面的登录用户
- Secret: 密钥资源
- Policy:权限资源
和一大实体关系
- Secret和Policy的m:n绑定关系

3.表设计说明
3.1 users表(User)
字段设计表
| 名称 | 类型 | 业务 | 规模 | 约束和性质 |
|---|---|---|---|---|
| id | bigint | 自增主键 | 20位 | 主键,自增 |
| instanceID | 变字符串 | 跨域uud | 32位 | 唯一键 |
| username | 可变字符串 | 用户名 | 255位 | 唯一键,非空 |
| nickname | 可变字符串 | 昵称 | 30位 | 非空 |
| isEnable | tinyint | 账户是否启用, 1可用,0不可用 | 1位 | 非空 |
| phone | 可变字符串 | 手机号 | 20位 | 默认为空 |
| 可变字符串 | 邮箱 | 256位 | 默认为空 | |
| isAdmin | tinyint | 是否有管理员权限 | 1位 | 默认为0 |
| extandShadow | longtext | 拓展字段 | 不超过longtext | 默认为空 |
| loggedAt | timestamp | 登录时间 | 时间戳长度 | 默认为空 |
| createdAt | timestamp | 创建时间 | 时间戳长度 | 非空 |
| updatedAt | timestamp | 更新时间 | 时间戳长度 | 非空 |
3.2 secrets表(Secret)
| 名称 | 类型 | 业务 | 规模 | 约束和性质 |
|---|---|---|---|---|
| id | bigint | 自增主键 | 20位 | 主键,自增 |
| instanceID | 变字符串 | 跨域uud | 32位 | 唯一键 |
| userID | bigint | 所属用户id | 20位 | 外键,索引键,非空 |
| username | 可变字符串 | username 字段为冗余展示字段,实际逻辑关联关系基于 userID |
255位 | 外键, 非空 |
| accessKey | 可变字符串 | 密钥ID | 36位 | 唯一键,非空 |
| secretKey | 可变字符串 | 私钥 | 255位 | 非空 |
| expires | int | 过期时间,使用 Unix Timestamp(秒级) | 64位 | 默认1534308590 |
| description | 可变字符串 | 密钥描述 | 255位 | 默认为空 |
| extendShadow | longtext | 拓展字段 | 不超过longtext | 默认为空 |
| createdAt | timestamp | 创建时间 | 时间戳长度 | 非空 |
| updatedAt | timestamp | 更新时间 | 时间戳长度 | 非空 |
3.3 policies策略表(Policy)
| 名称 | 类型 | 业务 | 规模 | 约束和性质 |
|---|---|---|---|---|
| id | bigint | 自增主键 | 20位 | 主键,自增 |
| instanceID | 变字符串 | 跨域uud | 32位 | 唯一键 |
| name | 可变字符串 | 策略名称 | 64位 | 非空 |
| username | 可变字符串 | 所属用户名 | 255位 | 外键,索引键,非空 |
| description | 可变字符串 | 密钥描述 | 255位 | 默认为空 |
| policyShadow | longtext | 策略描述影子字段 | 不超过longtext | 默认为空 |
| extendShadow | longtext | 拓展字段 | 不超过longtext | 默认为空 |
| createdAt | timestamp | 创建时间 | 时间戳长度 | 非空 |
| updatedAt | timestamp | 更新时间 | 时间戳长度 | 非空 |
3.4 secret_policy_binding绑定表
| 名称 | 类型 | 业务 | 规模 | 约束和性质 |
|---|---|---|---|---|
| id | bigint | 自增主键 | 20位 | 主键,自增 |
| secretID | bigint | 密钥ID | 20位 | 外键 |
| policyID | bigint | 策略ID | 20位 | 外键 |
| username | 可变字符串 | 所属用户名 | 255位 | 外键,索引键,非空 |
| extendShadow | longtext | 拓展字段 | 不超过longtext | 默认为空 |
| createdAt | timestamp | 创建时间 | 时间戳长度 | 非空 |
3.5 secret_policy_binding_autid绑定审计表
该表用于记录 绑定关系 的删除、更新历史快照,用于审计与回溯,不参与在线鉴权。
(secretID, policyID) 组合应具备唯一性约束,防止重复绑定。
| 名称 | 类型 | 业务 | 规模 | 约束和性质 |
|---|---|---|---|---|
| id | bigint | 自增主键 | 20位 | 主键,自增 |
| secretID | bigint | 密钥ID | 20位 | 外键 |
| policyID | bigint | 策略ID | 20位 | 外键 |
| username | 可变字符串 | 所属用户名 | 255位 | 外键,索引键,非空 |
| extendShadow | longtext | 拓展字段 | 不超过longtext | 默认为空 |
| createdAt | timestamp | 创建时间 | 时间戳长度 | 非空 |
3.6 policies_audit策略审计表(Policy Audit)
该表用于记录 Policy 的删除、更新历史快照,用于审计与回溯,不参与在线鉴权。
| 名称 | 类型 | 业务 | 规模 | 约束和性质 |
|---|---|---|---|---|
| id | bigint | 自增主键 | 20位 | 主键,自增 |
| instanceID | 变字符串 | 跨域uud | 32位 | 唯一键 |
| name | 可变字符串 | 策略名称 | 64位 | 非空 |
| username | 可变字符串 | 所属用户名 | 255位 | 外键,索引键,非空 |
| description | 可变字符串 | 密钥描述 | 255位 | 默认为空 |
| policyShadow | longtext | 策略描述影子字段 | 不超过longtext | 默认为空 |
| extendShadow | longtext | 拓展字段 | 不超过longtext | 默认为空 |
| createdAt | timestamp | 创建时间 | 时间戳长度 | 非空 |
| updatedAt | timestamp | 更新时间 | 时间戳长度 | 非空 |
4. 安全字段
4.1 用户密码字段
密码字段仅用于 IAM 控制面用户的身份认证
不参与任何数据面鉴权流程
设计原则:
- 使用不可逆哈希算法存储(如 bcrypt)
- 数据库中不存储明文密码
- 禁止任何形式的密码回显
4.2 secretKey 字段
Secret Key 为系统中最高敏感级别数据,用于数据面鉴权请求签名校验。
- 当前版本设计说明:
Secret Key以明文形式存储于数据库- 仅
Auth Server在鉴权流程中可访问该字段 - IAM 管理服务不直接参与鉴权计算
- 安全约束:
+Secret Key仅在创建或重置时返回一次- 日志、缓存、审计数据中禁止记录
Secret Key - 数据库访问需处于可信网络环境中
- 日志、缓存、审计数据中禁止记录
- 演进方向(非本版本目标):
- 引入 KMS 对 Secret Key 进行加密存储
或采用不可逆派生存储(HMAC 派生值)替代明文存储,但是会导致鉴权过于复杂
4.3 Shadow / Extend 字段安全约束
policyShadow、extendShadow 等字段用于承载策略 DSL 或扩展元数据。
设计约束:
- Shadow 字段内容不参与数据库级别逻辑判断
- 解析失败的策略在鉴权时应被视为拒绝(Deny)
- Shadow 字段中不得包含 Secret Key、AccessKey 等敏感信息
4.4 审计表安全设计
审计表用于记录历史状态快照,不参与在线鉴权。
设计原则:
- 审计数据只写不改
- 不允许审计表回写主业务表
- 审计数据中禁止出现 Secret Key 等高敏感字段
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 supdriver的博客!
评论