9

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

4

5 回答 5

11

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

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

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

于 2013-06-24T20:36:52.370 回答
0

试试getBucketACL(String bucketName)哪一种方法AmazonS3

于 2012-09-19T07:53:57.347 回答
0

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

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

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

于 2016-06-08T20:09:24.970 回答
0

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

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

请随时改进此解决方案。

于 2020-06-02T06:15:39.500 回答
-1

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

于 2012-07-27T18:32:30.333 回答