TeamSpeak3 权限系统介绍

TS3权限系统是一个非常灵活和功能丰富的系统,决定了哪些用户可以进行哪些操作。

都有些什么样的权限?

布尔权限(逻辑权限)

-------------------
这种权限仅有两种值:真(true)或假(false)。

例子:
b_virtualserver_modify_name

从权限名称即可以看出是一个布尔权限,因为它以b_打头。紧跟这个前缀的是权限的实际名称,可以帮助你理解这是个什么样的权限。该例中,此权限控制你是否可以修改服务器的名称。如果设置为真(true),你就能够修改服务器名称,如果设置为假(false)或未设置值,则不能修改服务器名称。

整数权限

-------------------
这种权限接受一个整数值。

例子:
i_channel_max_depth

从权限名称,即可以再次看出这是一个整数权限,因为它以i_开头。权限名称channel_max_depth则可以看出控制什么权限。该例中,此权限控制你可以创建多少层频道。所以,如果值设为0,你只能创建顶级频道。如设为1,可以创建子频道。设为2,可以接着在子频道下创建子频道。

就如同许多权限没有合理的数值限制,i_channel_max_depth可以设为-1这样特殊的值表示没有频道最大深度的限制。

权力及所需权力权限

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这种权限是整数权限的特例。它们总是成对的,一个权力权限和一个所需权力权限。只有当你的权力大于等于相应的所需权力时,你才可以成功地进行操作。

例子:

i_client_kick_from_server_power
i_client_needed_kick_from_server_power

当你想从服务器踢出一个用户时,权限系统将比较你的“踢出服务器权力”值和被踢出用户的“需要最低踢出服务器权力”值。如果你有相等或更大的权力,你就能够踢出用户。如果你的权力小于被踢出用户的所需权力,你将无法进行操作。这本质上是引入了“啄食顺序”,例如你可以给较低级别的管理人员踢出游客的权限,但高级别的管理人员则可以踢出服务器上的任何人。

i_needed_modify_power_* 或授予权限

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
每个权限都有一个关联的i_needed_modify_power_*权限,例如b_clent_ban_create有一个关联的权限i_needed_modify_power_client_ban_create。在客户端界面,这些关联权限没有作为单独的权限列出,而是显示为每个权限对应的“所需授予权力”(Grant)项下的数值,这些授予权限控制允许用户授予或取消对应权限,所以它们是修改权限系统的关键,通常只保留给管理员使用。

用户如何取得权限?它们如何分配?

用户取得权限由5层系统决定。每层能覆盖上一层的权限。如果一项权限没有被5层中的任何一层授予,它将会假定为0或false。5层系统为:

第1层: 服务器组
第2层: 用户
第3层: 频道
第4层: 频道组
第5层: 频道+用户

例子:
你在第1层是“游客”组,权限项b_channel_modify_name(是否可以修改频道名称)为false。同时你在第4层是“频道管理员”,权限项b_channel_modify_name为true。由于第4层频道组是更高级别的层,最终,你可以修改频道名称(不包括其它不具有频道管理员身份的频道)。

现在我们详细看下每一层和它的特殊属性。

第1层: 服务器组

---------------------

每个用户都是一个或多个用户组的一份子,这些服务器组包含大量的权限,当加入到该组时,你将拥有这些权限。由于你可以同时加入到多个用户组,因此同一权限可能会在多个用户组同时授予,需要一种方法计算出在第1层最终的权限。这里将使用最好的或最高值作为结果,每个服务器组都有“否定”和“忽略”标志(会在稍后的内容中介绍),由于每个用户必须至少是一个服务器组的一份子,所以有一个特殊的用户组,称作“默认服务器组”,当新用户进入服务器时将自动加入该组。

例子:
你同时加入了3个服务器组:服务器管理员、家族领导人、战争组织者。服务器管理员的i_client_kick_from_server_power(踢出服务器权力)值为50,家族领导人的i_client_kick_from_server_power值为100,战争组织者没有设置i_client_kick_from_server_power。该项权限在第1层的最终结果为100,因为那是你所有加入的用户组中的最高值。

