使用 Node.js 中的 JavaScript SDK 设置 Azure Data Lake Storage Gen2 中的 ACL

本文介绍如何使用 Node.js 来获取、设置和更新目录与文件的访问控制列表。

包(节点包管理器)” | ”示例” | ”提供反馈

先决条件

  • Azure 订阅。 有关详细信息,请参阅获取 Azure 试用版

  • 已启用分层命名空间 (HNS) 的存储帐户。 按这些说明创建一个。

  • Azure CLI 版本 2.6.0 或更高版本。

  • 以下安全权限之一:

    • 一个预配的 Microsoft Entra ID 安全主体,它已分配有存储 Blob 数据所有者角色,并且作用域限定为目标容器、存储帐户、父资源组或订阅。

    • 计划将 ACL 设置应用到的目标容器或目录的拥有用户。 为了以递归方式设置 ACL,这包括目标容器或目录中的所有子项。

    • 存储帐户密钥。

设置项目

打开一个终端窗口,然后键入以下命令来安装适用于 JavaScript 的 Data Lake 客户端库。

npm install @azure/storage-file-datalake

将此语句放置在代码文件的顶部,以导入 storage-file-datalake 包。

const {
AzureStorageDataLake,
DataLakeServiceClient,
StorageSharedKeyCredential
} = require("@azure/storage-file-datalake");

连接到帐户

若要使用本文中的代码片段,需创建一个表示存储帐户的 DataLakeServiceClient 实例。

使用 Microsoft Entra ID 进行连接

注意

如果使用 Microsoft Entra ID 来授予访问权限,请确保已为安全主体分配了存储 Blob 数据所有者角色。 若要详细了解如何应用 ACL 权限以及更改这些权限的影响,请参阅 Azure Data Lake Storage Gen2 中的访问控制模型

可以使用适用于 JS 的 Azure 标识客户端库,通过 Microsoft Entra ID 对应用程序进行身份验证。

首先,你必须为安全主体分配以下 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 应用的身份

使用帐户密钥进行连接

可以使用帐户访问密钥(共享密钥)授权访问数据。 此示例将创建使用帐户密钥授权的 DataLakeServiceClient 实例。


function GetDataLakeServiceClient(accountName, accountKey) {

  const sharedKeyCredential =
     new StorageSharedKeyCredential(accountName, accountKey);

  const dataLakeServiceClient = new DataLakeServiceClient(
      `https://${accountName}.dfs.core.chinacloudapi.cn`, sharedKeyCredential);

  return dataLakeServiceClient;
}

注意

不建议使用共享密钥进行授权,因为它可能不太安全。 为获得最佳安全性,请禁用存储帐户的共享密钥授权,如阻止对 Azure 存储帐户进行共享密钥授权中所述。

对访问密钥和连接字符串的使用应限于不访问生产数据或敏感数据的初始概念证明应用或开发原型。 否则,在向 Azure 资源进行身份验证时,应始终优先使用 Azure SDK 中提供的基于令牌的身份验证类。

Azure 建议客户端使用 Microsoft Entra ID 或共享访问签名 (SAS) 来授权访问 Azure 存储中的数据。 要了解详细信息,请参阅授权数据访问操作

获取并设置目录 ACL

此示例获取并设置名为 my-directory 的目录的 ACL。 此示例为拥有用户提供读取、写入和执行权限,为拥有组授予读取和执行权限,并为所有其他用户提供读取访问权限。

注意

如果你的应用程序通过使用 Microsoft Entra ID 来授予访问权限,请确保已向应用程序用来授权访问的安全主体分配了存储 Blob 数据所有者角色。 若要详细了解如何应用 ACL 权限以及更改这些权限的影响,请参阅 Azure Data Lake Storage Gen2 中的访问控制

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 权限以及更改这些权限的影响,请参阅 Azure Data Lake Storage Gen2 中的访问控制

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);
}

另请参阅