【问题标题】:How do you determine your permissions in AWS S3 through the Java SDK?您如何通过 Java 开发工具包确定您在 AWS S3 中的权限?
【发布时间】:2012-07-26 09:33:09
【问题描述】:

我知道您可以尝试通过 Java SDK 读取 ACL 或存储桶策略,但是有没有简单的方法来检查您是否具有对存储桶和/或其内容的读取和/或写入权限?我在 AmazonS3 类中看不到任何“haveReadPermissions()”方法或任何东西,但也许我遗漏了什么?我很难相信没有简单的方法来检查权限。

【问题讨论】:

    标签: java amazon-web-services amazon-s3 permissions


    【解决方案1】:

    我认为答案是没有万无一失的方法可以做到这一点,至少目前没有。您可以使用其他几种方法来尝试解决此问题。我最初尝试使用 getBucketLocation() 方法来确定我的给定用户是否具有对存储桶的读取权限,但事实证明您 必须是存储桶的所有者才能使用此方法...所以那没用。

    对于读取访问,您可以使用另一种技巧。只需使用类似于getObject(bucketName, UUID.randomUUID().toString()) 的东西 - 这将引发异常,因为您正在尝试获取不存在的密钥。捕获 AmazonServiceException(或 AmazonS3Exception)并检查 e.getErrorCode() 是否等于 "NoSuchKey"。如果是这种情况,那么您对存储桶具有读取权限。如果它是任何其他错误代码,那么您无权访问,或者存储桶不存在等(可能是任意数量的东西)。确保您明确检查 ErrorCode not StatusCode,因为如果存储桶不存在,您还将获得 404 StatusCode(这与您在密钥不存在时获得的 StatusCode 相同)。以下是 S3 错误/状态代码的完整列表:http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html

    对于写访问,它不是那么简单。最好的方法是实际将一个小测试文件写入存储桶(然后可能尝试删除它)。除此之外,如果您想检查更通用的权限,使用像 PutObjectAcl 这样的方法将确定您的用户是否具有"s3:Put*" 权限(您可以通过先读取然后使用它来将 ACL 设置为与当前 ACL 完全相同设置它)。

    【讨论】:

    • 这里可以 SimulatePrincipalPolicy 或 SimulateCustomPolicy 吗?
    【解决方案2】:

    试试getBucketACL(String bucketName),这是AmazonS3的一种方法。

    【讨论】:

    • 我认为只有在存储桶有 ACL 时才有效,如果您通过存储桶策略分配权限,这仍然有效吗?
    【解决方案3】:

    如果没有定义存储桶策略,则使用getBucketACL 很好,但该策略可以覆盖 ACL。

    另外,您可能没有查看 ACL 的权限。因此,除非您可以要求 READACL 访问存储桶,并且不允许策略,否则您将需要使用 getBucketACLgetBucketPolicy 的某种组合。

    到那时,尝试检查这些权限所需的操作可能会更容易。

    【讨论】:

      【解决方案4】:

      这里是如何做到这一点的:

      // get list of bucket permission
      List<String> bucketPermissions = s3Client
          .getBucketAcl(bucketName)
          .getGrantsAsList().stream().distinct()
          .map(t -> t.getPermission().toString())
          .collect(Collectors.toList());
      
      // check read/write or full control permission
      if (
          !((bucketPermissions.contains("READ")
          && bucketPermissions.contains("WRITE"))
          || (bucketPermissions.contains("FULL_CONTROL")))) {
      throw new InsufficentBucketPermissionException();
      }
      

      请随时改进此解决方案。

      【讨论】:

        【解决方案5】:

        我认为没有更简单的方法,除非您创建自己的扩展 AWS API 的类。如果您正在执行与 Amazon S3 相关的大型程序,这可能不是一个坏主意。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-10
          • 2015-06-01
          • 2023-03-15
          • 1970-01-01
          • 2017-08-29
          • 2014-02-26
          相关资源
          最近更新 更多