使用 Node.js 中的 JavaScript SDK 管理 Azure Data Lake Storage 中的 ACL
本文介绍如何使用 Node.js 来获取、设置和更新目录与文件的访问控制列表。
先决条件
- Azure 订阅 - 创建试用订阅。
- 已启用分层命名空间 (HNS) 的 Azure 存储帐户。 按这些说明创建一个。
- Node.js LTS
- Azure CLI 版本
2.6.0
或更高版本。 - 以下安全权限之一:
- 一个预配的 Microsoft Entra ID 安全主体,它已分配有存储 Blob 数据所有者角色,并且范围限定为目标容器、存储帐户、父资源组或订阅。
- 计划将 ACL 设置应用到的目标容器或目录的拥有用户。 为了以递归方式设置 ACL,这包括目标容器或目录中的所有子项。
- 存储帐户密钥。
设置项目
本部分逐步指导你准备一个项目,使其与适用于 JavaScript 的 Azure Data Lake Storage 客户端库配合使用。
安装包
使用 npm install
命令安装 Azure Data Lake Storage 和 Azure 标识客户端库的包。 与 Azure 服务建立无密码连接需要 @azure/identity 包。
npm install @azure/storage-file-datalake
npm install @azure/identity
加载模块
在文件顶部添加以下代码以加载所需的模块:
const {
AzureStorageDataLake,
DataLakeServiceClient,
StorageSharedKeyCredential
} = require("@azure/storage-file-datalake");
const { DefaultAzureCredential } = require('@azure/identity');
连接到帐户
若要运行本文中的代码示例,需创建一个表示存储帐户的 DataLakeServiceClient 实例。 你可以使用 Microsoft Entra ID 凭据或帐户密钥为客户端对象授权。
可以使用适用于 JavaScript 的 Azure 标识客户端库,通过 Microsoft Entra ID 对应用程序进行身份验证。
注意
如果使用 Microsoft Entra ID 来授予访问权限,请确保已为安全主体分配了存储 Blob 数据所有者角色。 若要详细了解如何应用 ACL 权限以及更改这些权限的影响,请参阅 Azure Data Lake Storage 中的访问控制模型。
首先,你必须为安全主体分配以下 Azure 基于角色的访问控制 (Azure RBAC) 角色之一:
角色 | ACL 设置功能 |
---|---|
存储 Blob 数据所有者 | 帐户中的所有目录和文件。 |
存储 Blob 数据参与者 | 仅限安全主体拥有的目录和文件。 |
接下来,创建一个 DataLakeServiceClient 实例并传入 DefaultAzureCredential 类的新实例。
function GetDataLakeServiceClientAD(accountName) {
const dataLakeServiceClient = new DataLakeServiceClient(
`https://${accountName}.dfs.core.chinacloudapi.cn`,
new DefaultAzureCredential()
);
return dataLakeServiceClient;
}
要详细了解如何使用 DefaultAzureCredential
授权访问数据,请参阅概述:使用 Azure SDK 向 Azure 验证 JavaScript 应用的身份。
获取并设置目录 ACL
此示例获取并设置名为 my-directory
的目录的 ACL。 此示例为拥有用户提供读取、写入和执行权限,为拥有组授予读取和执行权限,并为所有其他用户提供读取访问权限。
注意
如果你的应用程序通过使用 Microsoft Entra ID 来授予访问权限,请确保已向应用程序用来授权访问的安全主体分配了存储 Blob 数据所有者角色。 若要了解有关如何应用 ACL 权限以及更改 ACL 权限的影响的详细信息,请参阅 Azure Data Lake Storage 中的访问控制。
async function ManageDirectoryACLs(fileSystemClient) {
const directoryClient = fileSystemClient.getDirectoryClient("my-directory");
const permissions = await directoryClient.getAccessControl();
console.log(permissions.acl);
const acl = [
{
accessControlType: "user",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: true,
execute: true
}
},
{
accessControlType: "group",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: false,
execute: true
}
},
{
accessControlType: "other",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: true,
execute: false
}
}
];
await directoryClient.setAccessControl(acl);
}
还可以获取和设置容器根目录的 ACL。 若要获取根目录,请将空字符串 (/
) 传递到“DataLakeFileSystemClient.getDirectoryClient”方法。
获取并设置文件 ACL
此示例获取并设置名为 upload-file.txt
的文件的 ACL。 此示例为拥有用户提供读取、写入和执行权限,为拥有组授予读取和执行权限,并为所有其他用户提供读取访问权限。
注意
如果你的应用程序通过使用 Microsoft Entra ID 来授予访问权限,请确保已向应用程序用来授权访问的安全主体分配了存储 Blob 数据所有者角色。 若要了解有关如何应用 ACL 权限以及更改 ACL 权限的影响的详细信息,请参阅 Azure Data Lake Storage 中的访问控制。
async function ManageFileACLs(fileSystemClient) {
const fileClient = fileSystemClient.getFileClient("my-directory/uploaded-file.txt");
const permissions = await fileClient.getAccessControl();
console.log(permissions.acl);
const acl = [
{
accessControlType: "user",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: true,
execute: true
}
},
{
accessControlType: "group",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: false,
execute: true
}
},
{
accessControlType: "other",
entityId: "",
defaultScope: false,
permissions: {
read: true,
write: true,
execute: false
}
}
];
await fileClient.setAccessControl(acl);
}