我正在使用 golang 存储客户端,并且还通过了 ACL 规则。
cloudObj := StorageClient.Bucket(BucketName).Object(fileName).NewWriter(ctx)
cloudObj.ACL = append(cloudObj.ACL, storage.ACLRule{Entity: storage.AllUsers, Role: storage.RoleReader})
这里我的存储桶是私有的,但上传文件后,当我尝试打开文件链接时,它显示 AccessDenied。不知道我哪里做错了。
是的,可以使用私有存储桶公开您的对象。您可以轻松地通过使用签名 URL 和 签名策略文档 来满足我认为您需要的特定要求(使您的用户能够执行操作,查看文件或上传具有公共访问权限的文件,而无需损害您的存储桶安全)
此外,即使已设置 ACL,您也将无法公开访问对象:
您可以使用以下方法检查您的存储桶是否具有统一的存储桶级别访问权限:
gsutil uniformbucketlevelaccess get gs://BUCKET_NAME // where BUCKET_NAME is the name of the relevant bucket.
如果启用统一存储桶级别访问,则响应如下所示:
gs://my-bucket/ 的统一存储桶级别访问设置: 启用:真 锁定时间:LOCK_DATE
因此,为了满足您的要求,您必须为您的存储桶设置细粒度权限,这样您就可以一起使用 IAM 和访问控制列表 (ACL) 来管理权限。您可以在存储桶级别和每个单独的对象上指定访问权限并应用权限。
这是将对象的 ACL 设置为公开(单独或一次性全部)的方法,尽管你的存储桶是私有的。
如果要使存储桶中的各个对象公开可读,请查看此 Go 代码示例 和 gsutil 命令
gsutil acl ch -u AllUsers:R gs://BUCKET_NAME/OBJECT_NAME
。
如果要使存储桶中的所有对象公开可读,请查看此 Go 代码示例 和 gsutil 命令
gsutil iam ch allUsers:objectViewer gs://BUCKET_NAME
。
什么对我有用:
然后:
请注意,公共 URL 与经过身份验证的 URL 不同:
尝试从隐身浏览器打开第二个将会失败(除非您已公开您的存储桶)。