使用 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 当前不可用的服务级别操作的访问权限,例如获取 Blob 服务属性、设置 Blob 服务属性和获取 Blob 服务统计信息。
- 一次性委托对存储帐户中多个服务的访问权限。 例如,可以使用帐户 SAS 委托对 Azure Blob 存储和 Azure 文件存储中的资源的访问权限。
帐户 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,请参阅以下资源。