feat: 账号认证、用户管理与 API Token 管理
build-and-deploy / build-and-deploy (push) Successful in 21s

- 后端: Auth(登录/登出/me + session 中间件)、Users、Tokens 路由与 Service,
  scrypt 哈希+timingSafeEqual 校验、requireAdmin 保护、admin 用户自动初始化
- 前端: login.html(登录页, 无账号密码提示)、admin.html(用户+Token 管理,
  令牌明文显隐/复制/吊销/重置密码)、标题栏用户信息+系统管理入口
- 持久化: jsonAdapter 支持 users/api-tokens,运行时数据忽略入库
- 文档: 需求.md/原型设计.md 同步
This commit is contained in:
jif2.zhang
2026-09-11 17:12:37 +08:00
parent 963046edd9
commit 1765caba50
16 changed files with 2132 additions and 141 deletions
+126
View File
@@ -0,0 +1,126 @@
# 页面实现文档:登录 / 项目列表 / 系统管理
## 1. 页面流程
```mermaid
flowchart TD
A[登录页 login.html] -->|登录成功| B[项目列表页 projects.html]
B -->|点击项目卡片| D[配置管理页 index.html]
B -->|管理员点击「系统管理」| C[系统管理 admin.html]
C -->|返回项目列表| B
A -.->|未登录访问任意页面| B
B -.->|token 过期 API 返回 401| A
```
## 2. 认证机制
- 登录成功返回 `{ token, user }`,前端存入 `localStorage`。
- 所有 API 请求自动携带 `Authorization: Bearer <token>` 头。
- 服务端使用内存 session(`src/routes/auth.js`),TTL 24 小时。
- API 返回 401 时前端自动清理凭证并跳转登录页。
- **首次启动自动创建默认管理员**:`admin / admin123`(密码经 scrypt 加盐哈希,存于 `data/users.json`)。
| 角色 | 项目列表 | 进入配置 | 系统管理 |
|------|---------|---------|---------|
| 管理员 (admin) | ✓ | ✓ | ✓ |
| 普通用户 (user) | ✓ | ✓ | ✗(入口隐藏 + 后端 403) |
## 3. 页面清单(public/ 目录)
| 文件 | 说明 |
|------|------|
| `public/login.html` | 登录页,居中卡片,深蓝渐变背景 |
| `public/projects.html` | 项目列表页,卡片网格 + 搜索 + 新建/删除项目 |
| `public/admin.html` | 系统管理页,用户管理 + Token 管理两个 Tab |
| `public/index.html` | 配置管理页(原有),标题栏增加用户信息/系统管理/退出入口 |
## 4. 新增 API
### 4.1 认证
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | `/api/auth/login` | 登录,Body: `{ username, password }`,返回 `{ token, user }` |
| POST | `/api/auth/logout` | 注销,销毁 session |
| GET | `/api/auth/me` | 获取当前登录用户 |
### 4.2 用户管理(需管理员)
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/users` | 用户列表(不含密码字段) |
| POST | `/api/users` | 新增用户 `{ username, displayName, password, role, enabled }` |
| PUT | `/api/users/:id` | 编辑 `{ displayName, role, enabled }` |
| PUT | `/api/users/:id/password` | 重置密码 `{ password }` |
| DELETE | `/api/users/:id` | 删除用户 |
### 4.3 Token 管理(需管理员)
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/tokens` | Token 列表 |
| POST | `/api/tokens` | 生成 `{ name, projectId, permission, expiresInDays }`,返回含明文 value |
| PUT | `/api/tokens/:id` | 编辑 `{ name, projectId, permission, enabled }` |
| PUT | `/api/tokens/:id/revoke` | 吊销 |
| DELETE | `/api/tokens/:id` | 删除 |
## 5. 数据模型
`data/` 目录扩展:
```
data/
├── users.json # 用户表(password 为 salt:hash)
└── api-tokens.json # API Token 表(reg_ 前缀,MCP token 仍由 mcp.json 管理)
```
### 用户 (User)
```json
{
"id": "a1b2c3d4",
"username": "admin",
"displayName": "系统管理员",
"password": "salt:scrypt-hash",
"role": "admin",
"enabled": true,
"createdAt": "2026-09-11T08:00:00.000Z",
"updatedAt": "2026-09-11T08:00:00.000Z",
"lastLoginAt": "2026-09-11T09:00:00.000Z"
}
```
### API Token
```json
{
"id": "x1y2z3a4",
"name": "CI 自动发布",
"projectId": "proj-001",
"permission": "readwrite",
"value": "reg_<hex>",
"enabled": true,
"createdAt": "2026-09-11T08:00:00.000Z",
"expiresAt": "2026-12-10T08:00:00.000Z"
}
```
## 6. 目录结构变更
```
src/
├── server.js # 挂载 auth/users/tokens 路由 + 全局认证中间件
├── routes/
│ ├── auth.js # 登录/登出/me + session 管理
│ ├── users.js # 用户管理(管理员)
│ └── tokens.js # Token 管理(管理员)
└── services/
├── userService.js # 用户业务逻辑 + scrypt 密码哈希
└── tokenService.js # Token 业务逻辑
public/
├── login.html # 登录页
├── projects.html # 项目列表页
├── admin.html # 系统管理页
└── js/api.js # 新增 auth/user/token 接口封装
```
+1 -1
View File
@@ -60,7 +60,7 @@
## 3. 非功能需求
- **NFR-1**:技术栈:Node.js + Express 后端,原生 HTML/CSS/JS 前端
- **NFR-2**:后续对接 SSO 单点登录,当前版本暂不实现认证
- **NFR-2**:提供登录认证(用户名/密码 + Bearer session token);用户分为管理员(含系统管理权限)与普通用户;后续可对接 SSO 单点登录
- **NFR-3**:界面响应式,支持主流浏览器
- **NFR-4**:配置数据实时写入持久化存储,保证数据一致性