Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从s3 java SDK创建时,s3对象未应用正确的权限_Java_Amazon Web Services_Amazon S3 - Fatal编程技术网

从s3 java SDK创建时,s3对象未应用正确的权限

从s3 java SDK创建时,s3对象未应用正确的权限,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,我有一个java/playframework应用程序,它使用以下代码将文件放入定义的S3存储桶: PutObjectRequest putObjectRequest = new PutObjectRequest(s3Bucket, filePath, file); putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead); amazonS3.putObject(putObjectRequest);

我有一个java/playframework应用程序,它使用以下代码将文件放入定义的S3存储桶:

    PutObjectRequest putObjectRequest = new PutObjectRequest(s3Bucket, filePath, file);
    putObjectRequest.withCannedAcl(CannedAccessControlList.PublicRead);
    amazonS3.putObject(putObjectRequest);
(其中s3Bucket和filePath是字符串,file是file类型。)

这很好(对象以正确的名称到达正确的bucket等),并且通过声明cannedaccesscontroller.PublicRead,我希望它能够公开可读(public没有查看/编辑权限)

但是,bucket中的对象具有被授权人“任何经过身份验证的AWS用户”的打开/下载权限。当我设置CannedAccessController.AuthenticatedRead时,我希望这是权限,但不是PublicRead

声明任何省略AWS密钥和签名的用户都可以访问。也许我误解了。我可以将单个对象的权限“打开/下载”给“所有人”,当我在浏览器中输入对象URL时,这种权限非常有效。这也是我读过之后的想法


因此,我的问题是:我是否可以通过Java SDK将S3对象放入一个存储桶中,并授予其公共读取权限,这意味着可以通过其url访问该文件?

如果您的整个存储桶都是公共的,您可以定义一个存储桶策略,以使所有新上载的文件公开:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[bucket-name]/*"
        }
    ]
}

转到您的bucket,单击属性,然后单击权限。应该有添加或编辑bucket策略的选项。

这取决于您如何制定策略

看看这个:

因此,对于违约:

创建bucket或对象时,AmazonS3会创建默认ACL 授予资源所有者对资源的完全控制权

还有这个

如果要管理某个应用程序中单个对象的权限 bucket、S3 ACL使您能够对对象本身应用策略

而否定总是特朗普所允许的

如果没有方法指定允许,则请求将被拒绝 违约仅当没有方法指定拒绝和一个或多个方法时 指定将允许该请求的允许值

因此,受限制的存储桶策略可能会胜过您的ACL PublicRead。尝试添加此allow all和attach to bucket权限,看看会发生什么

{
    "Version": "2012-10-17",
    "Id": "allowall",
    "Statement": [
        {
            "Sid": "AllowAllForRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/*"
            ]
        }
    ]
}

我错了——我发现了问题所在,是我在没有正确分析的情况下使用的代码。在从java SDK调用amazon.putObject之前定义了以下函数:

public static String S3putFile(File file, String bucketName, String key, CannedAccessControlList accessControlList) throws IOException {
    if(file == null) {
        throw new NullPointerException("file must not be null");
    } else if(bucketName == null || key == null) {
        throw new NullPointerException("Object parameters (bucketName / key) must not be null");
    } else {
        PutObjectRequest putObjectRequest = new PutObjectRequest(s3Bucket, key, file);
        //putObjectRequest.withCannedAcl(accessControlList.AuthenticatedRead);
        putObjectRequest.withCannedAcl(accessControlList);
        amazonS3.putObject(putObjectRequest);

        return key;
    }
}
您可以在ELSE子句中看到注释行-参数化的CannedAccessController对象的属性被.AuthenticatedRead覆盖,无论函数调用期间给出了哪个属性

所以最后,一切都做了它应该做的;通过注释.withCannedAcl(AuthRead)行并用accessControlList对象填充putObjectRequest来替换它,一切都会正常工作。“每个人”都可以阅读该文件


无论如何,感谢您提供的桶政策等方面的线索-非常抱歉让您去做傻事

S3 bucket是否附加了任何bucket策略?'with'方法用于链接,如下所示:PutObjectRequest PutObjectRequest=new PutObjectRequest(s3Bucket、文件路径、文件)。withCannedAcl(CanneDaccessController.PublicRead);通过运行:AWSS3put--acl public read--bucket x--key y--body“xxxxx”,测试与AWSCLI的等价项。这很有意义。我猜“Action”应该是“s3:PutObject”,因为权限在put请求而不是get请求期间被否决了?@konrad_pe:我认为在这种情况下,您需要一些明确的规则。一个带有“条件”的规则,明确允许你的应用程序使用PutObject,这是另一个让每个人都可以获取Object的规则。因为你们不希望任何人将文件上传到你们的回购协议,特别是利用你们的“免费”存储库的黑帽黑客。请运行IAM模拟器来测试所有内容。我不希望所有文件都在bucket public中,而只是那些在某个“文件夹”中的文件(以某个前缀开头,如f.e./assets/public)。所以“资源”的值应该是“arn:aws:s3::myBucket/assets/public/*”。。。?谢谢@konrad_pe您是否确保附加到试图放置对象的用户或角色的策略在该bucket中具有putObjectAcl权限?