java - 如何使用setAccessPolicy更改Azure中Blob的公共(public)访问级别

标签 java azure azure-blob-storage azure-java-sdk

如何更改Blob访问策略?

目前,我可以使用azure quick start创建一些测试Blob。这很好用,但在我的情况下,默认情况下,blob的公共访问级别为private。我想将公共访问级别从私有(无匿名访问)设置为Blob(仅对Blob具有匿名读取访问权限)。

我做了一些尝试和错误,发现setAccessPolicy可以帮助我。我想实现此功能,但我不完全理解.setPermissions("permissionString")。我是否需要将其更改为“仅对Blob进行匿名读取访问”之类的信息?

我的尝试和错误代码:

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")设置不正确的缘故。

异常stacktrace:

线程“主”中的异常com.azure.storage.blob.models.BlobStorageException:状态代码400,“指定的InvalidXmlDocument XML在语法上无效。
申请编号:74403433-a01e-0086-17c1-1727cd000000
时间: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)
    在react.netty.channel.FluxReceive.terminateReceiver(FluxReceive.java:419)
    在react.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:209)
    在react.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:367)
    在react.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:363)
    在react.netty.channel.ChannelOperations.terminate(ChannelOperations.java:412)
    在react.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:585)
    在react.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.processSelectedKeysOptimized(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设置公共访问权限)都将非常有用。

最佳答案

适用于Blob容器的权限在here中定义。

根据您希望包含在访问策略中的权限,可以从以下一种或多种权限中进行选择:Read (r)Add (a)Create (c)Write (w)Delete (d)List (l)

请注意,这些权限的顺序很重要。他们必须遵循以下顺序:racwdl

还要注意,在共享访问策略中指定权限是可选的,因此您也可以将权限字符串保留为空。

关于java - 如何使用setAccessPolicy更改Azure中Blob的公共(public)访问级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61341055/

相关文章:

java - 为什么声明相似的对象名和HashMap没有冲突?

java - 同步和并发集合如何是线程安全的,但它们的内容不是

azure - VS Code Azure 扩展 : Infinite loading loop

c# - 在 Azure Function 应用程序设置中使用数组

azure - 使用 azure 数据工厂 v2 一次将一个文件从一个容器复制到另一个容器

java - Webapp 在 Eclipse 中运行,但在 Eclipse 外部直接从 Tomcat 运行时出现 404 错误

azure - ARM 模板如何进行身份验证以使用 CI/CD 管道将资源部署到目标服务器?

python - 适用于 Python 的 Azure SDK : How to limit results in list_blobs()?

python - 将 azure blob 下载到本地文件系统时发生异常

java - Android - 自定义 ListView 的输出值 - 出现错误