ADR-001-authentication.md 1.9 KB

ADR-001:统一认证与三级权限

  • 状态:Accepted
  • 日期:2026-07-16

背景

当前认证兼容旧 users 表和测试管理员,密码字段存在可逆编码,路由权限边界不完整。产品确认暂不开放自助注册,由管理员创建用户,并建立管理员、编辑者、查看者三级权限。

决策

  1. 采用服务端用户表、不可逆密码哈希(优先 Argon2id)和短时 JWT Access Token;为后续刷新令牌保留会话表扩展点。
  2. 角色固定为 admineditorviewer:管理员管理用户和系统配置;编辑者维护治理对象与流程;查看者只读检索、问答和授权数据产品。
  3. 不提供公开注册路由。POST /api/system/users 仅管理员可调用。
  4. 初始化第一个管理员由一次性 CLI/启动命令完成;若系统已有管理员则拒绝再次初始化。
  5. 默认拒绝:新路由若未声明权限则测试失败。资源级访问范围在知识库检索前过滤,而不是回答后脱敏。
  6. 审计记录登录失败、用户创建/禁用、角色变更和高权限操作,不记录密码、Token 或模型密钥。

接口边界

  • POST /api/system/auth/login
  • GET /api/system/auth/me
  • POST /api/system/users(管理员)
  • GET /api/system/users(管理员)
  • PUT /api/system/users/{id}(管理员)
  • PUT /api/system/users/{id}/roles(管理员)
  • POST /api/system/bootstrap-admin 不作为 HTTP 公网接口;使用 CLI。

迁移

旧本地验收账号只用于本轮 Docker 冒烟。正式迁移新增 password_hash 后,由管理员重置真实用户密码,不迁移可逆密码值。迁移完成后删除旧 passwordis_admin 语义,但生产删列需单独备份和审批。

结果

认证代码集中到 app/core/system/,路由通过统一装饰器表达角色;前端路由和按钮权限只改善体验,后端权限检查才是安全边界。