跳转到内容

房间、权限与用户偏好

SyncTV 有两层角色,不能混为一谈。

层级角色作用范围
全局用户角色rootadminuser平台管理、用户管理、房间管理、系统设置
房间角色creatoradminmemberguest单个房间内的播放、成员、媒体、聊天和设置权限

全局 admin 不自动等于某个房间的 admin。房间 admin 也不等于平台管理员。

角色能力边界
root超级管理员,可以管理 root/admin/user、全局设置和所有房间
admin平台管理员,可以管理普通用户和房间,但不能越权管理 root 或同级管理员的敏感设置
user普通用户,按房间和业务权限使用功能

用户状态是从封禁记录派生的有效状态:

状态影响
active可以登录、创建房间、加入房间
banned不能登录、创建房间或加入房间
房间角色默认语义
creator房间创建者,拥有全部房间权限,不能通过房间设置削弱
admin房间管理员,默认拥有成员管理、播放控制、媒体管理、房间设置等权限
member普通成员,默认可以聊天、使用 WebRTC、创建/编辑自己的媒体资源、按所有权删除自己的媒体资源、查看媒体资源和成员信息
guest游客,不是房间成员,默认没有播放列表、媒体、聊天或管理权限;房间只能额外开放成员列表、聊天历史或 WebRTC 等 guest 安全能力

房间角色提供基础权限,房间设置和成员权限覆盖会在基础权限上继续做加减。

游客可以进入已开启游客访问的公开房间,但不会变成房间成员。游客权限使用独立上限,不从 member 继承。

能力默认可通过 guest 权限开放说明
基础房间实时状态不需要配置连接后用于显示房间存在、设置和播放状态
成员列表view_member_list只读
聊天历史view_chat_history只读
WebRTC 信令use_webrtc只允许信令参与,不授予房间管理能力
媒体资源游客不能读取、浏览或管理媒体资源
聊天发送send_chat 只适用于登录成员
播放控制、成员管理、房间设置必须是登录成员并具有对应权限

有效权限按三层计算:

房间有效权限计算模型图,展示房间角色基础权限、房间设置 added 和 removed 权限、成员个人 added 和 removed 权限,以及 creator 始终拥有全部权限的特例。 房间有效权限计算模型图,展示房间角色基础权限、房间设置 added 和 removed 权限、成员个人 added 和 removed 权限,以及 creator 始终拥有全部权限的特例。
有效权限从房间角色基础权限开始,依次叠加房间设置和成员个人覆盖;同一权限同时 add 和 remove 时,remove 生效。

规则:

  • creator 始终拥有全部房间权限。
  • add 先增加权限,remove 再移除权限;同一个权限同时 add 和 remove 时,remove 生效。
  • memberAddedPermissions 不能超过 admin 级别上限。
  • guestAddedPermissions 使用独立 guest 上限,不能授予媒体资源、聊天写入或管理权限。
  • DELETE_ROOM 不属于房间内可委派权限,房间删除应由创建者或平台管理面处理。

运行时设置和管理界面使用稳定的 snake_case 权限名称。

权限名称含义
send_chat发送聊天消息
create_media_resource创建媒体资源,并修改自己创建的媒体资源
delete_media_resource_any删除其他用户创建或没有记录创建者的媒体资源
reorder_media_resources调整媒体资源顺序
clear_media_resources清空媒体资源队列
live_control管理直播,并创建推流 key
play_control播放、暂停、seek
change_current_media切换当前播放媒体
change_playback_rate修改播放速度
approve_member审批加入房间请求
kick_member踢出成员,并设置临时重新加入冷却时间
set_member_permissions修改成员权限
add_member主动添加成员
set_room_settings修改房间设置
delete_chat删除聊天消息
delete_room删除房间,不可作为普通房间内委派权限
view_media_resources查看媒体资源
view_member_list查看成员列表
view_chat_history查看聊天历史
use_webrtc使用 WebRTC 语音/视频能力

删除自己创建的媒体资源是所有权业务规则,不对应单独的权限位。成员即使没有 create_media_resource,仍然可以删除自己创建的媒体资源;但创建媒体资源、修改自己创建的媒体资源都需要 create_media_resource

房间设置控制加入策略、显示能力和默认权限。

设置默认值说明
password创建房间时设置初始密码;后续通过房间密码接口修改
allowGuestJoinfalse是否允许游客加入
maxMembers100房间最大成员数,上限 10000
requireApprovalfalse加入房间是否需要审核
allowAutoJointrue是否允许符合条件的用户自动加入
chatEnabledtrue是否启用聊天
autoPlay{}自动播放策略,例如 {"enabled":true,"mode":1,"delay":5}
adminAddedPermissions / adminRemovedPermissions空权限集合房间 admin 默认权限增减
memberAddedPermissions / memberRemovedPermissions空权限集合房间 member 默认权限增减
guestAddedPermissions / guestRemovedPermissions空权限集合房间 guest 默认权限增减

示例:

Terminal window
synctv room settings get <ROOM_ID>
synctv room settings update <ROOM_ID> --settings-json '{"requireApproval":true}'

成员级覆盖用于处理例外,例如临时禁言、给某个成员播放控制、撤销某个管理员的封禁能力。

语义:

  • 成员基础权限来自房间角色。
  • added_permissions 增加该成员的普通权限。
  • removed_permissions 移除该成员的普通权限。
  • 管理员还可以有 adminAddedPermissionsadminRemovedPermissions
  • creator 的权限削弱不生效。

管理规则:

  • 优先用角色解决长期权限,用成员覆盖解决例外。
  • 成员覆盖越多,排障越难;定期清理不再需要的覆盖。
  • 对管理员撤权时,优先考虑是否应该直接调整角色,而不是堆叠大量 deny 位。

用户偏好是数据库中的用户级设置,不是 YAML 配置。

字段默认值说明
two_factor_enabledfalse是否开启用户级 2FA
notifications.room_invitation_in_apptrue房间邀请站内通知
notifications.room_event_in_apptrue房间事件站内通知
notifications.system_announcement_in_apptrue系统公告站内通知
notifications.room_invitation_emailfalse房间邀请邮件通知
notifications.room_event_emailfalse房间事件邮件通知
notifications.system_announcement_emailtrue系统公告邮件通知

Provider instance 绑定不是用户偏好;用户通过某个 instance 登录 provider 时,绑定会存储在对应 provider credential 上。数据库表还有一个 settings JSONB 扩展载荷,只用于低优先级实验性偏好。稳定的产品偏好应该优先设计成明确字段,不能把 secret、token、Cookie、密码或 Provider 凭据放进去。

2FA 约束:

  • 开启 2FA 必须有至少两种本地验证方式:password、webauthn/passkey、verified email。
  • OAuth2 不计入本地 2FA 因素,但 2FA 用户可以使用 OAuth2 登录。
  • 删除验证方式时,如果用户开启了 2FA,删除后仍必须保留至少两种可用本地方式。

使用权限名称

权限配置应使用稳定的权限名称集合,便于审查、复制和回滚。

区分全局和房间

平台 admin 和房间 admin 是两套概念,排查权限问题时先确认操作发生在哪一层。

偏好不是启动配置

用户偏好可以通过 API/CLI 修改,不应该写进 YAML 或 Helm values。

变更后验证路径

修改加入规则、权限或 2FA 后,用真实登录、加入房间和播放操作验证。