配置自定义数据访问权限(预览版)

默认情况下,添加到Azure托管 Redis 缓存中的每个用户或服务主体都可访问所有命令和密钥。 从 API 版本 2026-05-01-preview开始,可以通过在访问策略分配上指定 访问字符串 ,为单个用户分配自定义 Redis ACL 权限。

使用自定义访问字符串(预览版)可以控制用户可以执行的命令以及用户可以访问的键。 此控件为缓存启用精细的按用户数据访问控制。

先决条件

局限性

  • 自定义访问字符串需要 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 的键上的 GETdata:*

Note

键模式区分大小写。 例如, ~User:*~user:* 匹配不同的键集。

分配自定义访问权限

Azure 门户

  1. 在Azure门户中,转到Azure托管 Redis 实例。

  2. 在“资源”菜单上,选择“ 身份验证”。

  3. Microsoft Entra身份验证选项卡上,选择用户或服务主体,然后选择+ 选择成员

  4. “选择成员 ”面板中,搜索并选择用户或服务主体。

  5. “访问策略”下,选择“自定义数据访问策略”(预览版)并输入访问字符串(例如)。 +@all -@write ~*

    显示“选择成员”面板的屏幕截图,其中选择了“自定义数据访问策略”并输入了自定义访问字符串。

  6. 选择分配

如果访问字符串包含无效的 Redis ACL 语法,则分配将失败。 Redis 用户列表显示指示失败的横幅,用户条目显示失败的预配状态,并显示“查看错误详细信息”链接。

显示 Redis 用户列表的屏幕截图,其中显示了由于 ACL 语法无效和“查看错误详细信息”链接而失败的访问策略分配。

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"
  }
}

当新分配失败时,缓存中的现有用户不会受到影响。