你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 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.windows.net`,
      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);
}

另请参阅