为何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
相关产品推荐
相关产品推荐

