如何使用 setAccessPolicy 更改 Azure 中 blob 的 public 访问级别
How to change the public access level of a blob in Azure using setAccessPolicy
如何更改 blob 访问策略?
目前我可以使用 azure quick start 创建一些测试 blob。这很好用,但在我的例子中,blob 默认具有 public 私有访问级别。我想将 public 访问级别从 Private(无匿名访问)设置为 Blob(仅限 blob 的匿名读取访问)。
我做了一些尝试和错误,我发现 setAccessPolicy 可以帮助我。我想实现这个,但我不完全理解 .setPermissions("permissionString")
。我需要将其更改为 "anonymous read access for blobs only" 还是我遗漏了什么?
我的尝试和错误代码:
public static void main( String[] args ) throws IOException
{
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(connectionString).buildClient();
String containerName = "testblobs"+ UUID.randomUUID();
BlobSignedIdentifier identifier = new BlobSignedIdentifier()
.setId("name")
.setAccessPolicy(new BlobAccessPolicy()
.setStartsOn(OffsetDateTime.now())
.setExpiresOn(OffsetDateTime.now().plusDays(1))
.setPermissions("permissionString")); //what should I put here?
BlobContainerClient containerClient = blobServiceClient.createBlobContainer(containerName);
try {
containerClient.setAccessPolicy(PublicAccessType.CONTAINER, Collections.singletonList(identifier));
System.out.println("Set Access Policy to 'Public read access for blobs only'.");
} catch (UnsupportedOperationException err) {
System.out.printf("Set Access Policy failed because: %s\n", err);
}
String localPath = "pathtofile";
String fileName = "myfile.bpmn";
File localFile = new File(localPath+fileName);
BlobClient blobClient = containerClient.getBlobClient(fileName);
System.out.println("\nUploading to Blob storage as blob:\n\t" + blobClient.getBlobUrl());
blobClient.uploadFromFile(localPath + fileName);
System.out.println("\nListing da blobs...");
for (BlobItem blobItem : containerClient.listBlobs()) {
System.out.println();
System.out.println("\t" + blobItem.getName());
}
}
当我 运行 这段代码时,它会抛出以下异常,我认为这是因为 .setPermissions("permissionString")
设置不正确。
异常堆栈跟踪:
线程 "main" com.azure.storage.blob.models.BlobStorageException 中的异常:状态代码 400,“指定的 InvalidXmlDocument
XML 在语法上无效。
RequestId:74403433-a01e-0086-17c1-1727cd000000
Time:2020-04-21T09:43:11.5943935Z00"
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在 java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
在 java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
在 com.azure.core.http.rest.RestProxy.instantiateUnexpectedException(RestProxy.java:357)
在 com.azure.core.http.rest.RestProxy.lambda$ensureExpectedStatus$3(RestProxy.java:398)
在 reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:118)
在 reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1705)
在 reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.signalCached(MonoCacheTime.java:320)
在 reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.onNext(MonoCacheTime.java:337)
在 reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2267)
在 reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.onSubscribe(MonoCacheTime.java:276)
在 reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:191)
在 reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53)
在 reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:48)
在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
在 reactor.core.publisher.MonoCacheTime.subscribeOrReturn(MonoCacheTime.java:132)
在 reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:48)
在 reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
在 reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onNext(FluxDoFinally.java:123)
在 reactor.core.publisher.FluxHandle$HandleSubscriber.onNext(FluxHandle.java:112)
在 reactor.core.publisher.FluxMap$MapConditionalSubscriber.onNext(FluxMap.java:213)
在 reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onNext(FluxDoFinally.java:123)
在 reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.onNext(FluxHandleFuseable.java:178)
在 reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext(FluxContextStart.java:103)
在 reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1705)
在 reactor.core.publisher.MonoCollectList$MonoCollectListSubscriber.onComplete(MonoCollectList.java:121)
在 reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:252)
在 reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)
在 reactor.netty.channel.FluxReceive.terminateReceiver(FluxReceive.java:419)
在 reactor.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:209)
在 reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:367)
在 reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:363)
在 reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:412)
在 reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:585)
在 reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:90)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)
在 io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
在 io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:321)
在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:295)
在 io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)
在 io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1470)
在 io.netty.handler.ssl.SslHandler.decodeNonJdkCompatible(SslHandler.java:1231)
在 io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1268)
在 io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:498)
在 io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:437)
在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)
在 io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
在 io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
在 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
在 io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
在 io.netty.channel.nio.NioEventLoop.processSelectedKeys 优化(NioEventLoop.java:650)
在 io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
在 io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
在 io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
在 io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
在 io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
在 java.base/java.lang.Thread.run(Thread.java:834)
抑制:java.lang.Exception:#block 因错误而终止
在 reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
在 reactor.core.publisher.Mono.block(Mono.java:1664)
在 com.azure.storage.common.implementation.StorageImplUtils.blockWithOptionalTimeout(StorageImplUtils.java:99)
在 com.azure.storage.blob.BlobContainerClient.setAccessPolicyWithResponse(BlobContainerClient.java:416)
在 com.azure.storage.blob.BlobContainerClient.setAccessPolicy(BlobContainerClient.java:386)
在 Main.main(Main.java:33)
如果能通过一些代码示例向我解释 .setPermissions("permissionString")
如何为 blob 设置 public 访问权限,那将是非常好的。
适用于 blob 容器的权限已定义 here
。
根据您希望包含在访问策略中的权限,您可以选择以下一项或多项权限:Read (r)
、Add (a)
、Create (c)
、Write (w)
、Delete (d)
和 List (l)
。
请注意,这些权限的排序很重要。他们必须遵循以下顺序:racwdl
.
另请注意,在共享访问策略中指定权限是可选的,因此您也可以将权限字符串留空。
如何更改 blob 访问策略?
目前我可以使用 azure quick start 创建一些测试 blob。这很好用,但在我的例子中,blob 默认具有 public 私有访问级别。我想将 public 访问级别从 Private(无匿名访问)设置为 Blob(仅限 blob 的匿名读取访问)。
我做了一些尝试和错误,我发现 setAccessPolicy 可以帮助我。我想实现这个,但我不完全理解 .setPermissions("permissionString")
。我需要将其更改为 "anonymous read access for blobs only" 还是我遗漏了什么?
我的尝试和错误代码:
public static void main( String[] args ) throws IOException
{
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(connectionString).buildClient();
String containerName = "testblobs"+ UUID.randomUUID();
BlobSignedIdentifier identifier = new BlobSignedIdentifier()
.setId("name")
.setAccessPolicy(new BlobAccessPolicy()
.setStartsOn(OffsetDateTime.now())
.setExpiresOn(OffsetDateTime.now().plusDays(1))
.setPermissions("permissionString")); //what should I put here?
BlobContainerClient containerClient = blobServiceClient.createBlobContainer(containerName);
try {
containerClient.setAccessPolicy(PublicAccessType.CONTAINER, Collections.singletonList(identifier));
System.out.println("Set Access Policy to 'Public read access for blobs only'.");
} catch (UnsupportedOperationException err) {
System.out.printf("Set Access Policy failed because: %s\n", err);
}
String localPath = "pathtofile";
String fileName = "myfile.bpmn";
File localFile = new File(localPath+fileName);
BlobClient blobClient = containerClient.getBlobClient(fileName);
System.out.println("\nUploading to Blob storage as blob:\n\t" + blobClient.getBlobUrl());
blobClient.uploadFromFile(localPath + fileName);
System.out.println("\nListing da blobs...");
for (BlobItem blobItem : containerClient.listBlobs()) {
System.out.println();
System.out.println("\t" + blobItem.getName());
}
}
当我 运行 这段代码时,它会抛出以下异常,我认为这是因为 .setPermissions("permissionString")
设置不正确。
异常堆栈跟踪:
线程 "main" com.azure.storage.blob.models.BlobStorageException 中的异常:状态代码 400,“指定的 InvalidXmlDocument
XML 在语法上无效。
RequestId:74403433-a01e-0086-17c1-1727cd000000
Time:2020-04-21T09:43:11.5943935Z00"
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在 java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
在 java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
在 com.azure.core.http.rest.RestProxy.instantiateUnexpectedException(RestProxy.java:357)
在 com.azure.core.http.rest.RestProxy.lambda$ensureExpectedStatus$3(RestProxy.java:398)
在 reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:118)
在 reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1705)
在 reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.signalCached(MonoCacheTime.java:320)
在 reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.onNext(MonoCacheTime.java:337)
在 reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2267)
在 reactor.core.publisher.MonoCacheTime$CoordinatorSubscriber.onSubscribe(MonoCacheTime.java:276)
在 reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:191)
在 reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53)
在 reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:48)
在 reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
在 reactor.core.publisher.MonoCacheTime.subscribeOrReturn(MonoCacheTime.java:132)
在 reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:48)
在 reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
在 reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onNext(FluxDoFinally.java:123)
在 reactor.core.publisher.FluxHandle$HandleSubscriber.onNext(FluxHandle.java:112)
在 reactor.core.publisher.FluxMap$MapConditionalSubscriber.onNext(FluxMap.java:213)
在 reactor.core.publisher.FluxDoFinally$DoFinallySubscriber.onNext(FluxDoFinally.java:123)
在 reactor.core.publisher.FluxHandleFuseable$HandleFuseableSubscriber.onNext(FluxHandleFuseable.java:178)
在 reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext(FluxContextStart.java:103)
在 reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1705)
在 reactor.core.publisher.MonoCollectList$MonoCollectListSubscriber.onComplete(MonoCollectList.java:121)
在 reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:252)
在 reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)
在 reactor.netty.channel.FluxReceive.terminateReceiver(FluxReceive.java:419)
在 reactor.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:209)
在 reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:367)
在 reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:363)
在 reactor.netty.channel.ChannelOperations.terminate(ChannelOperations.java:412)
在 reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:585)
在 reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:90)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)
在 io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436)
在 io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:321)
在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:295)
在 io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)
在 io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1470)
在 io.netty.handler.ssl.SslHandler.decodeNonJdkCompatible(SslHandler.java:1231)
在 io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1268)
在 io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:498)
在 io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:437)
在 io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
在 io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355)
在 io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:377)
在 io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363)
在 io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919)
在 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
在 io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714)
在 io.netty.channel.nio.NioEventLoop.processSelectedKeys 优化(NioEventLoop.java:650)
在 io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576)
在 io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493)
在 io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989)
在 io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
在 io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
在 java.base/java.lang.Thread.run(Thread.java:834)
抑制:java.lang.Exception:#block 因错误而终止
在 reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:99)
在 reactor.core.publisher.Mono.block(Mono.java:1664)
在 com.azure.storage.common.implementation.StorageImplUtils.blockWithOptionalTimeout(StorageImplUtils.java:99)
在 com.azure.storage.blob.BlobContainerClient.setAccessPolicyWithResponse(BlobContainerClient.java:416)
在 com.azure.storage.blob.BlobContainerClient.setAccessPolicy(BlobContainerClient.java:386)
在 Main.main(Main.java:33)
如果能通过一些代码示例向我解释 .setPermissions("permissionString")
如何为 blob 设置 public 访问权限,那将是非常好的。
适用于 blob 容器的权限已定义 here
。
根据您希望包含在访问策略中的权限,您可以选择以下一项或多项权限:Read (r)
、Add (a)
、Create (c)
、Write (w)
、Delete (d)
和 List (l)
。
请注意,这些权限的排序很重要。他们必须遵循以下顺序:racwdl
.
另请注意,在共享访问策略中指定权限是可选的,因此您也可以将权限字符串留空。