水务管理系统安全模块提供完整的身份认证、权限控制、数据加密和安全审计能力,保障系统在生产环境中的安全性。
┌─────────────────────────────────────────────────────────┐
│ 客户端请求 │
└─────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ SecurityMiddleware(安全中间件层) │
│ ├─ Rate Limiting (限流: 60 req/min/IP) │
│ ├─ Security Headers (HSTS, CSP, X-Frame-Options...) │
│ ├─ JWT Authentication (Token 验证) │
│ ├─ CORS Protection (跨域限制) │
│ └─ Audit Logging (审计记录) │
└─────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 路由层 + 权限装饰器 │
│ ├─ @require_role(ADMIN, OPERATOR) │
│ ├─ @require_permission("data:read") │
│ └─ 输入验证 (SQL注入/XSS 防护) │
└─────────────────┬───────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ 业务逻辑层 │
│ ├─ 数据加密 (AES-256-GCM) │
│ ├─ 响应脱敏 (手机号/身份证/邮箱) │
│ └─ 审计事件触发 │
└─────────────────────────────────────────────────────────┘
Client Server
│ │
│ POST /auth/login │
│ {username, password} │
│ ───────────────────────>│
│ │ 1. 验证用户名/密码
│ │ 2. 检查账户状态
│ │ 3. 生成 JWT tokens
│ {access_token, │
│ refresh_token} │
│ <───────────────────────│
│ │
Client Server
│ │
│ GET /api/resource │
│ Authorization: Bearer │
│ <access_token> │
│ ───────────────────────>│
│ │ 1. 提取 Bearer token
│ │ 2. 验证签名和有效期
│ │ 3. 提取用户信息和角色
│ │ 4. 检查权限
│ 200 OK │
│ <───────────────────────│
Client Server
│ │
│ POST /auth/refresh │
│ {refresh_token} │
│ ───────────────────────>│
│ │ 1. 验证 refresh_token
│ │ 2. 生成新 access_token
│ {access_token} │
│ <───────────────────────│
| 类型 | 有效期 | 用途 |
|---|---|---|
| Access Token | 30 分钟 | API 请求认证 |
| Refresh Token | 7 天 | 刷新 Access Token |
| 角色 | 说明 | 典型用户 |
|---|---|---|
| ADMIN | 系统管理员,拥有所有权限 | IT 管理员 |
| OPERATOR | 操作员,可读写业务数据 | 值班操作员 |
| VIEWER | 只读用户,只能查看数据 | 管理层查看 |
| DEVICE | IoT 设备专用 | 传感器/网关 |
| 权限 | ADMIN | OPERATOR | VIEWER | DEVICE |
|---|---|---|---|---|
| system:manage | ✅ | ❌ | ❌ | ❌ |
| users:manage | ✅ | ❌ | ❌ | ❌ |
| roles:manage | ✅ | ❌ | ❌ | ❌ |
| devices:manage | ✅ | ✅ | ❌ | ❌ |
| data:read | ✅ | ✅ | ✅ | ✅ |
| data:write | ✅ | ✅ | ❌ | ✅ |
| data:delete | ✅ | ❌ | ❌ | ❌ |
| audit:read | ✅ | ❌ | ❌ | ❌ |
| config:manage | ✅ | ❌ | ❌ | ❌ |
| reports:read | ✅ | ✅ | ✅ | ❌ |
| reports:export | ✅ | ✅ | ❌ | ❌ |
系统使用 AES-256-GCM 模式加密敏感数据:
AES_ENCRYPTION_KEY 读取# 生成 32 字节密钥
python -c "import secrets; print(secrets.token_hex(16))"
# 设置环境变量
export AES_ENCRYPTION_KEY="your-hex-key-here"
export JWT_SECRET_KEY="your-jwt-secret-here"
生产环境必须使用 HTTPS,禁止明文 HTTP 传输敏感数据。
系统默认限制每 IP 每分钟 60 次请求,可通过环境变量调整:
export RATE_LIMIT_PER_MINUTE=100
所有用户输入都经过以下检查:
系统自动添加以下安全响应头:
| Header | 值 | 说明 |
|---|---|---|
| X-Content-Type-Options | nosniff | 禁止 MIME 嗅探 |
| X-Frame-Options | DENY | 禁止嵌套框架 |
| X-XSS-Protection | 1; mode=block | XSS 过滤器 |
| Strict-Transport-Security | max-age=31536000 | 强制 HTTPS |
| Content-Security-Policy | default-src 'self' | CSP 策略 |
| Referrer-Policy | strict-origin-when-cross-origin | 引用来源策略 |
敏感数据在返回客户端前自动脱敏:
from src.security import mask_phone, mask_id_card, mask_email
mask_phone("13812345678") # → "138****5678"
mask_id_card("110101199001011234") # → "1101**********1234"
mask_email("test@example.com") # → "t***@example.com"
| 事件 | 说明 | 严重程度 |
|---|---|---|
| login | 用户登录成功 | INFO |
| login_failed | 登录失败 | WARNING |
| logout | 用户登出 | INFO |
| user_create | 创建用户 | INFO |
| role_change | 角色变更 | WARNING |
| permission_change | 权限变更 | WARNING |
| data_delete | 数据删除 | WARNING |
| config_change | 配置变更 | CRITICAL |
| data_export | 数据导出 | INFO |
| 规则 | 触发条件 | 严重程度 |
|---|---|---|
| 多次登录失败 | 15 分钟内 5 次失败 | CRITICAL |
| 频繁权限变更 | 1 小时内 10 次变更 | WARNING |
| 批量数据删除 | 10 分钟内 20 次删除 | CRITICAL |
# 查询最近审计日志
curl -H "Authorization: Bearer <token>" \
http://localhost:8000/audit/logs
# 按用户过滤
curl -H "Authorization: Bearer <token>" \
"http://localhost:8000/audit/logs?user_id=admin"
# 查看安全告警
curl -H "Authorization: Bearer <token>" \
http://localhost:8000/audit/alerts
# JWT 配置
JWT_SECRET_KEY=your-secret-key-here
JWT_ALGORITHM=HS256
JWT_ACCESS_TOKEN_EXPIRE=30
JWT_REFRESH_TOKEN_EXPIRE=7
# 加密配置
AES_ENCRYPTION_KEY=your-32-char-hex-key
# 限流配置
RATE_LIMIT_PER_MINUTE=60
MAX_LOGIN_ATTEMPTS=5
LOCKOUT_DURATION_MINUTES=15
# CORS 配置
CORS_ALLOWED_ORIGINS=https://yourdomain.com,https://admin.yourdomain.com
# 审计配置
AUDIT_ENABLED=true
AUDIT_LOG_FILE=logs/audit.log
AUDIT_DB_STORAGE=true
AUDIT_ALERT_FAILED_LOGINS=5
# 密码策略
PASSWORD_MIN_LENGTH=8
PASSWORD_REQUIRE_UPPERCASE=true
PASSWORD_REQUIRE_LOWERCASE=true
PASSWORD_REQUIRE_DIGIT=true
PASSWORD_REQUIRE_SPECIAL=false
| 包 | 版本 | 用途 |
|---|---|---|
| PyJWT | ≥2.8.0 | JWT token 生成与验证 |
| passlib | ≥1.7.4 | 密码哈希(bcrypt) |
| bcrypt | ≥4.0.0 | 密码哈希算法 |
| cryptography | ≥41.0.0 | AES-256-GCM 加密 |
| FastAPI | ≥0.100.0 | Web 框架 |
| starlette | ≥0.27.0 | ASGI 中间件基础 |
最后更新: 2026-06-16