当前位置: 首页 > 知识库问答 >
问题:

如何在默认情况下使AWS S3桶中的所有对象公开?

濮阳振海
2023-03-14

我正在使用一个PHP库将一个文件上传到我的bucket中。我已经将ACL设置为public read write,它可以正常工作,但文件仍然是私有的。

我发现如果我把被授权人改成所有人,文件就会公开。我想知道的是,如何将bucket中所有对象的默认grante设置为“Everyone”。或者有没有另一种默认公开文件的解决方案?

我使用的代码如下:

public static function putObject($input, $bucket, $uri, $acl = self::ACL_PRIVATE, $metaHeaders = array(), $requestHeaders = array()) {
    if ($input === false) return false;
    $rest = new S3Request('PUT', $bucket, $uri);

    if (is_string($input)) $input = array(
        'data' => $input, 'size' => strlen($input),
        'md5sum' => base64_encode(md5($input, true))
    );

    // Data
    if (isset($input['fp']))
        $rest->fp =& $input['fp'];
    elseif (isset($input['file']))
        $rest->fp = @fopen($input['file'], 'rb');
    elseif (isset($input['data']))
        $rest->data = $input['data'];

    // Content-Length (required)
    if (isset($input['size']) && $input['size'] >= 0)
        $rest->size = $input['size'];
    else {
        if (isset($input['file']))
            $rest->size = filesize($input['file']);
        elseif (isset($input['data']))
            $rest->size = strlen($input['data']);
    }

    // Custom request headers (Content-Type, Content-Disposition, Content-Encoding)
    if (is_array($requestHeaders))
        foreach ($requestHeaders as $h => $v) $rest->setHeader($h, $v);
    elseif (is_string($requestHeaders)) // Support for legacy contentType parameter
        $input['type'] = $requestHeaders;

    // Content-Type
    if (!isset($input['type'])) {
        if (isset($requestHeaders['Content-Type']))
            $input['type'] =& $requestHeaders['Content-Type'];
        elseif (isset($input['file']))
            $input['type'] = self::__getMimeType($input['file']);
        else
            $input['type'] = 'application/octet-stream';
    }

    // We need to post with Content-Length and Content-Type, MD5 is optional
    if ($rest->size >= 0 && ($rest->fp !== false || $rest->data !== false)) {
        $rest->setHeader('Content-Type', $input['type']);
        if (isset($input['md5sum'])) $rest->setHeader('Content-MD5', $input['md5sum']);

        $rest->setAmzHeader('x-amz-acl', $acl);
        foreach ($metaHeaders as $h => $v) $rest->setAmzHeader('x-amz-meta-'.$h, $v);
        $rest->getResponse();
    } else
        $rest->response->error = array('code' => 0, 'message' => 'Missing input parameters');

    if ($rest->response->error === false && $rest->response->code !== 200)
        $rest->response->error = array('code' => $rest->response->code, 'message' => 'Unexpected HTTP status');
    if ($rest->response->error !== false) {
        trigger_error(sprintf("S3::putObject(): [%s] %s", $rest->response->error['code'], $rest->response->error['message']), E_USER_WARNING);
        return false;
    }
    return true;
}

共有3个答案

甘学潞
2023-03-14

我的问题略有不同,但由于这个问题是在谷歌搜索的顶部,我会留下我的解决方案,也许它会帮助某人。

我之前已经拥有了对S3 bucket的完全访问权限,但有一天它刚刚开始返回对我所有文件的访问被拒绝。解决办法很简单。

  1. 转到服务-S3

它应该重新分配对所有文件的权限。

无论如何,这里有一个完整的桶策略,它允许将所有对象公开

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::enter-here-your-media-bucket-name/*"
        }
    ]
}

伏欣悦
2023-03-14

如果您想在默认情况下公开所有对象,最简单的方法是通过桶策略而不是在每个单独对象上定义的访问控制列表(ACL)来实现。

您可以使用AWS策略生成器为您的bucket生成bucket策略。

例如,以下策略将允许任何人读取S3存储桶中的每个对象(只需替换

{
  "Id": "Policy1380877762691",
  "Statement": [
    {
      "Sid": "Stmt1380877761162",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::<bucket-name>/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

Bucket策略包含一个语句列表,对于主体(用户)对指定的资源执行的操作列表,每个语句都具有效果(要么允许,要么拒绝)(由Amazon资源名ARN标识)。

Id只是可选的策略Id,Sid是可选的唯一语句Id。

对于S3桶策略,资源ARN采用以下形式:

arn:aws:s3:::<bucket_name>/<key_name>

上面的例子允许(效果:允许)任何人(主体:*)访问(操作: s3: GetObject)桶中的任何对象(资源: arn: aws: s3:::

解沈义
2023-03-14

复制文本示例:

{
  "Id": "Policy1397632521960",
  "Statement": [
    {
      "Sid": "Stmt1397633323327",
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucketnm/*",
      "Principal": {
        "AWS": [
          "*"
        ]
      }
    }
  ]
}

现在转到AWS S3控制台,在bucket级别,单击Properties,展开Permissions,然后选择AddBucket policy。将上面生成的代码粘贴到编辑器中,然后点击save。

默认情况下,桶中的所有项目都是公共的。

 类似资料:
  • 为什么引用类型对象o无法访问变量a。它显示错误a无法解决或不是字段。

  • 我有一个产品表 还有一个积垢积存器 当我调用endpoint /products默认情况下,我得到了所有产品的列表 我怎么能得到,调用默认endpoint /products,内部的json对象产品的相关对象太(Catefory,制造商...)? 谢啦

  • 问题内容: 我知道我可以用来将字符串字段设置为 特定新索引中的新字段 。 有没有办法将此设置 全局 应用-即为任何新索引中的任何字符串字段设置属性?(无需为每个新索引设置它) 问题答案: 是的,你可以通过创建一个实现这个指标模板上有一个映射类型和动态模板 然后,您可以在任何新索引中创建任何文档,并且所有字符串字段都将为 如果检查新创建的映射类型,则将看到该字段为

  • 问题内容: 我有一个定义结构的快速框架: 但是,我似乎无法从导入该库的另一个项目中使用隐式成员明智的初始化程序。错误是“ CollectionTO”无法初始化,因为它没有可访问的初始化程序。也就是说,它没有为默认的隐式成员明智的初始化程序提供public关键字。 我必须像这样添加自己的初始化方法: …但是我宁愿不知道是否还有其他人知道的方法? 问题答案: 引用手册: “结构类型的默认成员明智的初始

  • 我有一个定义结构的swft框架: 但是,我似乎无法使用另一个导入库的项目中的隐式成员初始值设定项。错误为“CollectionTO”无法初始化,因为它没有可访问的初始化器。i、 它没有给默认的隐式成员初始化器public关键字。 我必须像这样添加我自己的init方法: ... 但如果有其他方法让人知道,我宁愿不要?

  • 问题内容: 我有一个关于乐观锁定Hibernate的问题。我试图深入了解Hibernate的乐观锁定,但是我有一个疑问。Hibernate使用版本方法(整数或时间戳)来实现乐观锁定。要进行配置,您可以使用@Version批注(或xml配置)并创建一个version属性。另一个选项是使用optimistic- lock =“ all”属性进行配置而不进行版本控制。 我的问题是,如果您没有定义任何版本