feat: implement authentication and backend role permissions #7

Merged
saint merged 1 commits from kronecker/feat/backend-auth-sessions AGit into dev 2026-10-16 13:10:31 +08:00
Collaborator

当前后端没有认证路由或角色授权,前端的真实认证调用只能收到 404;匿名客户端也能读写管理资源。本改动实现 Issue #5 的七个接口,并以服务端 Cookie 会话和角色检查保护管理资源。

关联与依赖

  • Refs #5;七个接口的字段、响应、权限、CSRF 与迁移交接见 docs/AUTH_API.md 和 OpenAPI。
  • 目标 dev,功能分支 feat/backend-auth-sessions。
  • 本分支叠加待审 PR #6 的提交 8ac9dca(关键词检索),新增认证提交 f9827fe。用户已授权无需等待合并继续开发;没有自行批准或合并 PR #6。
  • 迁移顺序 0002_catalog → 0003_retrieval_runs → 0004_auth_sessions;若 #6 先合入,本 PR 差异会收敛到认证提交。请审阅时核对该依赖。

行为与边界

  • 注册/登录/退出、当前会话、本人资料修改、改密、管理员用户列表全部注册到 /api。
  • 注册拒绝角色及未知字段,仅创建 user;管理员由本机 python -m app.manage create-admin --username local_admin 命令隐藏输入密码创建,不预置账号、不接受密码命令行参数。
  • Argon2id(19 MiB、2 次迭代、并行度 1)保存密码;256 位随机 Cookie 会话在库内只存 SHA-256 摘要,角色每次读取数据库。
  • Cookie 默认 HttpOnly/Secure/SameSite=Lax。注册和登录校验明确 Origin;已认证写操作另须当前会话 X-CSRF-Token。登录轮换,退出撤销当前会话,改密撤销全部会话;会话与认证预算均跨重启持久化。
  • 知识、来源、文档及其历史、检索历史、用户列表要求 admin。匿名管理调用现在返回 401,普通用户返回 403。公开已核验关键词检索、健康检查与占位问答保持公开。
  • PostgreSQL 原子认证预算:每客户端 30 次/5 分钟,登录每用户名另限 10 次/5 分钟;参数错误不回显输入密码,API 响应 no-store。
  • 前端 API 调用层同步 Cookie/内存 CSRF 封装及类型;未修改页面和路由。

实际验证

  • backend:ruff check .、ruff format --check . 通过。
  • pytest -q:70 passed,使用隔离 PostgreSQL 16 + pgvector;覆盖哈希、越权字段、所有管理路由匿名/普通用户拒绝、CSRF/Origin、轮换/过期/撤销、改密、角色即时生效、共享预算、迁移兼容及既有知识/检索回归。
  • 默认生命周期真实 HTTP:重启后会话恢复,退出后再重启仍拒绝旧 Cookie,原知识与检索持久化回归通过。
  • frontend npm run build:通过。新增内容隐私检查通过,提交作者和提交者均使用项目通用身份。

升级、回滚与待联调

  • 先安装 requirements.txt 更新依赖,备份后 alembic upgrade head,再启动;当前后端要求 0004_auth_sessions。
  • 默认会话要求 HTTPS。本机 HTTP 才可在不入库的 .env 显式设置 AUTH_COOKIE_SECURE=false,且仅 development/test 允许;其他环境要求 Secure 和 HTTPS Origin。
  • 备份后可配合旧后端 alembic downgrade 0003_retrieval_runs 删除认证表,保留知识/检索记录;账号和会话恢复依赖备份,旧后端不应用于公开部署。
  • 当前主机 Docker 未运行;容器、前端登录/角色页面及浏览器真实流程尚未验收。远程 main 注册原型的最低密码提示需改为 15 字符,并接入新 Cookie/CSRF 客户端。
  • 邮箱验证、找回密码、MFA、角色管理 API、访问审计、完整生产部署及后续 chunks/Embedding/RAG 均未在本 PR 声称完成。
