Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
默认情况下,添加到Azure托管 Redis 缓存中的每个用户或服务主体都可访问所有命令和密钥。 从 API 版本 2026-05-01-preview开始,可以通过在访问策略分配上指定 访问字符串 ,为单个用户分配自定义 Redis ACL 权限。
使用自定义访问字符串(预览版)可以控制用户可以执行的命令以及用户可以访问的键。 此控件为缓存启用精细的按用户数据访问控制。
先决条件
- Azure 托管的 Redis 缓存。 若要创建一个实例,请参阅 Quickstart:创建Azure托管 Redis 实例。
- 使用 API 版本
2026-05-01-preview访问 REST API。
局限性
- 自定义访问字符串需要 API 版本
2026-05-01-preview或更高版本。 早期 API 版本始终分配完全访问权限。 - 每个用户可以为每个数据库分配一个访问策略。
- 访问字符串比较区分大小写,因为 Redis 键模式区分大小写。
- 无论 ACL 配置如何,Azure托管 Redis 中都会阻止某些 Redis 命令。 有关详细信息,请参阅 “阻止”命令。
可用范围
| 层 | Availability |
|---|---|
| 均衡型(B 系列) | 是的 |
| 内存优化 (M 系列) | 是的 |
| 计算优化 (X 系列) | 是的 |
| 闪存优化 (F 系列) | 是的 |
Redis ACL 权限
Azure托管 Redis 使用 Redis ACL 语法来定义访问权限。 访问字符串结合了命令权限和键模式来控制用户可以执行的操作。
-
命令类别:用于
+@<category>允许或-@<category>禁止一组命令(例如,,+@read+@write,+@all)。 -
单个命令:使用
+<command>或-<command>禁止特定命令(例如,+set-flushall)。 -
密钥模式:用于
~<pattern>限制用户可以访问的密钥。 对所有密钥使用~*。 可以组合多个模式。
有关命令类别和语法详细信息的完整列表,请参阅 Redis ACL 文档。
示例
| 访问字符串 | Description |
|---|---|
+@all ~* |
对所有命令和所有密钥的完全访问权限(默认值) |
+@all ~user:* |
所有命令,但仅针对与 user:* 匹配的按键 |
+@read ~cache:* |
对匹配的密钥的只读访问权限 cache:* |
+@read +@write ~app:* ~session:* |
对匹配 app:* 或 session:* 的密钥具有读取和写入权限 |
+@read +set +get ~data:* |
读取匹配 SET 的键上的 GET 和 data:* |
Note
键模式区分大小写。 例如, ~User:* 并 ~user:* 匹配不同的键集。
分配自定义访问权限
Azure 门户
在Azure门户中,转到Azure托管 Redis 实例。
在“资源”菜单上,选择“ 身份验证”。
在Microsoft Entra身份验证选项卡上,选择用户或服务主体,然后选择+ 选择成员。
在 “选择成员 ”面板中,搜索并选择用户或服务主体。
在“访问策略”下,选择“自定义数据访问策略”(预览版)并输入访问字符串(例如)。
+@all -@write ~*选择分配。
如果访问字符串包含无效的 Redis ACL 语法,则分配将失败。 Redis 用户列表显示指示失败的横幅,用户条目显示失败的预配状态,并显示“查看错误详细信息”链接。
ARM 模板
将以下模板另存为 AccessPolicyAssignment.json,将参数值替换为你自己的:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"cacheName": {
"defaultValue": "{CacheName}",
"type": "String"
},
"assignmentName": {
"defaultValue": "{AssignmentName}",
"type": "String"
},
"objectId": {
"defaultValue": "{ObjectId}",
"type": "String"
},
"accessString": {
"defaultValue": "+@all ~*",
"type": "String"
}
},
"resources": [
{
"type": "Microsoft.Cache/redisEnterprise/databases/accessPolicyAssignments",
"apiVersion": "2026-05-01-preview",
"name": "[concat(parameters('cacheName'), '/default/', parameters('assignmentName'))]",
"properties": {
"accessPolicyName": "default",
"accessString": "[parameters('accessString')]",
"user": {
"objectId": "[parameters('objectId')]"
}
}
}
]
}
使用 az 部署组 create Azure CLI 命令部署模板:
az deployment group create \
--resource-group myResourceGroup \
--template-file AccessPolicyAssignment.json \
--parameters cacheName=myCache assignmentName=myAssignment \
objectId=aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb \
accessString="+@read ~cache:*"
REST API
还可以直接使用 REST API:
PUT https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Cache/redisEnterprise/{cacheName}/databases/{databaseName}/accessPolicyAssignments/{assignmentName}?api-version=2026-05-01-preview
{
"properties": {
"accessPolicyName": "default",
"accessString": "+@read ~cache:*",
"user": {
"objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb"
}
}
}
如果省略 accessString,则用户会收到完全访问权限(+@all ~*)。
更新用户的权限
若要更改用户的访问权限,请使用其他 accessString 值运行相同的 create 或 PUT 命令。 Redis 中用户的角色会直接更新,无需断开用户连接。 将自动清理以前的自定义 ACL 和角色对象。
删除用户的访问权限
删除访问策略分配以撤销用户的访问权限:
DELETE https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Cache/redisEnterprise/{cacheName}/databases/{databaseName}/accessPolicyAssignments/{assignmentName}?api-version=2026-05-01-preview
删除一个用户的分配不会影响同一缓存上的其他用户。
错误处理
如果你提供了无效的 Redis ACL 字符串,预配将失败,并出现包含 Redis 错误消息的 InvalidAccessString 错误。 例如:
{
"provisioningState": "Failed",
"provisioningError": {
"code": "InvalidAccessString",
"message": "Failed to provision access string '+@nonexistent ~*': ERR Error in ACL SETUSER modifier '+@nonexistent': Unknown command or category name in ACL",
"target": "properties.accessString"
}
}
当新分配失败时,缓存中的现有用户不会受到影响。