# 本轮功能更新说明 本文记录从 `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 能正确迁移。 - 管理员操作会实际输出结构化审计日志。 - 首次访问不会创建数据库用户;保存昵称后才生成正式账号。 - 保存昵称前后账号设置界面状态正确,移动端页面无水平溢出,浏览器控制台无错误。