使用 Java 为容器或 Blob 创建服务 SAS

使用共享访问签名 (SAS),可以授予对存储帐户中容器和 blob 的有限访问权限。 创建 SAS 时,需要指定其约束条件,包括允许客户端访问哪些 Azure 存储资源、它们对这些资源具有哪些权限,以及 SAS 的有效期。

每个 SAS 均使用密钥进行签名。 可通过以下两种方式之一对 SAS 进行签名:

  • 使用通过 Microsoft Entra 凭据创建的密钥。 使用 Microsoft Entra 凭据签名的 SAS 是用户委托 SAS。 必须为创建用户委托 SAS 的客户端分配一个 Azure RBAC 角色,该角色包括 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作。 若要了解详细信息,请参阅创建用户委托 SAS
  • 使用存储帐户密钥。 服务 SAS 和帐户 SAS 均使用存储帐户密钥进行签名。 创建服务 SAS 的客户端必须具有对帐户密钥的直接访问权限,或分配有 Microsoft.Storage/storageAccounts/listkeys/action 权限。 若要了解详细信息,请参阅创建服务 SAS创建帐户 SAS

注意

用户委托 SAS 为使用存储帐户密钥签名的 SAS 提供更高的安全性。 Microsoft 建议尽可能使用用户委托 SAS。 有关详细信息,请参阅向具有共享访问签名的数据授予有限的访问权限 (SAS)

本文介绍了如何使用存储帐户密钥,通过适用于 Java 的 Blob 存储客户端库为容器或 Blob 创建服务 SAS。

关于服务 SAS

服务 SAS 将使用帐户访问密钥进行签名。 可以使用 StorageSharedKeyCredential 类创建用于为服务 SAS 签名的凭据。

还可以使用存储访问策略来定义 SAS 的权限和持续时间。 如果提供现有存储访问策略的名称,则该策略与 SAS 关联。 若要详细了解存储访问策略,请参阅定义存储访问策略。 如果未提供存储访问策略,可通过本文中的代码示例来了解如何定义 SAS 的权限和持续时间。

创建服务 SAS

可以根据应用的需求为容器或 Blob 创建服务 SAS。

可以使用以下方法创建服务 SAS,以委派对容器资源的有限访问权限:

SAS 签名值(如过期时间和已签名权限)作为 BlobServiceSasSignatureValues 实例的一部分传递给 该方法。 权限指定为 BlobContainerSasPermission 实例。

以下代码示例显示了如何为容器资源创建具有读取权限的服务 SAS:

public String createServiceSASContainer(BlobContainerClient containerClient) {
    // Create a SAS token that's valid for 1 day, as an example
    OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);

    // Assign read permissions to the SAS token
    BlobContainerSasPermission sasPermission = new BlobContainerSasPermission()
            .setReadPermission(true);

    BlobServiceSasSignatureValues sasSignatureValues = new BlobServiceSasSignatureValues(expiryTime, sasPermission)
            .setStartTime(OffsetDateTime.now().minusMinutes(5));

    String sasToken = containerClient.generateSas(sasSignatureValues);
    return sasToken;
}

使用服务 SAS 为客户端对象授权

可以使用服务 SAS 来根据 SAS 授予的权限授权客户端对象对容器或 Blob 执行操作。

以下代码示例演示如何使用服务 SAS 授权 BlobContainerClient 对象。 此客户端对象可用于根据 SAS 授予的权限对容器资源执行操作。

首先,创建使用帐户访问密钥签名的 BlobServiceClient 对象:

String accountName = "<account-name>";
String accountKey = "<account-key>";
StorageSharedKeyCredential credential = new StorageSharedKeyCredential(accountName, accountKey);
        
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
        .endpoint(String.format("https://%s.blob.core.chinacloudapi.cn/", accountName))
        .credential(credential)
        .buildClient();

然后,如前面的例子所示,生成服务 SAS,并使用 SAS 授权 BlobContainerClient 对象:

// Create a SAS token
BlobContainerClient containerClient = blobServiceClient
        .getBlobContainerClient("sample-container");
String sasToken = createServiceSASContainer(containerClient);

// Create a new BlobContainerClient using the SAS token
BlobContainerClient sasContainerClient = new BlobContainerClientBuilder()
        .endpoint(containerClient.getBlobContainerUrl())
        .sasToken(sasToken)
        .buildClient();

资源

若要详细了解如何使用适用于 Java 的 Azure Blob 存储客户端库,请参阅以下资源。

代码示例

客户端库资源

另请参阅