{{ item.meta?.title }}
{{ item.meta?.title }}
```
---
## 安全策略
### 1. 前后端双重验证
```
前端路由守卫(第一层防护)
↓
后端 API 权限校验(第二层防护)
↓
PostgREST 数据权限(第三层防护)
```
### 2. Token 防篡改
- JWT 签名验证
- Token 有效期控制(24小时)
- Token 刷新机制
### 3. 路由访问审计
记录所有路由访问日志:
```python
# 在路由守卫中记录审计日志
await AuditLogger.log_route_access(
user_id=user_id,
route_path=route_path,
is_allowed=has_access,
ip_address=request.client.host
)
```
### 4. 最小权限原则
- 默认拒绝所有访问
- 显式授权才能访问
- 未配置的路由一律返回 403
---
## 性能优化
### 1. 缓存策略
| 缓存层级 | 存储位置 | TTL | 说明 |
|---------|---------|-----|------|
| 用户路由缓存 | Redis | 30分钟 | 用户可访问路由列表 |
| 角色路由缓存 | Redis | 30分钟 | 角色可访问路由列表 |
| 前端路由缓存 | LocalStorage | 登录期间 | 前端动态路由数据 |
### 2. 懒加载
```javascript
// 路由组件按需加载
component: () => import('@/views/system/Users.vue')
```
### 3. 数据库优化
- 索引优化:`parent_id`、`role_id`、`route_id`
- 查询优化:使用 JOIN 减少查询次数
- 连接池:复用数据库连接
---
## 实施步骤
### 阶段一:数据库准备(第1天)
1. ✅ 检查 `sys_routes` 和 `role_route` 表结构
2. ✅ 添加缺失字段(如 `icon`、`is_hidden` 等)
3. ✅ 创建索引
4. ✅ 编写初始化数据 SQL(系统路由 + 角色-路由关联)
### 阶段二:后端实现(第2天)
1. ✅ 实现 `RoutePermission` 模块
2. ✅ 实现 `/rbac/user/routes` 接口
3. ✅ 实现 `/rbac/roles/{role_id}/routes` 接口
4. ✅ 实现 `/rbac/check-route` 接口
5. ✅ 集成到现有认证流程
### 阶段三:前端对接文档(第2天)
1. ✅ 编写接口文档
2. ✅ 编写前端集成示例(Vue3)
3. ✅ 编写路由守卫示例
4. ✅ 编写动态菜单示例
### 阶段四:测试验证(第3天)
1. ✅ 编写单元测试
2. ✅ 编写集成测试
3. ✅ 性能测试(缓存命中率、响应时间)
4. ✅ 安全测试(未授权访问、Token 篡改)
---
## 测试方案
### 1. 单元测试
```python
# tests/test_route_permission.py
async def test_get_user_routes():
"""测试获取用户路由"""
routes = await RoutePermission.get_user_routes(user_id=5)
assert len(routes) > 0
assert routes[0]['route_path'] == '/dashboard'
async def test_check_route_access_allowed():
"""测试路由访问权限(有权限)"""
has_access = await RoutePermission.check_route_access(
user_id=5,
route_path='/system/users'
)
assert has_access == True
async def test_check_route_access_denied():
"""测试路由访问权限(无权限)"""
has_access = await RoutePermission.check_route_access(
user_id=9,
route_path='/system/roles'
)
assert has_access == False
```
### 2. 集成测试
```python
# tests/test_rbac_routes_api.py
async def test_get_current_user_routes_api():
"""测试获取当前用户路由接口"""
response = await client.get(
'/rbac/user/routes',
headers={'Authorization': f'Bearer {token}'}
)
assert response.status_code == 200
data = response.json()
assert 'routes' in data
assert len(data['routes']) > 0
```
### 3. 性能测试
- 缓存命中率 > 95%
- 接口响应时间 < 100ms
- 并发 1000 QPS 无压力
---
## 风险评估与应对
### 风险1:Redis 不可用
**应对**:降级策略,直接查询数据库
### 风险2:路由数据量大(>1000条)
**应对**:
- 分页加载
- 按需加载子菜单
- 前端虚拟滚动
### 风险3:缓存一致性
**应对**:
- 更新路由时清除相关缓存
- 设置合理的 TTL(30分钟)
- 提供手动刷新缓存接口
---
**文档版本**: v1.0
**最后更新**: 2025-11-17
**维护者**: DocAuditAI Team