Sync: add identity and trust notes

This commit is contained in:
2026-04-25 07:45:03 +08:00
parent fdb657965e
commit aa980f8da2
26 changed files with 2087 additions and 192 deletions

View File

@@ -2,8 +2,8 @@
**状态**: Draft
**作者**: 产品经理
**最后更新**: 2026-04-24v1.3 明确账号创建权限层级Tenant Admin 可自定义用户名/密码;普通员工账号由 Tenant Admin 在新增员工时创建,用户名为手机号,初始密码固定,首次登录强制修改
**版本**: 1.3
**最后更新**: 2026-04-25v1.4 §5.5 后端数据模型迁移至独立文档 `DATA_MODEL/DATA_MODEL_LOGIN.md`
**版本**: 1.4
**所属系统**: Fonrey 房产经纪管理系统
**关联模块**: 组织人事管理、权限管理、系统管理
@@ -515,61 +515,19 @@ Response 200 (失败):
### 5.5 后端数据模型设计
#### 5.5.1 `auth` App 目录结构
> **数据模型已迁移至独立文档**,请参阅:
> **`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md`**
在现有 `fonrey/apps/` 目录下新增(或扩展 Django `auth` 系统)
```
apps/
└── accounts/ # 账号认证管理(租户级 App
├── models.py # UserAccount, LoginAttempt, PasswordResetToken
├── views.py # 登录/登出/找回账号/找回密码视图
├── urls.py
├── serializers.py # API 序列化(如需 JSON 接口)
└── services/
├── auth.py # 认证逻辑(验证码校验、账号锁定判断)
├── recovery.py # 找回密码/用户名逻辑
└── tenant.py # Tenant 验证逻辑(属于 shared_apps
```
#### 5.5.2 `UserAccount` 核心字段
| 字段 | 类型 | 说明 |
|------|------|------|
| `id` | BigAutoField | 主键 |
| `username` | CharField(30) | 登录名同租户唯一不可变更普通员工账号固定为手机号11位数字Tenant Admin 为自定义字符串 |
| `password` | CharField | PBKDF2+SHA256 哈希,使用 Django `make_password` |
| `email` | EmailField | 绑定邮箱,同租户唯一,选填;为空时无法自助找回密码 |
| `phone` | CharField(11) | 绑定手机号,加密存储(`core.encryption`);普通员工必填(同时作为 username 来源Tenant Admin 选填 |
| `staff` | OneToOneField → `org.Staff` | 员工档案绑定普通员工必须Tenant Admin 可为空 |
| `is_tenant_admin` | BooleanField | 标记是否为该租户的 Tenant Admin 账号,默认 False |
| `status` | CharField | `active` / `disabled` / `locked` |
| `is_initial_password` | BooleanField | True 时登录成功后强制跳转修改密码页,不可跳过 |
| `last_login` | DateTimeField | 最后登录时间 |
| `created_at` | DateTimeField | 账号创建时间 |
| `created_by` | ForeignKey → self | 创建人(普通员工由 Tenant Admin 创建Tenant Admin 由平台运营创建) |
#### 5.5.3 `LoginAttempt` 登录尝试记录
| 字段 | 类型 | 说明 |
|------|------|------|
| `username` | CharField | 尝试登录的用户名 |
| `ip_address` | GenericIPAddressField | 来源 IP |
| `success` | BooleanField | 是否成功 |
| `failure_reason` | CharField | `wrong_password` / `wrong_captcha` / `account_locked` 等 |
| `attempted_at` | DateTimeField | 尝试时间 |
> **注意**`LoginAttempt` 属于合规审计数据,保留周期建议 ≥ 90 天。
#### 5.5.4 `PasswordResetToken`
| 字段 | 类型 | 说明 |
|------|------|------|
| `user` | ForeignKey → `UserAccount` | 关联账号 |
| `token` | CharField(64) | 加密 Token`secrets.token_urlsafe(32)` |
| `expires_at` | DateTimeField | 过期时间(创建时间 + 30 分钟) |
| `is_used` | BooleanField | 是否已使用(使用后立即标记为 True |
| `created_at` | DateTimeField | 创建时间 |
该文档包含
- `user_accounts` 账号主表完整字段定义、约束、索引、Django Model 代码)
- `login_attempts` 登录审计表
- `password_reset_tokens` 密码重置令牌表
- `password_histories` 历史密码记录表
- Redis 缓存结构说明
- 账号状态机与创建流程
-`org.Staff` 的关联规则及跨 App 依赖设计
- Django Migrations 迁移顺序说明
- 架构决策说明ADR
---
@@ -686,3 +644,5 @@ apps/
- 权限管理模块 PRD`Project/fonrey/PRD/权限管理/权限管理模块PRD.md`
- 系统管理模块 PRD`Project/fonrey/PRD/系统管理/系统管理模块PRD.md`
- 技术栈文档:`Project/fonrey/TECH_STACK/TECH_STACK.md`
- **登录管理数据模型**`Project/fonrey/DATA_MODEL/DATA_MODEL_LOGIN.md`
- **登录管理技术方案**`Project/fonrey/TECH_STACK/登录管理技术方案.md`