【问题标题】:Minio: How's bucket policy related to anonymous/authorized access?Minio:与匿名/授权访问相关的存储桶策略如何?
【发布时间】:2025-12-29 05:50:11
【问题描述】:

Minio 有each bucket 的策略。其中包含:

  • 只读
  • 只写
  • 读+写

这些与对文件夹的匿名/授权访问有何关系?
就像说我想让一堆文件以只读方式提供给没有凭据(访问密钥和密钥)的用户。我该怎么做?

【问题讨论】:

    标签: minio


    【解决方案1】:

    Minio 客户端提供的存储桶策略是 AWS S3 提供的相同存储桶策略的抽象版本。

    客户端根据桶和前缀的输入字符串构造一个策略JSON。

    • ReadOnly 表示 - 允许匿名下载访问,包括 能够在所需的前缀上列出对象
    • WriteOnly 表示 - 允许匿名上传,包括能够 在所需前缀上列出不完整的上传
    • 读写 - 匿名访问以上传和下载所有对象。 这也意味着完全公开访问。
    • None - 是默认值(无策略),这意味着所有操作都需要 向所需的存储桶和前缀进行身份验证。

    一堆文件应该位于特定前缀下,可以只读访问。假设您的前缀是“我的前缀/只读/下载”,那么如果您正在使用

    import java.io.IOException;
    import java.security.NoSuchAlgorithmException;
    import java.security.InvalidKeyException;
    
    import org.xmlpull.v1.XmlPullParserException;
    
    import io.minio.MinioClient;
    import io.minio.policy.PolicyType;
    import io.minio.errors.MinioException;
    
    public class SetBucketPolicy {
      /**
       * MinioClient.setBucketPolicy() example.
       */
      public static void main(String[] args)
        throws IOException, NoSuchAlgorithmException, InvalidKeyException, XmlPullParserException {
        try {
          /* play.minio.io for test and development. */
          MinioClient minioClient = new MinioClient("https://play.minio.io:9000", "Q3AM3UQ867SPQQA43P2F",
                                                    "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");
    
          /* Amazon S3: */
          // MinioClient minioClient = new MinioClient("https://s3.amazonaws.com", "YOUR-ACCESSKEYID",
          //                                           "YOUR-SECRETACCESSKEY");
    
          minioClient.setBucketPolicy("my-bucketname", "my-prefix/read-only/downloads", PolicyType.READ_ONLY);
        } catch (MinioException e) {
          System.out.println("Error occurred: " + e);
        }
      }
    }
    

    一旦您的调用成功,“my-prefix/read-only/downloads”中的所有对象都是公开可读的,即无需访问/密钥。

    【讨论】:

    • 感谢您的澄清。如何将某些文件设为私有?就像没有匿名(读取)访问权限一样?
    • 默认情况下,您的所有文件都是私有的,没有特殊要求将它们设为私有。
    • 为了清楚起见(所以你可以从curl测试),你实际访问文件的URL是https://play.minio.io:9000/my-bucketname/<path>,上面例子中的<path>my_prefix/read-only/downloads,大概你已经创建了这条路径。如果您在存储桶中只有一个文件file.jpg,那么在上面的调用中您将有一个``前缀,并且 url 将是https://play.minio.io:9000/my-bucketname/file.jpg 如果我无法制作一个具体的工作示例,我会感到很困惑,所以在这里。
    • 有兴趣知道如何在 Python 中做到这一点
    【解决方案2】:

    'public' 是有效的策略...

    您可以更改此政策: 安装 mc (minio 客户端) 然后:

    # 安装后列出默认主机: mc 配置主机 ls # 删除所有主机: mc config host rm {hostName} mc 配置主机 rm 本地 # 添加你的主机: mc config host add {hostName} {url} {apiKey} {apiSecret} mc 配置主机添加本地 http://127.0.0.1:9000 ClientIdASSDD ClientSecretASASASdsasdasdasdasd # 创建存储桶:mc mb {host}/{bucket} mc mb 本地/mybucket # 更改存储桶策略:mc policy set {policy} {host}/{bucket} mc 策略设置公共本地/mybucket

    【讨论】:

    • mc policy set public local/mybucket 现在是设置策略的命令