Azure Web PubSub现在支持客户端“组”角色中的通配符模式匹配,因此可以使用单个角色字符串为多个相关组授权客户端。
可以继续使用现有字面角色:
webpubsub.sendToGroup.{groupName}webpubsub.joinLeaveGroup.{groupName}
但是,现在还可以使用新的模式角色:
webpubsub.sendToGroups.{pattern}webpubsub.joinLeaveGroups.{pattern}
{pattern} 遵循以下通配符语法。
何时使用模式角色
在以下情况下使用模式角色:
- 用户或设备必须访问大型但受限的动态组集(例如:特定租户或项目的所有组)
- 你想要保持访问令牌较小(避免列出数十个或数百个显式组角色)
模式语法
| 符号 | 含义 |
|---|---|
? |
除了 . 外,准确匹配一个字符 |
* |
匹配除 . 以外的零个或多个字符 |
** |
匹配零个或多个字符,包括 .(可跨越段落边界) |
\ |
为\、*、?定义的转义字符 |
. |
充当层次结构分隔符,永远不会由 ? 或 * 匹配(仅由 ** 匹配)。 |
其他规则:
- 在单个模式中最多允许五个
*字符(包括构成**的字符)。
示例
| 图案 | Matches | 不匹配 |
|---|---|---|
chat-* |
chat-1、chat-room |
chat.1、xchat-1 |
clientA.* |
clientA.alpha、clientA.1 |
clientA.alpha.room1、clientB.alpha |
clientA.** |
clientA.alpha、clientA.alpha.room1 |
clientB.anything |
clientA.rooms.?1 |
clientA.rooms.a1、clientA.rooms.11 |
clientA.rooms.1、clientA.rooms.a.1 |
literal\*star |
literal*star |
literalXstar |
转义
作为前缀使用*、?或\以匹配\的字面字符。 示例: project\*123 仅 project*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.*'
]
});
安全指南
- 首选满足方案的最窄模式。
- 尽量减少使用
*以降低过度授权风险。
常见问题解答
问:是否可以混合文本角色和模式角色?
是的。 字面角色始终严格适用;模式则扩大了适用范围。