使用通配符组角色模式

Azure Web PubSub现在支持客户端“组”角色中的通配符模式匹配,因此可以使用单个角色字符串为多个相关组授权客户端。

可以继续使用现有字面角色:

  • webpubsub.sendToGroup.{groupName}
  • webpubsub.joinLeaveGroup.{groupName}

但是,现在还可以使用新的模式角色:

  • webpubsub.sendToGroups.{pattern}
  • webpubsub.joinLeaveGroups.{pattern}

{pattern} 遵循以下通配符语法。

何时使用模式角色

在以下情况下使用模式角色:

  • 用户或设备必须访问大型但受限的动态组集(例如:特定租户或项目的所有组)
  • 你想要保持访问令牌较小(避免列出数十个或数百个显式组角色)

模式语法

符号 含义
? 除了 . 外,准确匹配一个字符
* 匹配除 . 以外的零个或多个字符
** 匹配零个或多个字符,包括 .(可跨越段落边界)
\ \*?定义的转义字符
. 充当层次结构分隔符,永远不会由 ?* 匹配(仅由 ** 匹配)。

其他规则:

  • 在单个模式中最多允许五个 * 字符(包括构成 ** 的字符)。

示例

图案 Matches 不匹配
chat-* chat-1chat-room chat.1xchat-1
clientA.* clientA.alphaclientA.1 clientA.alpha.room1clientB.alpha
clientA.** clientA.alphaclientA.alpha.room1 clientB.anything
clientA.rooms.?1 clientA.rooms.a1clientA.rooms.11 clientA.rooms.1clientA.rooms.a.1
literal\*star literal*star literalXstar

转义

作为前缀使用*?\以匹配\的字面字符。 示例: project\*123project*123匹配 。

在代码中使用模式角色

生成客户端访问令牌时,将模式角色添加到 roles 集合。 然后,客户端会自动具有匹配组的隐含权限。

代码示例

const token = await serviceClient.getClientAccessToken({
  roles: [
    // Can send to all groups under clientA.
  'webpubsub.sendToGroups.clientA.**',
    // Can join/leave any direct child group under public.
  'webpubsub.joinLeaveGroups.public.*'
  ]
});

安全指南

  • 首选满足方案的最窄模式。
  • 尽量减少使用*以降低过度授权风险。

常见问题解答

问:是否可以混合文本角色和模式角色?

是的。 字面角色始终严格适用;模式则扩大了适用范围。

后续步骤