You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Azure角色定义API返回的角色定义包含多个Permission结构体?

Azure RBAC角色定义API中Permissions切片的疑问与验证

我在用Azure Go SDK调用Role Definitions - Get接口时,对返回数据结构感到困惑:响应里的Permissions是一个指针切片,而非单独的指针。既然Actions、NotActions、DataActions和NotDataActions这些权限属性都可以在单个Permission结构体中描述,为什么API要返回多个Permission指针?

我编写了测试代码验证这一现象,测试对象包括订阅内置的Contributor角色和自定义角色,结果发现这个切片始终只有一个元素,所有权限内容都存储在第一个Permission结构体中——哪怕给自定义角色新增NotAction,数据也只会更新第一个结构体,不会新增切片元素。

测试代码如下:

package main

import (
    "context"
    "fmt"

    "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/authorization/armauthorization/v2"
)

func main() {
    // 从环境变量获取默认凭据
    cred, _ := azidentity.NewDefaultAzureCredential(nil)
    client, _ := armauthorization.NewRoleDefinitionsClient(cred, nil)

    // 通过roleDefinitionId和作用域获取角色定义
    roleDefinitionID := "b24988ac-6180-42a0-ab88-20f7382dd24c"
    scope := "/subscriptions/<my-subscription>"
    rd, _ := client.Get(context.TODO(), scope, roleDefinitionID, nil)

    lenPerms := len((*rd.RoleDefinition.Properties).Permissions)
    fmt.Printf("Permissions切片长度 = %d\n", lenPerms)
    lenActions := len((*(*rd.RoleDefinition.Properties).Permissions[0]).Actions)
    fmt.Printf("第一个Permission中的Actions数量 = %d\n", lenActions)
    lenNotActions := len((*(*rd.RoleDefinition.Properties).Permissions[0]).NotActions)
    fmt.Printf("第一个Permission中的NotActions数量 = %d\n", lenNotActions)
}

程序输出:

Permissions切片长度 = 1
第一个Permission中的Actions数量 = 1
第一个Permission中的NotActions数量 = 8

我曾猜测,是否每次向角色添加新操作时,Azure会将其存储为独立的“权限添加事件”,API响应会返回所有此类事件,但自定义角色的测试结果否定了这个猜想。

现在我正在开发一款需要提取角色定义中Actions、NotActions、DataActions和NotDataActions的软件,想确认:到底需要遍历整个Permissions切片处理所有元素,还是只需处理第一个元素即可?


内容的提问来源于stack exchange,提问作者Matt Welke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 21:23:08