有时你可能创建一个服务器组,主要是一些“禁止”或“拒绝”的权限。例如,“锁定”用户组不允许切换频道,“禁言”用户组不允许客户端发言,那么在该组的相应权限上勾选“否定”标记。如果你所加入的其中一个用户组有“否定”标志,该项权限将不再取最高值作为最终结果,而是取最低值。

例子:
你创建一个服务器组,名为“锁定”。它仅包含一项权限:i_channel_join_power(进入频道权力值),值为-1,且设置了“否定”标记。现在如果我把“锁定”值授予一些用户,那么这些用户将不能切换到任何频道。这是因为“否定”标记将确保第1层的最终结果不是取最高值,而是取最低值,所以是-1或更小。因为频道通常没有i_channel_needed_join_power设置,如果一项权限没有设置,会被假定为0。由于-1比0小,所以用户不能进入频道。

由于服务器组是权限系统的第1层,它可能会被更高级别的层所覆盖。有时想要阻止频道组(第4层)覆盖权限,那么在该服务器组的相应权限上勾选“忽略”标记。如果一项权限在服务器组(第1层)或用户(第2层)有“忽略”标记,这项权限将不会被频道组(第4层)或频道(第3层)的设置所覆盖。

例子:作为TS服务器的管理员,你不希望更高级别的频道组限制你的权限。通过在管理员组的相应权限上添加“忽略”标记,频道组在这些权限上的设置都将被忽略,不起作用。

第2层: 用户

-----------------------------------
这些权限设置到指定用户,并且将覆盖第1层的重叠权限。第2层的权限也像第1层(服务器组)一样,有“忽略”标记,以使这层的权限不被第4层(频道组)和第3层(频道组)所覆盖。

例子:你在“游客”服务器组,有一项i_client_kick_from_server_power(踢出服务器权力)设置为0。如果你想在不加入管理员组的情况下踢人,可以在第2层添加i_client_kick_from_server_power权限,设置为100。由于“用户”权限是第2层,它将覆盖第1层的权限。

第3层: 频道

------------------------------------
“频道”权限类似于“用户”权限,不同之处是应用在频道上。一个例子是想控制谁在频道可以发言。在第3层的“频道”权限上设置一个i_client_needed_talk_power(所需发言权力)值为30,那么只有i_client_talk_power(发言权力)值大于等于30的用户才能够在此频道讲话。另一个常见例子是一个频道只想让某些用户进入,可以设置i_channel_needed_join_power(所需进入频道权力)值。或者只想让某些用户看到频道内的在线用户,可以设置i_channel_needed_subscribe_power(所需频道浏览权力)值。

第4层: 频道组

----------------------
每个用户都是某一频道组的一员,而且只能同时加入一个频道组。当用户加入新的频道组时,你将自动退出旧的频道组。类似第3层的“频道”权限,通过“频道组”获得的权限只能应用在频道级别,例如你获得的b_channel_modify_password(修改频道密码)权限,只允许你在有这项权限的频道里修改密码。服务器设置里设定了两个特殊的频道组:“默认频道组”自动指派给首次进入频道的用户,“默认频道管理组”自动指派给创建频道的用户。

第5层: 频道+用户

-----------------------------------------------
“频道+用户”象“用户”(第2层)和“频道”(第3层)的一个组合,同时应用于用户和频道,仅当二者都符合时才生效。 当使用“优先发言”功能时,会在后台自动使用:当你被授予“优先发言”时,会在你和当前频道的“频道+用户”权限里自动添加b_client_is_priority_speaker(是否优先发言)权限。

使用基于频道的权限注意事项

