File size: 6,522 Bytes
00a912e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | # 本轮功能更新说明
本文记录从 `Music-Together-Pro-UNM-Support` 分支移植并在当前项目中完成适配的功能,涵盖用户数据持久化、多音源、账号系统、服务器管理员、权限安全和审计日志。
## 1. 用户数据持久化
- 新增 SQLite 数据库,默认地址为 `file:./data/music-together.db`,可通过 `DATABASE_URL` 修改。
- 用户账号资料、密码 Hash、角色和平台登录 Cookie 均可在服务器重启后恢复。
- 用户再次访问时可通过身份 Cookie 恢复账号及对应的房间身份。
- 平台 Cookie 加密后再持久化,避免以明文形式保存第三方平台凭据。
- 用户 ID 使用不区分大小写的唯一性约束,不能注册或修改为已存在的 ID。
> 当前房间和播放状态仍保存在内存中。服务器重启后,账号数据会保留,但正在运行的房间会消失。
## 2. 更广的音源与音质支持
- 扩展网易云音乐相关能力,并接入 QQ 音乐、酷狗音乐等音源。
- 增加多平台搜索、歌曲信息解析、播放地址获取和歌单解析能力。
- 支持按平台选择更多音质,包括标准、高品质、无损及平台提供的更高规格音质。
- 客户端会根据音源展示可用音质,服务端负责对应音源和音质的解析与回退。
第三方平台接口和高音质播放能力仍受账号权限、Cookie 有效期、地区限制及平台接口可用性影响。
## 3. 账号功能
- 账号现在包含:账号 ID、昵称、密码、头像和角色。
- 用户可修改自己的昵称、头像、密码和账号 ID。
- 修改密码时需要验证当前密码,验证失败返回 `401`。
- 修改账号 ID 时会检查格式、重复 ID、系统保留 ID和管理员配置 ID;冲突返回 `409`,非法或不可占用的 ID 返回 `400`。
- 普通用户只能修改自己的账号资料,不能指定其他用户作为修改目标,也不能自行提升为服务器管理员。
- 未登录或身份失效时,会按接口要求返回 `401`、`403` 或 `409`,不会绕过账号归属检查。
## 4. 延迟创建正式账号
账号生成逻辑已调整为“设置昵称后才创建正式账号”:
1. 用户首次访问时只签发临时身份 Cookie。
2. 此时不会向 `users` 表写入账号,也不会在客户端保存或展示正式用户 ID。
3. 用户保存昵称,或使用需要正式身份的创建/加入房间流程后,服务器才生成唯一账号 ID并创建账号。
4. 正式账号创建后,账号 ID、头像和密码设置等控件才会开放。
未设置昵称时:
- `GET /api/auth/me` 返回 `204 No Content`。
- 密码和头像设置接口返回 `409 Conflict`。
- 设置页显示“保存昵称后生成账号 ID”,不会暴露临时身份值。
## 5. 修改账号 ID时的数据迁移
账号 ID 修改不是简单地改一个字段。服务端会同步迁移与旧 ID 关联的数据和运行时身份,包括:
- 用户资料、密码 Hash 和账号角色。
- 已保存的平台 Cookie。
- 房主、主持人和房间管理员身份。
- WebSocket 用户映射与重连票据。
迁移完成后,原账号 ID 不再代表该用户;新的身份 Cookie 和运行时映射会继续指向同一账号。
## 6. 服务器管理员
- 新增服务器管理员角色和管理界面。
- 可通过 `SERVER_ADMIN_IDS` 配置初始服务器管理员账号 ID,多个 ID使用英文逗号分隔。
- 服务器管理员可查看用户和房间列表、重置用户密码、删除用户以及解散房间。
- 配置中的管理员 ID和系统保留 ID不能被普通用户抢占。
### 权限分层
服务器管理员和房间管理员是两套独立身份:
- **服务器管理员**负责服务器级用户与房间治理。
- **房主、主持人、房间管理员**负责当前房间内的管理操作。
- 服务器管理员身份不会覆盖或清除房间角色,房间角色也不会自动获得服务器管理权限。
- 所有敏感操作都在服务端重新校验身份和目标对象,不能仅靠修改客户端请求获得权限。
## 7. 管理员审计日志
管理员操作已按项目原有日志格式增加结构化审计记录,包含操作者、目标对象、操作结果及必要上下文。
新增的主要审计事件包括:
- `admin.access_denied`
- `admin.users_viewed`
- `admin.rooms_viewed`
- `admin.user_deleted`
- `admin.user_delete_failed`
- `admin.user_delete_rejected`
- `admin.user_password_reset`
- `admin.user_password_reset_failed`
- `admin.user_password_reset_rejected`
- `admin.room_dissolved`
- `admin.room_dissolve_failed`
房间管理日志同时增加 `operatorIsServerAdmin` 字段,用于区分操作来自房间权限还是服务器管理员权限。
## 8. 安全加固
- 账号资料修改以服务端认证身份为准,不接受客户端伪造的目标用户 ID。
- 普通用户不能读取或修改其他用户的敏感账号信息。
- 普通用户不能调用服务器管理员接口,越权访问返回 `403 Forbidden`。
- 账号 ID修改采用唯一性校验和事务迁移,防止重复 ID及只迁移部分数据。
- 密码只保存 Hash,不保存明文。
- 平台 Cookie 加密持久化,并绑定到账号身份。
- 删除用户、重置密码、解散房间等高风险管理员操作均记录成功、拒绝或失败结果。
## 9. 配置项
本轮涉及的主要环境变量如下:
```dotenv
# SQLite 数据库地址
DATABASE_URL=file:./data/music-together.db
# 服务器管理员账号 ID,多个值使用英文逗号分隔
SERVER_ADMIN_IDS=account-id-1,account-id-2
# 是否只通过 HTTPS发送身份 Cookie
IDENTITY_COOKIE_SECURE=false
```
部署时应使用持久化磁盘保存数据库文件,并在 HTTPS生产环境中启用安全 Cookie 配置。
## 10. 验证结果
本轮修改已完成以下验证:
- 项目完整构建通过。
- Prettier 格式检查通过。
- Git 差异空白检查通过。
- 普通用户跨账号修改注入测试通过。
- 普通用户访问管理员接口返回 `403`。
- 重复账号 ID返回 `409`。
- 管理员配置 ID抢占返回 `400`。
- 错误当前密码返回 `401`。
- 修改账号 ID后,房主身份和平台 Cookie 能正确迁移。
- 管理员操作会实际输出结构化审计日志。
- 首次访问不会创建数据库用户;保存昵称后才生成正式账号。
- 保存昵称前后账号设置界面状态正确,移动端页面无水平溢出,浏览器控制台无错误。
|