Files
home-automation/docs/auth.md
T

2.7 KiB
Raw Permalink Blame History

基础鉴权说明

本文档说明当前 Python 重构项目里已经落地的第一版鉴权基座。

这一轮只解决:

  • 登录页
  • 登录 / 登出流程
  • server-side session
  • 一个最小受保护页面

这一轮明确不解决:

  • 完整 config persistence
  • 完整 config CRUD
  • 多用户权限系统
  • OAuth / SSO / RBAC

当前 auth 模型

  • 认证方式:username/password
  • 会话方式:server-side session
  • 客户端凭据:session cookie
  • 页面形态:Jinja server-side template

当前持久化

当前新增一个共享 App DB

  • APP_DATABASE_URL
  • 默认值:sqlite:///./data/app.db

当前 auth 相关数据存放在这个 DB 中:

  • auth_users
  • auth_sessions
  • app_config

当前没有把 auth 数据和 location / poo DB 混放。

当前这部分现在也走 Alembic 管理:

  • Alembic 环境:alembic_app.ini + alembic_app/
  • 初始化脚本:python scripts/app_db_adopt.py

当前没有 legacy app DB,所以这一版脚本只负责初始化新库,不负责 legacy adoption。

app_config 现在承接运行时配置持久化。

其中:

  • .env 负责 bootstrap / fallback
  • app_config 表负责运行时配置覆盖
  • 登录密码仍然属于认证数据,使用 Argon2 哈希,不存进 app_config

首次启动与 bootstrap

如果 auth DB 中还没有任何用户,应用启动时会要求:

  • AUTH_BOOTSTRAP_USERNAME
  • AUTH_BOOTSTRAP_PASSWORD

并创建首个 admin 用户。

当前默认 bootstrap 值就是:

  • username: admin
  • password: admin

首次登录后,系统会强制要求修改密码。

如果你希望在首次启动前就覆盖默认值,可以直接设置环境变量:

  • AUTH_BOOTSTRAP_USERNAME
  • AUTH_BOOTSTRAP_PASSWORD

建议流程是:

  1. 配好 .env
  2. 运行 python scripts/app_db_adopt.py
  3. 启动应用
  4. admin / admin 首次登录
  5. 立即修改密码

安全设计

当前这版已经落实的基础安全点:

  • 密码不明文存储,使用 Argon2 哈希
  • session cookie 为 HttpOnly
  • cookie 使用 SameSite=Lax
  • Secure cookie 在非 development 环境默认开启
  • 登录表单与登出表单都有基础 CSRF 校验
  • session token 为随机生成,服务端只持久化 token hash
  • session 有过期时间与显式失效机制

当前受保护范围

当前这轮只保护了页面入口:

  • GET /config
  • POST /config
  • POST /config/change-password
  • POST /logout

相关流程:

  • GET /login
  • POST /login

未登录访问 /config 时会被重定向到 /login

下一步不在本轮内

后续可以在这个基座上继续做:

  • 配置页面接入
  • config persistence
  • 更细的受保护路由范围
  • 用户初始化 / 密码轮换的更正式 runbook