当前后端没有认证路由或角色授权,前端的真实认证调用只能收到 404;匿名客户端也能读写管理资源。本改动实现 Issue #5 的七个接口,并以服务端 Cookie 会话和角色检查保护管理资源。 ## 关联与依赖 - Refs #5;七个接口的字段、响应、权限、CSRF 与迁移交接见 docs/AUTH_API.md 和 OpenAPI。 - 目标 dev,功能分支 feat/backend-auth-sessions。 - 本分支叠加待审 PR #6 的提交 8ac9dca(关键词检索),新增认证提交 f9827fe。用户已授权无需等待合并继续开发;没有自行批准或合并 PR #6。 - 迁移顺序 0002_catalog → 0003_retrieval_runs → 0004_auth_sessions;若 #6 先合入,本 PR 差异会收敛到认证提交。请审阅时核对该依赖。 ## 行为与边界 - 注册/登录/退出、当前会话、本人资料修改、改密、管理员用户列表全部注册到 /api。 - 注册拒绝角色及未知字段,仅创建 user;管理员由本机 python -m app.manage create-admin --username local_admin 命令隐藏输入密码创建,不预置账号、不接受密码命令行参数。 - Argon2id(19 MiB、2 次迭代、并行度 1)保存密码;256 位随机 Cookie 会话在库内只存 SHA-256 摘要,角色每次读取数据库。 - Cookie 默认 HttpOnly/Secure/SameSite=Lax。注册和登录校验明确 Origin;已认证写操作另须当前会话 X-CSRF-Token。登录轮换,退出撤销当前会话,改密撤销全部会话;会话与认证预算均跨重启持久化。 - 知识、来源、文档及其历史、检索历史、用户列表要求 admin。匿名管理调用现在返回 401,普通用户返回 403。公开已核验关键词检索、健康检查与占位问答保持公开。 - PostgreSQL 原子认证预算:每客户端 30 次/5 分钟,登录每用户名另限 10 次/5 分钟;参数错误不回显输入密码,API 响应 no-store。 - 前端 API 调用层同步 Cookie/内存 CSRF 封装及类型;未修改页面和路由。 ## 实际验证 - backend:ruff check .、ruff format --check . 通过。 - pytest -q:70 passed,使用隔离 PostgreSQL 16 + pgvector;覆盖哈希、越权字段、所有管理路由匿名/普通用户拒绝、CSRF/Origin、轮换/过期/撤销、改密、角色即时生效、共享预算、迁移兼容及既有知识/检索回归。 - 默认生命周期真实 HTTP:重启后会话恢复,退出后再重启仍拒绝旧 Cookie,原知识与检索持久化回归通过。 - frontend npm run build:通过。新增内容隐私检查通过,提交作者和提交者均使用项目通用身份。 ## 升级、回滚与待联调 - 先安装 requirements.txt 更新依赖,备份后 alembic upgrade head,再启动;当前后端要求 0004_auth_sessions。 - 默认会话要求 HTTPS。本机 HTTP 才可在不入库的 .env 显式设置 AUTH_COOKIE_SECURE=false,且仅 development/test 允许;其他环境要求 Secure 和 HTTPS Origin。 - 备份后可配合旧后端 alembic downgrade 0003_retrieval_runs 删除认证表,保留知识/检索记录;账号和会话恢复依赖备份,旧后端不应用于公开部署。 - 当前主机 Docker 未运行;容器、前端登录/角色页面及浏览器真实流程尚未验收。远程 main 注册原型的最低密码提示需改为 15 字符,并接入新 Cookie/CSRF 客户端。 - 邮箱验证、找回密码、MFA、角色管理 API、访问审计、完整生产部署及后续 chunks/Embedding/RAG 均未在本 PR 声称完成。
Kronecker added 2 commits 2026-10-16 07:52:28 +08:00
saint merged commit d110c8a975 into dev 2026-10-16 13:10:31 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: saint/border-red-post-nalati#7