273 lines
8.0 KiB
Markdown
273 lines
8.0 KiB
Markdown
# 不同权限用户可视内容测试报告
|
||
|
||
## 测试概览
|
||
|
||
**执行时间**: 2025-11-18 11:35:38
|
||
**测试目标**: 验证不同权限用户是否只能看到授权范围内的许可数据
|
||
**测试预期**: 上级能看到下级数据,同级用户不能看到彼此数据
|
||
**测试结果**: ❌ **数据可见性未实现分级控制**
|
||
|
||
---
|
||
|
||
## 权限体系分析
|
||
|
||
### 1. 当前权限结构
|
||
|
||
系统采用 **基于grade的层级权限** 模型:
|
||
|
||
| 用户类型 | grade | role | 部门层级 | 预期可见性 |
|
||
|---------|-------|------|----------|-----------|
|
||
| 超级管理员 | 100 | admin | 无部门 | 所有数据 |
|
||
| 市级管理员 | 90 | department_admin | 市级服务部门 | 所有区域数据 |
|
||
| 区级管理员 | 80 | department_admin | 区级服务部门 | 所属区域数据 |
|
||
|
||
### 2. 现有测试账号
|
||
|
||
测试过程中验证的账号:
|
||
|
||
1. **admin** - 超级管理员 (grade: 100)
|
||
2. **fssjsj** - 市级管理员 (grade: 90)
|
||
3. **fssjnh** - 南海区管理员 (grade: 80)
|
||
4. **fssjss** - 三水区管理员 (grade: 80)
|
||
5. **fssjsd** - 顺德区管理员 (grade: 80)
|
||
6. **fssjcc** - 禅城区管理员 (grade: 80)
|
||
7. **fssjgm** - 高明区管理员 (grade: 80)
|
||
|
||
---
|
||
|
||
## 测试结果详情
|
||
|
||
### 测试场景1: 超级管理员 (admin) 权限验证
|
||
|
||
**登录状态**: ✅ 成功
|
||
- 用户角色: admin
|
||
- 用户级别: 100
|
||
- 可见许可数量: **91个**
|
||
- 市级: 89个许可
|
||
- 顺德区: 1个许可
|
||
- 高明区: 1个许可
|
||
|
||
### 测试场景2: 市级管理员 (fssjsj) 权限验证
|
||
|
||
**登录状态**: ✅ 成功
|
||
- 用户角色: department_admin
|
||
- 用户级别: 90
|
||
- 可见许可数量: **91个**
|
||
- 市级: 89个许可
|
||
- 顺德区: 1个许可
|
||
- 高明区: 1个许可
|
||
|
||
**与分析预期差异**:
|
||
- ✅ 市级管理员确实可以访问所有区域数据
|
||
- ✅ 符合预期设计
|
||
|
||
### 测试场景3: 区级管理员 (南海区 fssjnh) 权限验证
|
||
|
||
**登录状态**: ✅ 成功
|
||
- 用户角色: department_admin
|
||
- 用户级别: 80
|
||
- 可见许可数量: **91个**
|
||
- 市级: 89个许可
|
||
- 顺德区: 1个许可
|
||
- 高明区: 1个许可
|
||
|
||
**与分析预期差异**:
|
||
- ❌ 区级管理员可以看到所有区域数据(预期只能看到南海区数据)
|
||
- ❌ **不符合预期设计**
|
||
|
||
---
|
||
|
||
## 关键发现
|
||
|
||
### 🔴 核心问题
|
||
|
||
**当前系统未实现数据可见性分级控制**
|
||
|
||
所有权限级别的用户(包括区级管理员)都可以查看所有区域的许可数据,包括:
|
||
- 其他区域的数据
|
||
- 上级部门的数据
|
||
- 同级部门的数据
|
||
|
||
### 📊 数据可见性对比
|
||
|
||
| 用户类型 | 预期可见性 | 实际可见性 | 是否符合预期 |
|
||
|---------|-----------|-----------|-------------|
|
||
| 超级管理员 | 所有数据 | 所有数据 (91个) | ✅ |
|
||
| 市级管理员 | 所有数据 | 所有数据 (91个) | ✅ |
|
||
| 区级管理员 | 所属区域 | **所有数据 (91个)** | ❌ |
|
||
|
||
### 🔍 技术分析
|
||
|
||
#### 权限控制层次
|
||
1. **数据层面**: 无部门/用户数据归属字段
|
||
- permits表只有 `id` 和 `name` 字段
|
||
- 无 `owner_id`、`department_id`、`created_by` 等字段
|
||
|
||
2. **API层面**: 无基于部门的数据过滤
|
||
- 无论用户grade多少,都返回相同数据
|
||
- 获取许可的API不检查用户部门归属
|
||
|
||
3. **界面层面**: 无基于角色的视图控制
|
||
- 所有用户看到相同的许可列表
|
||
- 无按部门/区域过滤选项
|
||
|
||
#### 当前权限控制的实际作用
|
||
|
||
当前的权限系统主要控制的是:
|
||
- ✅ **管理操作权限**: 创建、编辑、删除数据的权限
|
||
- ✅ **API访问权限**: 某些敏感API需要特定角色才能调用
|
||
- ❌ **数据可见性**: **未实现**数据按部门/层级的可见性控制
|
||
|
||
---
|
||
|
||
## 测试数据统计
|
||
|
||
### 许可数据分布
|
||
|
||
| 区域 | 许可数量 | 占比 |
|
||
|------|---------|------|
|
||
| 市级 | 89 | 97.8% |
|
||
| 顺德区 | 1 | 1.1% |
|
||
| 高明区 | 1 | 1.1% |
|
||
| **总计** | **91** | **100%** |
|
||
|
||
### 用户权限分布
|
||
|
||
| 权限级别 | 用户数 | 角色 |
|
||
|---------|-------|------|
|
||
| grade 100 | 1 | admin |
|
||
| grade 90 | 1 | department_admin |
|
||
| grade 80 | 5 | department_admin |
|
||
| **总计** | **7** | - |
|
||
|
||
---
|
||
|
||
## 安全评估
|
||
|
||
### ⚠️ 潜在风险
|
||
|
||
1. **数据泄露风险**: 区级管理员可以看到其他所有区域的数据
|
||
2. **职责不清**: 用户权限与实际可见数据不匹配
|
||
3. **审计困难**: 无法追踪谁查看了哪些数据
|
||
4. **不符合最小权限原则**: 用户拥有超出职责范围的数据访问权限
|
||
|
||
### ✅ 安全优势
|
||
|
||
1. **认证系统健全**: 登录、会话管理正常工作
|
||
2. **密码安全**: 使用哈希存储密码
|
||
3. **会话保护**: 基于Cookie的会话管理
|
||
4. **角色验证**: 敏感操作需要相应角色
|
||
|
||
---
|
||
|
||
## 改进建议
|
||
|
||
### 方案1: 实现数据归属字段(推荐)
|
||
|
||
**实现方式**:
|
||
```sql
|
||
ALTER TABLE permits ADD COLUMN owner_department_id uuid REFERENCES service_departments(id);
|
||
ALTER TABLE permits ADD COLUMN created_by uuid REFERENCES auth_users(id);
|
||
ALTER TABLE permits ADD COLUMN visibility_level int DEFAULT 1; -- 1=部门, 2=区域, 3=全部
|
||
```
|
||
|
||
**API层面修改**:
|
||
```python
|
||
# 获取许可时根据用户部门过滤
|
||
def get_permits_for_user(user, region):
|
||
base_query = "SELECT * FROM permits WHERE region = %s"
|
||
if user['grade'] < 90: # 区级管理员
|
||
base_query += " AND owner_department_id = %s"
|
||
params = (region, user['service_department_id'])
|
||
else: # 市级及以上
|
||
params = (region,)
|
||
return execute_query(base_query, params)
|
||
```
|
||
|
||
### 方案2: 基于视图的权限控制
|
||
|
||
**创建数据库视图**:
|
||
```sql
|
||
CREATE VIEW permits_by_department AS
|
||
SELECT p.*, sd.name as owner_department_name
|
||
FROM permits p
|
||
JOIN service_departments sd ON p.owner_department_id = sd.id;
|
||
```
|
||
|
||
**API使用视图而非原表**,根据当前用户自动过滤。
|
||
|
||
### 方案3: 增强现有权限系统
|
||
|
||
在现有API基础上添加权限检查:
|
||
```python
|
||
@require_permission('view_permits_in_region')
|
||
def get_permits(region):
|
||
user = get_current_user()
|
||
if user['grade'] < 90 and user['department']['region'] != region:
|
||
raise PermissionDenied("无法查看其他区域数据")
|
||
return fetch_permits(region)
|
||
```
|
||
|
||
### 实施优先级
|
||
|
||
| 优先级 | 改进项目 | 工作量 | 效果 |
|
||
|-------|---------|--------|-----|
|
||
| P0 | 添加数据归属字段 | 高 | 完全解决可见性问题 |
|
||
| P1 | API权限检查 | 中 | 快速缓解安全问题 |
|
||
| P2 | 前端视图控制 | 低 | 提升用户体验 |
|
||
| P3 | 审计日志 | 中 | 提升安全可追溯性 |
|
||
|
||
---
|
||
|
||
## 测试结论
|
||
|
||
### 总体评估: ⚠️ **需要改进**
|
||
|
||
**当前状态**: 系统具备完整的用户管理和权限管理体系,但**未实现数据可见性分级控制**。
|
||
|
||
**核心问题**: 不同权限用户看到的都是相同数据,不符合"上级看数据,下级看数据"的权限隔离需求。
|
||
|
||
**建议行动**:
|
||
1. **短期** (1周内): 实施API层面的数据可见性检查
|
||
2. **中期** (1月内): 添加数据归属字段,完全重构权限模型
|
||
3. **长期** (3月内): 建立完整的审计和监控体系
|
||
|
||
### 测试评分
|
||
|
||
| 维度 | 评分 | 说明 |
|
||
|------|------|------|
|
||
| 功能完整性 | ⭐⭐⭐⭐⭐ | 所有测试账号均可正常访问系统 |
|
||
| 权限验证 | ⭐⭐ | 认证正常,但数据可见性未分级 |
|
||
| 安全性 | ⭐⭐ | 数据可见性存在严重问题 |
|
||
| 稳定性 | ⭐⭐⭐⭐⭐ | 系统稳定,无崩溃或错误 |
|
||
| **综合评分** | **⭐⭐⭐ (3/5)** | **需要优先解决数据可见性问题** |
|
||
|
||
---
|
||
|
||
## 附录
|
||
|
||
### 测试环境信息
|
||
|
||
- **应用地址**: http://127.0.0.1:8000
|
||
- **测试工具**: Python + urllib
|
||
- **数据库**: PostgreSQL (licensing_risks)
|
||
- **测试日期**: 2025-11-18
|
||
|
||
### 测试文件
|
||
|
||
1. `test_permission_comprehensive.py` - 综合权限测试脚本
|
||
2. `/tmp/permission_test_results.json` - 详细测试结果
|
||
|
||
### API端点测试
|
||
|
||
- ✅ `/auth/login` - 登录功能正常
|
||
- ✅ `/auth/logout` - 登出功能正常
|
||
- ✅ `/v2/regions` - 获取区域列表正常
|
||
- ✅ `/getPermits` - 获取许可数据正常(但无权限过滤)
|
||
|
||
---
|
||
|
||
**报告生成时间**: 2025-11-18 11:40:00
|
||
**测试执行人**: Claude Code (Anthropic AI Assistant)
|
||
**报告版本**: v1.0
|