繁体   English   中英

您如何通过 Java SDK 确定您在 AWS S3 中的权限?

[英]How do you determine your permissions in AWS S3 through the Java SDK?

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

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

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

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

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

如果getBucketACL存储桶策略,则使用getBucketACL没问题,但策略可以覆盖 ACL。

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

在这一点上,尝试检查这些权限所需的操作可能会更容易。

在这里你可以如何做到这一点:

// 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();
}

请随时改进此解决方案。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM