如何使用托管标识连接 Azure Blob 存储帐户并使用 Azure SDK for Java 管理容器 ACL

问题描述 投票:0回答:1

我正在使用连接字符串和访问密钥连接存储帐户。 对于编码,我使用 Azure SDK for Java。

现在,我必须使用托管标识来连接到存储帐户并管理其 ACL,而不是 ConnectionString。

DataLakeServiceClientBuilder builder = new DataLakeServiceClientBuilder();
builder.credential(getManagedIdentity()); 
builder.endpoint(<storage account end point>); 

托管标识具有 存储帐户贡献者角色、存储帐户 Blob 数据所有者角色

我没有使用任何 SharedCredential,但我收到以下错误。

签名不符,可以将登录字符串与sdk生成的字符串进行比较

那么,是否还需要另一个角色来连接存储帐户并使用托管身份控制 Blob ACL?

azure azure-blob-storage azure-managed-identity azure-data-lake-gen2 azure-sdk-for-java
1个回答
0
投票

签名不符,可以将登录字符串与sdk生成的字符串进行比较

该错误可能是签名问题。通过再次验证,确保托管标识具有访问存储帐户所需的权限,并且您使用的终结点有效。

如何使用托管标识连接 Azure Blob 存储帐户并使用 Azure SDK for Java 管理容器 ACL?

您可以使用下面的代码来访问存储帐户并使用 azure java SDK 管理具有托管身份的 ACL。

这里是使用用户分配的托管标识和存储帐户进行身份验证的 MS-Document,我尝试了相同的操作,将

Storage blob data owner
分配给托管标识以访问帐户中的所有目录和文件。

代码:

 String endpoint = "https://xxxx.dfs.core.windows.net";
 String fileSystemName = "xxx";

      
 DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder().managedIdentityClientId("0faxxxx9").build();
 DataLakeFileSystemClient fileSystemClient = new DataLakeFileSystemClientBuilder()
            .credential(defaultCredential)
            .endpoint(endpoint)
            .fileSystemName(fileSystemName)
            .buildClient();

 DataLakeDirectoryClient directoryClient = fileSystemClient.getDirectoryClient("xx");
    
          PathAccessControl directoryAccessControl = directoryClient.getAccessControl();
    
          List<PathAccessControlEntry> pathPermissions = directoryAccessControl.getAccessControlList();
         
          System.out.println(PathAccessControlEntry.serializeList(pathPermissions));
               
          RolePermissions groupPermission = new RolePermissions();
          groupPermission.setExecutePermission(true).setReadPermission(true);
    
          RolePermissions ownerPermission = new RolePermissions();
          ownerPermission.setExecutePermission(true).setReadPermission(true).setWritePermission(true);
    
          RolePermissions otherPermission = new RolePermissions();
          otherPermission.setReadPermission(true).setWritePermission(true);
    
          PathPermissions permissions = new PathPermissions();
    
          permissions.setGroup(groupPermission);
          permissions.setOwner(ownerPermission);
          permissions.setOther(otherPermission);
    
          directoryClient.setPermissions(permissions, null, null);
    
          pathPermissions = directoryClient.getAccessControl().getAccessControlList();
       
          System.out.println(PathAccessControlEntry.serializeList(pathPermissions));

上面使用

managed identity
检索文件系统中特定目录的 DataLakeDirectoryClient 对象,并使用 Azure Active Directory (AD) 进行身份验证。然后使用
getAccessControl
函数检索修改后的访问控制列表,并使用
setPermissions
方法为目录设置新权限。

输出:

user::rwx,group::r-x,other::r--
user::rwx,group::r-x,other::rw-

传送门:

enter image description here

参考:

使用 Java 管理 Azure Data Lake Storage Gen2 中的 ACL - Azure 存储 |微软学习

© www.soinside.com 2019 - 2024. All rights reserved.