197 lines
4.5 KiB
Markdown
197 lines
4.5 KiB
Markdown
|
|
# 安全规则
|
||
|
|
|
||
|
|
> **入口**: [_index.md](_index.md)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. RBAC模型
|
||
|
|
|
||
|
|
### 1.1 预设角色
|
||
|
|
|
||
|
|
| 角色 | 权限范围 | 说明 |
|
||
|
|
|------|---------|------|
|
||
|
|
| **ADMIN** | 全部 | 系统管理员 |
|
||
|
|
| **MANAGER** | 部门级 | 运营主管 |
|
||
|
|
| **OPERATOR** | 个人级 | 运营专员 |
|
||
|
|
| **FINANCE** | 财务级 | 财务主管 |
|
||
|
|
| **SOURCING** | 采购级 | 采购专家 |
|
||
|
|
| **LOGISTICS** | 物流级 | 物流专家 |
|
||
|
|
| **ANALYST** | 只读 | 数据分析师 |
|
||
|
|
|
||
|
|
### 1.2 角色权限矩阵
|
||
|
|
|
||
|
|
| 操作类型 | OPERATOR | MANAGER | FINANCE | ADMIN |
|
||
|
|
|---------|----------|---------|---------|-------|
|
||
|
|
| 查看数据 | ✅ 自己 | ✅ 部门 | ✅ 财务 | ✅ 全部 |
|
||
|
|
| 创建数据 | ✅ | ✅ | ✅ | ✅ |
|
||
|
|
| 修改数据 | ✅ 自己 | ✅ 部门 | ✅ 财务 | ✅ 全部 |
|
||
|
|
| 删除数据 | ❌ | ✅ 部门 | ✅ 财务 | ✅ 全部 |
|
||
|
|
| 审批操作 | ❌ | ✅ 低风险 | ✅ 中风险 | ✅ 全部 |
|
||
|
|
| 系统配置 | ❌ | ❌ | ❌ | ✅ |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. 数据隔离
|
||
|
|
|
||
|
|
### 2.1 隔离层级
|
||
|
|
|
||
|
|
```
|
||
|
|
租户隔离 (Tenant)
|
||
|
|
└── 组织隔离 (Organization)
|
||
|
|
└── 部门隔离 (Department)
|
||
|
|
└── 团队隔离 (Team)
|
||
|
|
└── 个人隔离 (Self)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2.2 数据范围类型
|
||
|
|
|
||
|
|
| 范围 | 英文 | 说明 |
|
||
|
|
|------|------|------|
|
||
|
|
| 仅自己 | SELF | 只看自己创建的数据 |
|
||
|
|
| 本团队 | TEAM | 看自己团队的数据 |
|
||
|
|
| 本部门 | DEPT | 看自己部门的数据 |
|
||
|
|
| 本组织 | ORG | 看整个公司的数据 |
|
||
|
|
| 全平台 | ALL | 超管,看所有租户数据 |
|
||
|
|
|
||
|
|
### 2.3 查询过滤实现
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// Service层实现数据隔离
|
||
|
|
async listOrders(ctx: Context, params: ListParams) {
|
||
|
|
const { tenantId, dataScope, parentId } = ctx.state.user;
|
||
|
|
|
||
|
|
const query = db('cf_order').where('tenant_id', tenantId);
|
||
|
|
|
||
|
|
switch (dataScope) {
|
||
|
|
case 'SELF':
|
||
|
|
query.where('created_by', ctx.state.user.id);
|
||
|
|
break;
|
||
|
|
case 'TEAM':
|
||
|
|
query.where('team_id', parentId);
|
||
|
|
break;
|
||
|
|
case 'DEPT':
|
||
|
|
query.where('dept_id', parentId);
|
||
|
|
break;
|
||
|
|
case 'ORG':
|
||
|
|
// 已通过 tenant_id 过滤
|
||
|
|
break;
|
||
|
|
case 'ALL':
|
||
|
|
// 超管,不过滤
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return query;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. 操作风险等级
|
||
|
|
|
||
|
|
### 3.1 风险分级
|
||
|
|
|
||
|
|
| 等级 | 操作类型 | 最低审核权限 | 自动执行 |
|
||
|
|
|------|---------|-------------|---------|
|
||
|
|
| **低风险** | 库存预警、数据同步 | OPERATOR | ✅ 允许 |
|
||
|
|
| **中风险** | 定价调整、广告投放 | MANAGER | ✅ 高置信度允许 |
|
||
|
|
| **高风险** | 退款审批、合同签订 | FINANCE | ❌ 禁止 |
|
||
|
|
| **极高风险** | 大额转账、系统配置 | ADMIN | ❌ 禁止 |
|
||
|
|
|
||
|
|
### 3.2 AI决策权限
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
interface AIDecisionPermission {
|
||
|
|
module: string;
|
||
|
|
action: string;
|
||
|
|
riskLevel: 'low' | 'medium' | 'high' | 'critical';
|
||
|
|
minReviewerRole: 'OPERATOR' | 'MANAGER' | 'FINANCE' | 'ADMIN';
|
||
|
|
autoExecute: boolean;
|
||
|
|
autoExecuteConfidence: number; // 0.0 - 1.0
|
||
|
|
requireDualApproval: boolean;
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. 决策流程门禁
|
||
|
|
|
||
|
|
### 4.1 状态流转
|
||
|
|
|
||
|
|
```
|
||
|
|
SUGGESTED → PENDING_REVIEW → EXECUTED/REJECTED
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4.2 强制规则
|
||
|
|
|
||
|
|
| 规则 | 说明 |
|
||
|
|
|------|------|
|
||
|
|
| **禁止** | Agent 直接修改核心业务数据 |
|
||
|
|
| **必须** | 人工在 Console 端确认后方可执行 |
|
||
|
|
| **必须** | 所有决策记录审计日志 |
|
||
|
|
|
||
|
|
### 4.3 核心业务数据
|
||
|
|
|
||
|
|
- 价格调整
|
||
|
|
- 退款审批
|
||
|
|
- 订单创建
|
||
|
|
- 合同签订
|
||
|
|
- 大额转账
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. 审计日志
|
||
|
|
|
||
|
|
### 5.1 必须记录
|
||
|
|
|
||
|
|
| 字段 | 说明 |
|
||
|
|
|------|------|
|
||
|
|
| `operator_id` | 操作人ID |
|
||
|
|
| `operator_role` | 操作人角色 |
|
||
|
|
| `action` | 操作类型 |
|
||
|
|
| `target_type` | 目标类型 |
|
||
|
|
| `target_id` | 目标ID |
|
||
|
|
| `before_value` | 操作前值 |
|
||
|
|
| `after_value` | 操作后值 |
|
||
|
|
| `trace_id` | 链路追踪ID |
|
||
|
|
| `created_at` | 操作时间 |
|
||
|
|
|
||
|
|
### 5.2 日志保留
|
||
|
|
|
||
|
|
| 日志类型 | 保留期限 |
|
||
|
|
|---------|---------|
|
||
|
|
| 登录日志 | 90天 |
|
||
|
|
| 操作日志 | 180天 |
|
||
|
|
| 审计日志 | 365天 |
|
||
|
|
| 异常日志 | 30天 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. 敏感数据处理
|
||
|
|
|
||
|
|
### 6.1 敏感字段
|
||
|
|
|
||
|
|
| 字段类型 | 处理方式 |
|
||
|
|
|---------|---------|
|
||
|
|
| 密码 | 加密存储,禁止明文 |
|
||
|
|
| 手机号 | 脱敏显示 `138****1234` |
|
||
|
|
| 银行卡 | 脱敏显示 `**** **** **** 1234` |
|
||
|
|
| 身份证 | 脱敏显示 `110***********1234` |
|
||
|
|
| API密钥 | 加密存储,禁止日志输出 |
|
||
|
|
|
||
|
|
### 6.2 禁止行为
|
||
|
|
|
||
|
|
```typescript
|
||
|
|
// ❌ 禁止
|
||
|
|
console.log('API Key:', apiKey);
|
||
|
|
logger.info('User password:', password);
|
||
|
|
ctx.body = { password: user.password };
|
||
|
|
|
||
|
|
// ✅ 正确
|
||
|
|
logger.info('API Key: ***');
|
||
|
|
ctx.body = { password: '***' };
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
*最后更新: 2026-03-22*
|