--------------------------------------------------
每当你在指定频道进行操作(例如加入频道,从频道踢出用户,修改频道名称等等),权限系统将检查你是否在指定频道拥有权限,意思是你从频道级别(第3层,第4层,第5层)获得的权限将仅适用于在拥有权限的频道进行操作,如果在其它频道将不能进行操作。例如b_virtualserver_modify_name(修改服务器名称),当你通过频道级别获得此项权限时,只有你在正确的指定频道才能修改服务器名称。

谁可以编辑权限系统?

权限系统也决定了谁可以修改权限系统自身,通常只有管理员可以信任。

创建/删除用户组

----------------------------
创建一个服务器组,需要有b_virtualserver_servergroup_create(创建服务器组)权限。
删除一个服务器组,需要有b_virtualserver_servergroup_delete(删除服务器组)权限。
创建一个频道组,需要有b_virtualserver_channelgroup_create(创建服务器组)权限。
删除一个频道组,需要有b_virtualserver_channelgroup_delete(删除服务器组)权限。

添加用户到用户组/从用户组移除用户

------------------------------------------

添加一个用户到服务器组或频道组,需要你的i_group_member_add_power(组用户添加权力)值大于等于指定用户组的i_group_needed_member_add_power(所需最低组用户添加权力)。类似地,需要你的i_group_member_remove_power(组用户移除权力)值大于等于指定用户组的i_group_needed_member_remove_power(所需最低组用户移除权力)。另外,你的i_client_permission_modify_power(用户修改权力)必须大于等于被操作对象的i_client_needed_permission_modify(所需用户修改权力)。

添加/删除/编辑权限

----------------------------------------
下面问题的答案需要全部是“Yes”,才能添加、删除或修改任一层的权限:
(1)我在相关权限上是否有一个大于0的“授予”权力值?
(2)我的i_permission_modify_power(修改权限权力)值是否大于等于相关权限的“授予”权力值?
(3)当修改i_permission_modify_power(修改权限权力),i_group_modify_power(修改组权力),i_client_permission_modify_power(用户修改权力),i_channel_permission_modify_power(频道权限修改权力),i_channel_modify_power(频道修改权力),i_group_member_add_power(组用户添加权力),i_group_member_remove_power(组用户移除权力)或i_needed_modify_power_*系列权限时,不能设置比自己拥有权力更大的值。

还会进行下面的附加检查:
修改服务器组(第1层):
- 我的i_group_modify_power(修改组权力)是否大于等于被修改组的i_group_needed_modify_power(所需组修改权力)?
修改“用户”权限(第2层):
- 我的i_client_permission_modify_power(用户权限修改权力)是否大于等于被修改用户的 i_client_needed_permission_modify_power(所需用户权限修改权力)?
修改“频道”权限(第3层):
- 我的i_channel_permission_modify_power(频道权限修改权力)是否大于等于被修改频道的 i_channel_needed_permission_modify_power(所需频道权限修改权力)?
修改“频道组”权限(第4层):
- 我的i_group_modify_power(组修改权力)是否大于等于被修改组的i_group_needed_modify_power(所需组修改权力)?
修改“频道+用户”权限(第5层):
- 我的i_client_permission_modify_power(用户权限修改权力)是否大于等于被修改用户的 i_client_needed_permission_modify_power(所需用户权限修改权力)?
-  我的i_client_permission_modify_power(用户权限修改权力)是否大于等于被修改频道的 i_channel_needed_permission_modify_power(所需频道权限修改权力)?

 

自动更新权限

-------------------------
当权限系统升级时,服务器将自动分配新的权限到你的现有用户组,要启用自动更新,为这些用户组指定i_grout_auto_update_type(组自动更新编号),以下值是有效的:

10: 频道组-游客
15: 服务器组-游客
25: 频道组-语音
30: 服务器组-会员
35: 频道组-语音审批
40: 频道组-频道管理员
45: 服务器组-管理员

如你所见,每个值代表TS3服务器用户组的默认权限。例如,如果权限系统更新后,管理员组有一个新的权限,那么所有i_group_auto_update_type(组自动更新编号)设为45的组都将自动更新。

回到顶部
-----------------分隔线-----------------