docs: document application security strategy
This commit is contained in:
43
README.md
43
README.md
@@ -2,7 +2,7 @@
|
||||
|
||||
题库 SaaS 后端,当前目标是从旧 PocketBase / Supabase 方案迁移到可控的 ASP.NET Core + PostgreSQL 架构。
|
||||
|
||||
这个仓库目前处在新后端初始化和数据库模型迁移阶段:Domain 实体、EF Core Fluent 配置、PostgreSQL 初始建库 migration、模型约束测试已经建立;API/Worker 的具体业务实现会在这个基础上继续推进。
|
||||
这个仓库目前处在新后端初始化和安全底座建设阶段:Domain 实体、EF Core Fluent 配置、PostgreSQL 初始建库 migration、模型约束测试已经建立;API 层已经开始接入 ASP.NET Core 认证授权、本地登录、数据库 Session 和当前租户上下文。
|
||||
|
||||
## 为什么换掉 Supabase
|
||||
|
||||
@@ -70,6 +70,28 @@ Tiku.Infrastructure/Persistence/Migrations/20260725220742_InitialSchema.cs
|
||||
|
||||
### 已落地
|
||||
|
||||
- ASP.NET Core Controller API 已接入统一认证/授权管线。
|
||||
- 本地认证不依赖 Supabase Auth:
|
||||
- 手机号 + 密码登录
|
||||
- 短信验证码登录
|
||||
- JWT access token
|
||||
- 数据库 `auth_sessions` refresh/session
|
||||
- `auth_login_events` 登录事件
|
||||
- JWT 不只验签,也会校验对应 `auth_sessions` 是否仍有效;登出或撤销 session 后,旧 access token 会被拒绝。
|
||||
- 当前请求上下文已经拆成应用层抽象:
|
||||
- `ICurrentUser`
|
||||
- `ICurrentTenant`
|
||||
- 第一批授权策略已经建立:
|
||||
- 已登录用户
|
||||
- 当前租户成员
|
||||
- 租户管理员
|
||||
- 第一批认证/租户接口已经建立:
|
||||
- `POST /api/auth/login/password`
|
||||
- `POST /api/auth/login/sms`
|
||||
- `POST /api/auth/refresh`
|
||||
- `POST /api/auth/logout`
|
||||
- `GET /api/me`
|
||||
- `GET /api/tenants/current`
|
||||
- 多租户数据表普遍包含 `TenantId`。
|
||||
- 大量租户内关系使用 composite FK,避免只靠应用代码约定租户一致性。
|
||||
- 不迁移 Supabase RLS、`app_private` schema、生产保护 policy。
|
||||
@@ -95,14 +117,21 @@ Tiku.Infrastructure/Persistence/Migrations/20260725220742_InitialSchema.cs
|
||||
- decimal precision
|
||||
- 租户关系 composite FK
|
||||
- PB raw record 可追踪主键
|
||||
- API / Auth 测试覆盖:
|
||||
- 未登录返回 401
|
||||
- 无权限返回 403
|
||||
- 密码登录成功/失败
|
||||
- 短信验证码登录成功/失败
|
||||
- 登录后访问当前用户和当前租户
|
||||
- 登出后旧 access token / refresh token 被拒绝
|
||||
|
||||
### 计划落地
|
||||
|
||||
后续 API / Worker 实现时,需要继续把下面这些策略固化成代码和测试:
|
||||
|
||||
- 统一租户上下文解析,禁止从请求 body 直接信任 `tenantId`。
|
||||
- API 层基于用户、租户成员、角色模板、权限 JSON 做授权。
|
||||
- 平台管理员、租户管理员、教师/运营、学生等权限边界明确拆分。
|
||||
- 业务 API 不直接信任请求 body 的 `tenantId`;登录阶段可选择租户,登录后业务请求以 JWT/session 中解析出的当前租户为准。
|
||||
- API 层继续基于用户、租户成员、角色模板、权限 JSON 扩展授权策略。
|
||||
- 平台管理员、租户管理员、教师/运营、学生等权限边界继续细化到业务模块。
|
||||
- Repository / Query 层默认带租户过滤,平台级查询必须显式声明。
|
||||
- 所有跨租户资源访问必须走应用服务校验,不允许 controller 直查。
|
||||
- 审计日志覆盖高风险操作:
|
||||
@@ -113,6 +142,7 @@ Tiku.Infrastructure/Persistence/Migrations/20260725220742_InitialSchema.cs
|
||||
- 租户配置、域名、品牌、支付账号变更
|
||||
- 平台账单、催收、告警处理
|
||||
- Secret 管理独立化,只在应用层通过安全服务解析 `secret_ref`。
|
||||
- 短信发送目前先完成验证码表、哈希校验和限流模型,真实供应商通过接口适配接入。
|
||||
- 后台 Worker 使用最小权限的应用服务,不直接绕过业务规则写库。
|
||||
- 对账、导入、批处理任务要求幂等键和可重跑设计。
|
||||
- 生产环境连接串、密钥、对象存储凭据不进入仓库。
|
||||
@@ -138,5 +168,6 @@ dotnet ef migrations script \
|
||||
|
||||
- 数据库模型迁移已完成到初始 schema。
|
||||
- migration 已整理为单个初始建库 migration。
|
||||
- 当前模型测试通过。
|
||||
- 下一步重点是 API / Worker 层的授权、审计、导入、核心业务流程实现。
|
||||
- API 安全底座已建立:JWT、Session、本地登录、当前用户、当前租户、基础授权策略。
|
||||
- 当前模型测试、认证服务测试、API 认证/租户闭环测试通过。
|
||||
- 下一步重点是继续把题库、内容、导入、订单等业务 API 接入这套安全轨道,而不是重新散写权限判断。
|
||||
|
||||
Reference in New Issue
Block a user