0

我正在开发一个 Java 应用程序,它使用 Account SAS(共享访问签名)URI 执行以下方法:

CLoudBlockBlob blob = container.getBlockBlobReference("tmp/test.json");
blob.exists();
blob.openInputStream();
blob.delete();
container.exists();
container.listBlobs().iterator().next();
container.getDirectoryReference("tmp/").listBlobs().iterator().next()

但是,我找不到生成单个帐户 SAS 以支持上面列出的所有方法的方法。

  1. 使用 SharedAccessAccountResourceType.OBJECT 生成的帐户 SAS:

成功执行:

CLoudBlockBlob blob = container.getBlockBlobReference("tmp/test.json");
blob.exists();
blob.openInputStream();
blob.delete();

失败并显示错误代码:AuthorizationResourceTypeMismatch

container.exists();
container.listBlobs().iterator().next();
container.getDirectoryReference("tmp/").listBlobs().iterator().next()
  1. 使用 SharedAccessAccountResourceType.CONTAINER 生成的帐户 SAS:

成功执行:

container.exists();
container.listBlobs().iterator().next();
container.getDirectoryReference("tmp/").listBlobs().iterator().next()

失败并显示错误代码:AuthorizationResourceTypeMismatch

CLoudBlockBlob blob = container.getBlockBlobReference("tmp/test.json");
blob.exists();
blob.openInputStream();
blob.delete();
  1. 使用 SharedAccessAccountResourceType.SERVICE 生成的帐户 SAS 失败并显示错误代码:上述所有方法的 AuthorizationResourceTypeMismatch。

有没有办法生成适用于以下所有方法的单个帐户 SAS?

CLoudBlockBlob blob = container.getBlockBlobReference("tmp/test.json");
blob.exists();
blob.openInputStream();
blob.delete();
container.exists();
container.listBlobs().iterator().next();
container.getDirectoryReference("tmp/").listBlobs().iterator().next()
4

3 回答 3

0

对于listing blobsblob 容器,您需要设置resource typeContainer. 您需要的许可是List.

对于checking if blob exists,您需要设置resource typeObject。您需要的许可是Read.

对于deleting blob,您需要将权限设置为Delete。资源类型仍然是Object.

由于您仅使用 Blob 存储,因此service type将只是Blob.

总结一下:

  • 服务类型:Blob
  • 资源类型:容器(用于列出 blob)和对象(用于检查 blob 的存在和删除 blob)
  • 权限:列出、读取和删除

有了这个,你应该能够实现你的目标。

于 2019-08-08T04:38:57.080 回答
0

是的,只需在 blob 和容器资源上添加正确的权限。请注意,列表与创建不同。

你可以在这里找到它

在此处输入图像描述

然后添加权限

在此处输入图像描述

于 2019-08-07T23:24:59.727 回答
0

设置这两种资源类型解决了这个问题:

sasAccountPolicy.setResourceTypes(EnumSet.of(SharedAccessAccountResourceType.OBJECT, SharedAccessAccountResourceType.CONTAINER));

(我正在开发的应用程序也必须生成 SAS URI。)

谢谢。

于 2019-08-08T20:44:39.183 回答