Skip to content

权限说明 ​

GOSpeak 的权限分两层,很多人一开始会搞混:

  • 平台角色:管整个实例的后台,比如看用户列表、改 OAuth 配置
  • 域角色:只管某一个语音域内部,比如在这个域里踢人

两层互不影响。你在 A 域是管理员,不代表你能进 B 域,也不代表你能看平台后台。

平台角色 ​

启动时自动写入三个角色:

角色能做什么说明
admin全部权限平台管理员
user建房间、进房间、发消息、建域普通用户,绝大多数人都是这个
ban什么都做不了被封禁,中间件直接拦截

第一次启动会自动创建 admin 账号(密码 admin123),记得改。

普通用户有哪些权限 ​

普通用户只有这几项:

room:create    建房间
room:read      看房间
domain:create  建域
message:send   发消息
message:read   看消息

特别注意没有 user:read 和 role:read。这是故意的——给了这两项,所有人在侧栏都能看到「管理」入口。

全部权限码 ​

权限码管什么
room:create / room:read / room:update / room:delete房间增删改查
user:read / user:update / user:delete用户查询、改角色、删号
role:read / role:manage角色与权限关联的读写
message:read / message:send / message:delete_others消息读取、发送、删别人的
mute:manage用户级禁言
signal:kick从信令层踢人下线
sfu:manage改 SFU 配置
storage:read / storage:manage / storage:delete对象存储配置与删除
email_config:read / email_config:manage邮件配置
oauth:read / oauth:manage第三方登录配置
domain:create / domain:read / domain:manage / domain:delete域增删改查
domain:invite生成邀请
domain:kick从域里踢人
domain:role:manage管域内角色
audit:read看审计日志(默认没给任何人,需要手动授)

改某个角色的权限 ​

走接口,需要 role:manage:

bash
POST /api/v1/permission/sync

前端在「管理 → 角色权限」里点勾选也能改,效果一样。

域角色 ​

每个域内部独立一套,跟平台角色没关系:

域角色说明
owner建这个域的人,最高权限,不能转让给别人踢掉
admin域管理员,能管频道、管成员
member普通成员
guest访客,能做什么由域的开关决定

一个人在不同域可以是不同角色。你在自己的域是 owner,去朋友的域就是 member。

域里能管什么 ​

  • 频道:建、改、删
  • 成员:踢出、禁言
  • 角色:给成员分配域内角色
  • 邀请:生成邀请链接

具体谁能做,看域角色的权限配置。

访客 ​

访客是「不用注册也能进来听」的机制,适合公开社区。

域的设置里有三个开关,默认值如下:

开关默认说明
允许访客收听开关掉后访客进不来
允许访客发言开关掉后访客只能听
允许访客发消息关默认不让访客在文字频道说话

访客是通过邀请码进来的临时账号(is_guest=true),有独立的封禁列表——封了访客不影响他注册正式账号。

鉴权是怎么走的 ​

每个请求进来会依次过这几道:

请求
 ├─ JWTAuth()          验签、验过期、验令牌版本、验黑名单
 ├─ BanCheck()         ban 角色直接 403
 ├─ RequirePermission  按 role → 权限 映射查有没有
 └─ Handler

有些接口不需要权限码,但要求「是资源本人或持有某权限」,用的是 RequireOwnerOrPermission——比如改自己的资料谁都可以,改别人的就要 user:update。

改密码会让旧令牌失效吗 ​

会。users.token_version 存在 JWT 里,改密码或重置密码会把它加一,之前签发的所有令牌立刻作废。

登出是另一套机制:把这次令牌的 JTI 写进 NATS KV 黑名单,到期自动清理。

排查权限问题 ​

看不到「管理」入口 平台角色不是 admin,或者角色缺 user:read / role:read。

接口返回 403 但角色看着没问题 看返回的 code:1013 是权限不足,1001-1014 里的认证类错误说明令牌本身有问题(过期、被吊销、版本不匹配)。

域里什么都点不了 域角色是 member 或 guest,没给你管理权限。

被封了还能登录? 能登录但所有受保护接口返回 403。这是预期行为,登录本身不校验 ban 角色。

下一步 ​

基于 Apache 2.0 许可开源