使用 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 的权限和持续时间。

为 blob 创建服务 SAS

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

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

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

public String createServiceSASBlob(BlobClient blobClient) {
    // 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
    BlobSasPermission sasPermission = new BlobSasPermission()
            .setReadPermission(true);

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

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

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

以下代码示例显示了如何使用在较早的示例中创建的服务 SAS 来授权 BlobClient 对象。 此客户端对象可用于根据 SAS 授予的权限对 blob 资源执行操作。

首先,创建使用帐户访问密钥签名的 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 授权 BlobClient 对象:

// Create a SAS token
BlobClient blobClient = blobServiceClient
        .getBlobContainerClient("sample-container")
        .getBlobClient("sample-blob.txt");
String sasToken = createServiceSASBlob(blobClient);

// Create a new BlobClient using the SAS token
BlobClient sasBlobClient = new BlobClientBuilder()
        .endpoint(blobClient.getBlobUrl())
        .sasToken(sasToken)
        .buildClient();

资源

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

客户端库资源

另请参阅