业务故事站
P1 AIP

管理后台

用户、角色、权限、设置、审计——AIP 的治理面。前端路径 /admin/*,后端接口全部要求 admin 角色,每次写操作都留审计。看完这 3 个故事,你就能独立完成建号、配权限、追查审计的完整流程。

IT 管理员 安全审计员 用户管理 角色 权限点 审计日志 共 3 个故事

能 / 不能速览

✅ 这个主题能做
  • 用户管理:创建 / 查询 / 更新 / 删除用户,重置密码、锁定 / 解锁
  • 角色管理:创建 / 重命名 / 删除角色,给用户分配 / 移除角色
  • 权限点绑定:给角色整体设置 table / column / row 三类权限
  • 权限清单查询(/api/v1/permissions)
  • 系统设置 CRUD(/api/v1/settings,key / value / type / description)
  • 审计日志查询(/api/v1/audit/logs,支持按用户 / 事件类型 / 时间过滤与分页)
  • /api/v1/me 查看当前用户信息、角色与 is_admin
⛔ 这个主题做不了
  • 不能删除自己(cannot delete yourself)
  • admin 不能移除自己的 admin 角色(服务层自护)
  • 非 admin 访问全部 admin 接口返回 403(无 token 401)
  • locked 字段必填、密码至少 6 位,缺字段直接 400
  • v0.1 权限点是"配置记录",行 / 列级强制执行依赖深度权限配置与安全服务

适用角色

本主题面向两个角色:

  • IT 管理员(赵工):用户、角色、权限、设置的日常维护——是核心使用者。
  • 安全审计员(孙姐):用审计日志做合规排查与事件追溯。

业务分析师与普通用户只消费数据,不触碰管理后台;角色权限由管理员统一维护。

能力速览(能做什么)

用户管理

创建用户、重置密码、锁定 / 解锁、分配 / 移除角色;用户 ID 为 UUID,删除自己会被拒绝。

角色与权限点

角色 CRUD + 权限点(table / column / row)整体绑定,写入 role_permissions,改权限不动用户。

系统设置

key-value 设置项 CRUD(upsert 语义,重复 key 为更新),是 LLM 等配置的载体。

审计日志

按 user_id / event_type / 时间范围过滤 + limit / offset 分页,事件含 NLQ_QUERY、USER_CREATED、ROLE_* 等。

权限治理链路

用户 → 角色 → 权限点 →(配合深度权限配置的 RLS / CLS),治理有据可查。

扩展管理页(模块 11-17)

工作流编排(/admin/workflows)、飞书设置(/admin/feishu)、邮件设置(/admin/email)、评测管理(/admin/eval)、监控看板(/admin/monitoring)、知识库(/knowledge)、运维状态(/ops)都在登录 / admin 体系下,与用户 / 角色 / 审计同一套鉴权。

调整指南(怎么调整)

  • 最小权限:角色只开需要的表与列,普通用户不给 admin 角色。
  • 权限整体替换:PUT /roles/:id/permissions 是整体替换语义,先取当前、修改后再提交,避免误清空。
  • 账号治理:离职 / 冻结用"锁定"而非删除,保留审计关联。
  • 设置 upsert:重复 key 是更新不是新增;key 为空返回 400。
  • 审计异步:审计日志异步落库,刚发生的操作稍等片刻再查。

做得好的场景

管理后台把"管人、管权、留证"收进同一套系统,特别适合以下场景:
  • 全部写操作留审计:谁在何时改了什么角色 / 权限 / 用户,一查便知。
  • 角色与权限点解耦:改权限不动用户、不影响在线,权限变更即时生效。
  • 防呆自护:不能删自己、不能移除自己的 admin 角色,避免"删光管理员"事故。
  • 前端 /admin/* 与后端一一对应:用户管理、角色与权限、审计、设置页面路径清晰。

限制与不足

以下是明确的边界,使用前先知道:
  • 权限点是配置记录:v0.1 不在这里做行 / 列级强制过滤,强制执行依赖深度权限配置与安全服务。
  • 审计异步落库:刚发生的操作有几百毫秒延迟,急查会漏。
  • 无批量操作:没有批量建号、角色复制、权限继承。
  • 严格参数校验:用户 ID 为 UUID,非法 ID 返回 400;缺 locked / 短密码直接 400。
  • 只认 admin 角色:接口按角色判定,普通用户 403,无 token 401。

场景故事

故事 1 新同事入职,赵工 2 分钟建号并分配"分析师"角色
背景
小陈是刚入职的业务分析师。赵工是 IT 管理员,要给她建一个 AIP 账号、分配"分析师"角色,让她能登录查数但不能进管理后台。整个过程在管理后台的"用户管理"页完成,没写一行脚本。
传统做法对比
以前建账号要走 OA 审批、IT 手工建库账号 + 写权限脚本,快则半天慢则 1~3 天;现在管理后台里"创建用户 → 分配角色"两步,2 分钟搞定,即刻生效。
角色
IT 管理员(赵工)。
操作步骤
  1. 用 admin / admin1 登录,进入 /admin/users
  2. 新建用户:用户名 chen,设置一个临时密码(至少 6 位)
  3. 进入用户详情,分配"分析师"角色
  4. (可选)后续可重置密码、锁定 / 解锁账号
  5. 让小陈用新账号登录验证
系统响应
POST /api/v1/users 返回 201 + user(id 为 UUID);POST /api/v1/users/:id/roles 返回 assigned=true;GET /api/v1/users 列表出现新用户;审计日志记录 USER_CREATED 与 USER_ROLE_ASSIGNED 事件:
{
  "user": { "id": "3f2b...", "username": "chen", "roles": ["分析师"] }
}
{
  "assigned": true, "role_id": 3
}
结果洞察
小陈用新账号登录后是普通用户(is_admin=false),能正常用智能查询,但访问 /admin/* 会 403 或被前端拦下;角色分配即时生效,无需重启服务。审计日志里"谁在何时给谁分配了什么角色"一目了然。
调整建议
密码用临时密码,让用户首次登录后自行修改;离职 / 冻结用"锁定"而非删除,保留审计关联;默认管理员账号可用环境变量 DEFAULT_ADMIN_USERNAME / DEFAULT_ADMIN_PASSWORD 定制。
动手试一试
登录:admin / admin1。页面路径:/admin/users。输入内容:新建用户(如 u_test / Test@1234),再分配"分析师"角色。预期结果:创建 201、分配 assigned=true;退出用新账号登录,验证无法进入 /admin/*。
限制提示
不能删除自己;admin 不能移除自己的 admin 角色;重复分配同一角色返回 409;密码少于 6 位返回 400;用户 ID 为 UUID,非法 ID 返回 400。
故事 2 配置角色权限点:分析师只能查 orders、看不到客户邮箱
背景
销售明细比较敏感。赵工要收紧权限:让"分析师"角色只能查 orders 表、不能读 customers.email 列,同时给"销售总监"角色保留更多权限。他在"角色与权限"页用权限点配置完成。
传统做法对比
以前改权限要么写 SQL grant / revoke 脚本(要排期、易出错),要么线下申请走流程 2~3 天;现在在管理后台配置,PUT 一次整体生效,还能随时在权限清单里核对。
角色
IT 管理员(赵工)。
操作步骤
  1. 进入 /admin/roles,选择"分析师"角色
  2. 打开权限配置,设置 table=[orders]
  3. 设置 column 限制(如 customers.email 列级权限)
  4. 保存(整体替换语义)
  5. GET /roles/:id/permissions 核对 is_assigned
系统响应
PUT /api/v1/roles/:id/permissions 请求体与响应:
// 请求体:table / column / row 三类权限点
{ "table": ["orders"], "column": { "customers": ["email"] } }
// 响应:权限列表(含分配状态)
[ { "permission_type": "TABLE_ACCESS", "resource_name": "orders", "is_assigned": true },
  { "permission_type": "COLUMN_ACCESS", "resource_name": "customers.email", "is_assigned": true } ]
结果洞察
权限点写入 role_permissions 表;GET /api/v1/permissions 能看到全部权限清单;审计记录 ROLE_PERMISSIONS_UPDATED。配合深度权限配置里的 RLS / CLS 策略,敏感列在查询链路会被过滤,权限治理形成闭环。
调整建议
权限是"整体替换"——先 GET 当前配置、修改后再 PUT,避免误清空;行级过滤用 row 字段(如 region='east');新增"运营"角色给独立权限集,别复用 admin。
动手试一试
登录:admin / admin1。接口:PUT /api/v1/roles/:id/permissions。输入内容:table orders + column 限制 customers.email。预期结果:GET /roles/:id/permissions 返回权限且 is_assigned=true;再提交一次空对象,观察权限被清空。
限制提示
v0.1 权限点是"配置记录",强制执行依赖深度权限配置与安全服务;空对象提交等于清空该角色全部权限;table 传非数组返回 400;非 admin 访问返回 403。
故事 3 追查数据泄露疑点——审计日志按事件与时间分钟级定位
背景
孙姐是安全审计员。有人反馈一张"含客户邮箱的销售明细"截图疑似从系统流出,时间大约在周三下午。她要查:是谁、在什么时间、查了什么数据。她用管理后台的审计日志页,按事件类型与时间范围过滤,十几分钟锁定目标。
传统做法对比
以前查"谁查过什么"要么翻数据库 slow log(看不出业务含义)、要么全凭人工回忆,一次排查 1~2 天;现在 GET /api/v1/audit/logs 支持按 user_id / event_type / 时间范围过滤与分页,分钟级定位。
角色
安全审计员(孙姐,admin 账号)。
操作步骤
  1. 进入 /admin/audit
  2. 按 event_type=NLQ_QUERY、时间范围(周三 12:00 ~ 18:00)过滤
  3. 按 user_id 聚焦某个账号
  4. 查看 action_details 里的 query / sql / rows
  5. 结合权限配置判断是否存在越权
系统响应
审计日志返回记录,event_type=NLQ_QUERY、result=SUCCESS,action_details 含完整查询与 SQL:
{
  "logs": [
    { "event_type": "NLQ_QUERY", "result": "SUCCESS", "user_id": "u-101",
      "timestamp": "2026-08-06T14:32:11+08:00",
      "action_details": "{\"query\":\"查询所有客户邮箱和订单明细\",\"intent\":\"data_query\",\"sql\":\"SELECT ... email ...\"}" }
  ]
}
结果洞察
定位到周三 14:32 某普通用户账号连续 8 次 NLQ_QUERY,查询包含"客户邮箱""全部订单含联系方式";确认该账号被授予了过宽的角色权限。整改动作:收紧该角色权限点、重置该账号密码、必要时锁定账号,并同步给业务侧预警。
调整建议
定期导出审计日志做异常检测;对敏感表设置更严权限点,从源头减少"能查";审计异步落库,排查时先等片刻再刷新;大量历史用 limit / offset 分页拉取。
动手试一试
登录:admin / admin1。页面路径:/admin/audit。操作:先在智能查询里问几个问题(会写 NLQ_QUERY 日志),再到审计页按 event_type=NLQ_QUERY 过滤。预期结果:能看到每次查询的 query 与 sql 字段(action_details)。
限制提示
审计日志异步写入,刚发生的操作可能有几百毫秒延迟;时间过滤参数要求 RFC3339 格式,写错会静默忽略;审计记录的是事件与查询摘要,不含完整返回数据。

常见问题

非 admin 能进管理后台吗?

不能。前端 /admin/* 与全部 /api/v1 管理接口都要求 admin 角色:无 token 返回 401,普通用户返回 403("admin role required")。

权限配置后马上生效吗?

角色-权限点绑定写入即生效,无需重启;但"强制执行"依赖深度权限配置里的 RLS / CLS 策略与安全服务,管理后台本体只维护权限配置记录。

审计日志为什么"慢半拍"?

审计服务是异步写入的:先返回业务结果、后台落库,刚发生的操作可能有几百毫秒到 1 秒延迟,排查时稍等再刷新即可。

能删掉 admin 角色吗?

接口层面允许(测试记录过该行为),但删掉后管理员判定会失败,所有 admin 接口将不可用,属于高危操作,请谨慎。

用户 ID 为什么是 UUID 形式?

用户主键是 UUID 字符串,路径参数校验严格:非法 UUID 返回 400,合法但不存在返回 404。这与数据源 ID(数字自增)是不同的约定。

工作流 / 评测 / 监控这些管理页也在 /admin 下吗?

是。AdminLayout 下已有 /admin/workflows(工作流编排)、/admin/feishu(飞书设置)、/admin/email(邮件设置)、/admin/eval(评测管理)、/admin/monitoring(监控看板)等,均要求 admin 角色;知识库(/knowledge)与运维状态(/ops)是登录即可访问的非 admin 页面。新增管理页都会同步注册路由与侧边栏入口。

主题小结

一句话:管理后台是 AIP 的"治理面"——用户、角色、权限、设置、审计五件套,全部写操作留痕。记住几个边界:权限点是配置记录、审计异步落库、接口仅 admin 可用、防呆自护(不能删自己)已内置。