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

10

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

5个回答

12

我认为,至少目前没有绝对可靠的方法来实现这个,但有几种其他方法可以尝试解决这个问题。我最初尝试使用getBucketLocation()方法确定给定用户是否具有访问Bucket的读取权限,但事实证明你必须是Bucket的所有者才能使用此方法,所以它不起作用。

对于读取权限,您可以使用另一种hack方法。只需使用类似于getObject(bucketName, UUID.randomUUID().toString()) 的内容-这将抛出异常,因为您正在尝试获取不存在的键。捕获AmazonServiceException(或AmazonS3Exception)并检查e.getErrorCode()是否等于"NoSuchKey"。如果是这种情况,则您可以读取Bucket。如果是任何其他错误代码,则表示您没有访问权限,Bucket不存在等等(可能是任何数量的事情)。务必明确检查ErrorCode而不是StatusCode,因为如果Bucket不存在(与key不存在相同),则还会收到404 StatusCode。以下是完整的S3错误/状态代码列表:http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html

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


可以在这里使用SimulatePrincipalPolicy或SimulateCustomPolicy吗? - rcipher222

0

如果没有定义Bucket Policies,使用getBucketACL是可以的,但是Policy可以覆盖ACL。

此外,您可能没有权限查看ACL。因此,除非您可以要求对Buckets进行READACL访问,并且不允许Policies,否则您将需要使用getBucketACLgetBucketPolicy的某种组合。

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


0
尝试使用getBucketACL(String bucketName)这个属于AmazonS3的方法。

我认为只有当存储桶具有ACL时才能起作用,如果您通过存储桶策略分配权限,这是否仍然有效? - Dasmowenator

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

请随意改进此解决方案。


-1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接