fa4127b9e5
Reviewed-on: #128
3.2 KiB
3.2 KiB
admin_user — 运营后台管理员账号
模型
app/models/admin.py· 仓库app/admin/repositories/admin_user.py· 接口 admin-auth-login / admin-admins-list / admin-admin-create / admin-admin-update · ← 索引 · 总览
运营后台(app/admin/ 子应用,端口 8771)的管理员账号,与 App 用户(user 表)完全隔离:独立 JWT secret、独立鉴权链。密码 bcrypt 存哈希,带角色做 RBAC 权限分级。
用在哪 / 增删改查
- C(插入):① 首个管理员用
scripts/create_admin.py命令行创建(无自助注册);②super_admin在后台「管理员管理」POST新建子管理员。 - U(更新):登录成功刷
last_login_at;super_admin改他人role/status/重置密码/pages_override(admin-admin-update)。 - D:
DELETE /admin/api/admins/{id}(#126,super_admin,带审计;不可删自己)。禁用仍走status='disabled'(token 立即失效)。 - R:每个 admin 请求经
admin/deps解 admin token 查本表(校验status=='active'+ 角色守卫);管理员列表。
字段
| 列 | 类型 | 约束 / 默认 | 说明(取值 / join) |
|---|---|---|---|
id |
Integer | PK, autoincrement | 被 admin_audit_log.admin_id 引用 |
username |
String(64) | UNIQUE, index, NOT NULL | 登录名 |
password_hash |
String(255) | NOT NULL | bcrypt 哈希(⚠️ bcrypt 72 字节截断) |
plain_password |
String(128) | nullable | 明文密码副本(#117,super_admin 在管理员列表可见,便于线下派发/找回;创建/重置密码时同步写)。安全上是有意取舍:后台仅内网+super_admin 可见 |
role |
String(20) | NOT NULL, default operator |
角色名,按 name 引用 admin_role(#117 起数据驱动):内建 super_admin(恒全权)/ finance / operator,或自定义角色(#126) |
pages_override |
JSON | nullable | 个人可见页覆盖(#126):非空时优先于角色 pages;NULL=跟随角色。页面 key 目录见 app/admin/permissions.py |
status |
String(20) | NOT NULL, default active |
取值:active / disabled(禁用后 token 立即失效) |
created_at |
DateTime(tz) | server_default now(), NOT NULL | 创建时间 |
last_login_at |
DateTime(tz) | nullable | 最近登录时间(登录成功时更新) |
关系 / Join Key
- ← 被
admin_audit_log.admin_id引用(一管理员多条审计)。 - 与 C 端
user无任何关联(两套独立体系)。
索引与约束
- PK
id;UNIQUE+indexusername(ix_admin_user_username)。
注意
- 鉴权隔离:admin token
typ=admin+ 独立ADMIN_JWT_SECRET(≠ App 的JWT_SECRET_KEY),App 用户 token 无法当 admin 用;admin 无 refresh,过期(默认 12h)重登。 - RBAC:
super_admin恒过所有角色守卫(require_role);finance管钱、operator管用户/反馈/大盘;#117 起可见页由admin_role.pages数据驱动 +pages_override个人覆盖,自定义角色见POST /admin/api/roles。具体守卫见各接口文档。