feat: add system admin account management with RBAC

- AdminUser model: multi-admin accounts with bcrypt hashing (admin_users table)
- Three roles: superadmin / admin / viewer with granular permission bits
- auth.py: login migrated from env-var single admin to DB-backed accounts;
  seed_initial_admin() auto-creates first superadmin from SM_ADMIN_PASSWORD
- Web UI: /system/admins page (add/edit role/toggle/reset pwd/delete)
  + change-my-password; sidebar entry; permission-guarded routes
- REST API: /api/admins CRUD with protection checks
- Protections: cannot delete/disable self; keep >=1 enabled superadmin;
  disabled accounts fail permission checks immediately
- README: document roles, permission bits, API
This commit is contained in:
Your Name
2026-09-09 14:33:59 +08:00
parent 3232159d29
commit 9890cfc488
8 changed files with 719 additions and 51 deletions
+32 -1
View File
@@ -39,7 +39,9 @@
| 详细审计日志 | 按事件/用户/IP 筛选,分页查询 |
| 级联代理 | 连接建立时自动代理至目标(可扩展 upstream) |
| 负载均衡 | 多实例配置后按端口轮询 |
| 管理员认证 | 环境变量 `SM_ADMIN_PASSWORD` 保护 |
| 管理员认证 | 多管理员账户存数据库(`AdminUser` 表,bcrypt 哈希),支持角色权限 |
| 角色权限 | superadmin / admin / viewer 三级角色,细粒度权限位控制 |
| 管理员管理 | Web/API 增删改、启停、改角色、重置密码(带保护校验) |
| 防爆破 | 自动阻断频繁登录尝试(Fail2Ban 机制) |
| 密码安全 | bcrypt 哈希存储 SOCKS5 用户密码(兼容旧明文自动迁移) |
| 会话管理 | 自定义 Cookie 域名/安全/名称,支持 HTTPS 部署 |
@@ -66,6 +68,35 @@ python3 run.py
> ⚠️ 首次启动时如果 `SM_ADMIN_PASSWORD` 未设置,会自动写入默认密码 `admin123` 到 `.env` 文件。**生产环境请务必修改此密码。**
## 系统账户管理
Web 后台管理员账户存储在数据库(`admin_users` 表),支持多账户与角色权限,通过 **系统管理 → 管理员账户** 管理(也可用 REST API `/api/admins`)。
### 三级角色
| 角色 | 权限 |
|------|------|
| **superadmin** 超级管理员 | 全部权限,含管理员账户管理(增删改/启停/改角色/重置密码) |
| **admin** 管理员 | 用户/实例/系统管理,可查看管理员账户但不能修改 |
| **viewer** 只读用户 | 仅查看仪表盘/实例/用户/日志,无任何写操作 |
### 角色权限位
每个角色对应一组权限位(`users:read``users:write``instances:read``instances:write``system:read``system:write``admins:read``admins:write``logs:read``stats:read`),可在 `models.py``ROLE_PERMISSIONS` 中扩展。
### 安全保护
- **不能删除/禁用当前登录账户**
- **至少保留一个启用的超级管理员**(删除最后一位 superadmin 会被拒绝)
- 登录密码 bcrypt 哈希存储
- 账户禁用后立即失效(权限校验实时检查)
### REST API
```
GET /api/admins # 列出管理员
POST /api/admins # 创建 {username, password, role}
PUT /api/admins/<id> # 更新 {role?, password?, enabled?}
DELETE /api/admins/<id> # 删除(带保护校验)
```
## 环境变量
| 变量 | 默认值 | 说明 |