我正在使用连接字符串和访问密钥连接存储帐户。 对于编码,我使用 Azure SDK for Java。
现在,我必须使用托管标识来连接到存储帐户并管理其 ACL,而不是 ConnectionString。
DataLakeServiceClientBuilder builder = new DataLakeServiceClientBuilder();
builder.credential(getManagedIdentity());
builder.endpoint(<storage account end point>);
托管标识具有 存储帐户贡献者角色、存储帐户 Blob 数据所有者角色。
我没有使用任何 SharedCredential,但我收到以下错误。
签名不符,可以将登录字符串与sdk生成的字符串进行比较
那么,是否还需要另一个角色来连接存储帐户并使用托管身份控制 Blob ACL?
签名不符,可以将登录字符串与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-
传送门:
参考:
使用 Java 管理 Azure Data Lake Storage Gen2 中的 ACL - Azure 存储 |微软学习