Files
shaguabijia-app-server/docs/database/admin_user.md
T
2026-07-09 14:24:46 +08:00

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+index username(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。具体守卫见各接口文档。