Sync: add identity and trust notes
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
|
||||
**状态**: Draft
|
||||
**作者**: 产品经理
|
||||
**最后更新**: 2026-04-24(v1.3 明确账号创建权限层级:Tenant Admin 可自定义用户名/密码;普通员工账号由 Tenant Admin 在新增员工时创建,用户名为手机号,初始密码固定,首次登录强制修改)
|
||||
**版本**: 1.3
|
||||
**最后更新**: 2026-04-25(v1.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`
|
||||
|
||||
Reference in New Issue
Block a user