azure 如何使用容器级SAS代替账户级SAS获取CloudBlobContainer对象

llmtgqce  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(141)

下面的代码使用blob存储端点、SAS和两个不同容器的名称(CONTAINER_1_NAME、CONTAINER_2_NAME)来获取两个“CloudBlobContainer”对象的引用(私有属性:'container1'和'container2')。在这种方法中,我使用的是“帐户级SAS”。但是,我们也可以使用Azure门户创建容器级SAS(我们甚至可以使用容器级SAS的存储访问策略,但目前不能使用帐户级SAS)。
我的问题是,如何更改此代码,使其使用“容器级SAS”(而不是帐户级SAS)?最终我需要获得两个“CloudBlobContainer”对象('container1'和'container2')。
产品编号:

CloudStorageAccount storage = null;
        try {
            this.BLOB_STORAGE_ENDPOINT = blobstorageConnection.getEndpoint();
            String SAS = blobstorageConnection.getSas();
            this.CONTAINER_1_NAME = blobstorageConnection.getContainer1Name();
            this.CONTAINER_2_NAME = blobstorageConnection.getContainer2Name();

            String SASBasedConnectionString = "BlobEndpoint=" + BLOB_STORAGE_ENDPOINT + ";SharedAccessSignature=" + SAS;
            storage = CloudStorageAccount.parse(SASBasedConnectionString);
            CloudBlobClient serviceClient = storage.createCloudBlobClient();
            this.container1 = serviceClient.getContainerReference(CONTAINER_1_NAME);
            this.container2 = serviceClient.getContainerReference(CONTAINER_2_NAME);
            container1.createIfNotExists();
            container2.createIfNotExists();
        } catch (URISyntaxException | InvalidKeyException | StorageException e) {
            throw new RuntimeException(e);
        }

注意事项:

  • 这里的“blobstorageConnection”是一个对象,它具有blob存储端点、SAS和两个不同容器的名称。
  • 我使用的依赖版本:
<dependency>    
   <groupId>com.microsoft.azure</groupId>    
   <artifactId>azure-storage</artifactId>    
   <version>8.6.6</version>
   </dependency>
  • Java版本:1.8版本1.8.0_362(另外请注意,由于特定原因,我无法升级此项目中的Java版本)

我在微软问答平台上问了同样的问题,得到了下面的答案。但是它给了我一个错误(请在答案下面找到它。)
来自Microsoft员工的答复:
要在代码中使用容器级SAS而不是帐户级SAS,您需要修改SASBasedConnectionString以包含每个容器的SAS令牌。以下是如何修改代码以使用容器级SAS的示例。
在此修改后的代码中,您需要向blobstorageConnection对象添加两个新属性:“container1Sas”和“container2Sas”。这些属性应包含每个容器的容器级SAS令牌。
然后,您需要修改SASBasedConnectionString以包含每个容器的SAS令牌和容器名称。最后,您需要为每个容器创建新的CloudStorageAccount对象和CloudBlobClient对象,并使用容器名称获取对容器的引用。

String SASBasedConnectionString = "BlobEndpoint=" + BLOB_STORAGE_ENDPOINT + ";";
SASBasedConnectionString += "SharedAccessSignature=" + CONTAINER_1_SAS + ";";
SASBasedConnectionString += "ContainerName=" + CONTAINER_1_NAME + ";";
storage = CloudStorageAccount.parse(SASBasedConnectionString);
CloudBlobClient serviceClient = storage.createCloudBlobClient();
this.container1 = serviceClient.getContainerReference(CONTAINER_1_NAME);
container1.createIfNotExists();

SASBasedConnectionString = "BlobEndpoint=" + BLOB_STORAGE_ENDPOINT + ";";
SASBasedConnectionString += "SharedAccessSignature=" + CONTAINER_2_SAS + ";";
SASBasedConnectionString += "ContainerName=" + CONTAINER_2_NAME + ";";
storage = CloudStorageAccount.parse(SASBasedConnectionString);
serviceClient = storage.createCloudBlobClient();
this.container2 = serviceClient.getContainerReference(CONTAINER_2_NAME);
container2.createIfNotExists();

我在实施上述解决方案后遇到的错误:

Exception in thread "main" java.lang.IllegalArgumentException: Invalid connection string.
    at com.microsoft.azure.storage.CloudStorageAccount.parse(CloudStorageAccount.java:290)
    at org.wso2.carbon.wum.ucreator.blobstorage.BlobStorageManager.<init>(BlobStorageManager.java:57)

注意:BlobStorageManager.java:57是以下行:

storage = CloudStorageAccount.parse(SASBasedConnectionString);
xggvc2p6

xggvc2p61#

我已经在我的环境中尝试了您的要求,我也得到了相同的连接字符串错误。

为了解决这个问题,我尝试添加***存储端点***。

**注意:**我使用了存储端点,但SAS令牌是容器级别的。

下面是我通过编写API来调用功能的代码。

@GetMapping("/getdata")
public String getData() throws URISyntaxException, StorageException {
        String sasToken = "<Container_level_SAS_Token>";
        String containerName = "<Your_Container_Name>";
        String accountName = "<Storage_Account_Name>";
        String endpoint = String.format("https://%s.blob.core.windows.net", accountName);
        StorageCredentials credentials = new StorageCredentialsSharedAccessSignature(sasToken);
        URI uri = new URI(endpoint);
        CloudBlobClient blobClient = new CloudBlobClient(uri, credentials);
        CloudBlobContainer container = blobClient.getContainerReference(containerName);

        return "My Container Name is " + container.getName();
    }

使用容器级SAS令牌,如下所示:

结果:

相关问题