使用 Java 创建帐户 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 的 Azure 存储客户端库创建帐户 SAS。

关于帐户 SAS

帐户 SAS 是在存储帐户级别创建的,并使用帐户访问密钥进行签名。 通过创建帐户 SAS,可以:

帐户 SAS 不支持存储访问策略。

设置项目

若要使用本文中的代码示例,请添加以下导入指令:

import com.azure.storage.blob.*;
import com.azure.storage.blob.models.*;
import com.azure.storage.blob.sas.*;
import com.azure.storage.common.sas.AccountSasPermission;
import com.azure.storage.common.sas.AccountSasResourceType;
import com.azure.storage.common.sas.AccountSasService;
import com.azure.storage.common.sas.AccountSasSignatureValues;

创建帐户 SAS

可以使用以下方法创建帐户 SAS 来委托对存储帐户资源的有限访问权限:

若要配置帐户 SAS 的签名值,请使用以下帮助程序类:

  • AccountSasPermission:表示 SAS 允许的权限。 在本示例中,我们将读取权限设置为 true
  • AccountSasService:表示 SAS 可访问的服务。 在本示例中,我们允许访问 Blob 服务。
  • AccountSasResourceType:表示 SAS 可访问的资源类型。 在本示例中,我们允许访问服务级别 API。

配置帮助程序类后,可以使用 AccountSasSignatureValues 实例初始化 SAS 的参数。

下面的代码示例演示了如何配置 SAS 参数并调用 generateAccountSas 方法来获取帐户 SAS:

public String createAccountSAS(BlobServiceClient blobServiceClient) {
    // Configure the SAS parameters
    OffsetDateTime expiryTime = OffsetDateTime.now().plusDays(1);
    AccountSasPermission accountSasPermission = new AccountSasPermission()
            .setReadPermission(true);
    AccountSasService services = new AccountSasService()
            .setBlobAccess(true);
    AccountSasResourceType resourceTypes = new AccountSasResourceType()
            .setService(true);

    // Generate the account SAS
    AccountSasSignatureValues accountSasValues = new AccountSasSignatureValues(
        expiryTime,
        accountSasPermission,
        services,
        resourceTypes);
    String sasToken = blobServiceClient.generateAccountSas(accountSasValues);

    return sasToken;
}

通过客户端使用帐户 SAS

以下代码示例显示了如何使用在较早的示例中创建的帐户 SAS 来授权 BlobServiceClient 对象。 然后,可以根据 SAS 授予的权限,使用此客户端访问服务级别 API。

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

// Create a SAS token
String sasToken = createAccountSAS(blobServiceClient);

// Create a new BlobServiceClient using the SAS token
BlobServiceClient sasServiceClient = new BlobServiceClientBuilder()
        .endpoint(blobServiceClient.getAccountUrl())
        .sasToken(sasToken)
        .buildClient();

如果向这些资源类型授予了作为签名值的一部分的访问权限,则还可以使用帐户 SAS 来授权和处理 BlobContainerClient 对象或 BlobClient 对象。

资源

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

代码示例

客户端库资源

另请参阅