ghp / docs /UPDATE_NOTES.md
QSLY's picture
deploy: build Hugging Face Space from source
00a912e
|
Raw
History Blame Contribute Delete
6.52 kB
# 本轮功能更新说明
本文记录从 `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 能正确迁移。
- 管理员操作会实际输出结构化审计日志。
- 首次访问不会创建数据库用户;保存昵称后才生成正式账号。
- 保存昵称前后账号设置界面状态正确,移动端页面无水平溢出,浏览器控制台无错误。