Files
ReporterStationManagementSy…/pmdocs/adr/2026-08-01-002-认证方案.md
T
2026-08-01 23:09:49 +08:00

56 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-RSMS-002:认证方案
> ADR 编号:ADR-002
> 状态:已决策(角色模拟)
> 日期:2026-08-01
> 项目:RSMS
## 背景
系统需要识别用户身份并实施数据权限隔离。在 MVP 阶段无需接入真实身份认证体系,但需设计一个可升级的认证架构。
## 选项
| 选项 | 描述 | 适用阶段 |
|---|---|---|
| A. 角色模拟(header 传参) | 前端切换角色,HTTP header `x-user-role` 传递值,后端按值查询数据 | MVP / 演示 |
| B. Session + Cookie | 后端维护 session,基于用户名密码登录 | 首版上线 |
| C. JWT Token | 无状态令牌,携带用户 ID 和角色,可扩展 | 生产环境 |
| D. 微信 OAuth2 | 微信账号登录,与人员档案绑定 | 移动端小程序 |
## 决策
**MVP(当前)**:选项 A — 角色模拟(header 传参)
**二期目标**:选项 C — JWT Token + 真实登录
**三期目标**:选项 D — 微信 OAuth2(若实现小程序端)
## 选项 A 的实施
```
前端 role-switcher<select>
x-user-role: headquarters | station | reporter
后端中间件读取 header → 注入 req.user 对象
数据访问层按 req.user.role + req.user.station + req.user.name 过滤
```
- **优点**:零门槛,无需注册账号;方便演示和开发测试
- **缺点**:安全性极低,header 可被任意伪造;仅适合内部演示环境
## 升级至 JWT 的迁移路径
1. 新增 `/api/auth/login` 接口,接收用户名密码,返回 JWT
2. 新增 JWT 中间件,验证令牌并注入 `req.user`
3. 保留 header `x-user-role` 作为兼容层(降级方案)
4. 前端将 token 存储于 `localStorage``httpOnly` Cookie
5. 移除前端 role-switcher,替换为登录页
## 风险
- **选项 A 当前风险**:任何人可以通过修改 header 访问任意角色数据
- **缓解**:当前环境为本地开发/内网,不暴露于公网;上线前必须完成 JWT 改造
- **硬编码人员**`server/index.js` 中的 `identities` 对象需改为从数据库读取真实用户表