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

如何通过Java SDK确定您在AWS S3中的权限?,java,amazon-web-services,amazon-s3,permissions,Java,Amazon Web Services,Amazon S3,Permissions,我知道您可以尝试通过Java SDK读取ACL或Bucket策略,但是有没有简单的方法来检查您是否对Bucket和/或其内容具有读取和/或写入权限?我在AmazonS3类中没有看到任何“haveReadPermissions()”方法或任何东西,但也许我遗漏了什么?我发现很难相信没有简单的方法来检查权限。我认为没有更简单的方法,除非您创建了自己的类来扩展AWS API。如果你正在使用Amazon S3开发一个更大的程序,这可能不是一个坏主意。试试getBucketACL(String bucke

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

我认为没有更简单的方法,除非您创建了自己的类来扩展AWS API。如果你正在使用Amazon S3开发一个更大的程序,这可能不是一个坏主意。

试试
getBucketACL(String bucketName)
这是AmazonS3的一种方法
。有几个其他的方法可以用来解决这个问题。我最初尝试使用getBucketLocation()方法来确定给定的用户是否具有对bucket的读取权限,但结果证明您必须是bucket的所有者才能使用此方法。。。所以那没用

对于读访问,您可以使用另一种方法。只需使用类似于
getObject(bucketName,UUID.randomUUID().toString())
-这将引发异常,因为您试图获取一个不存在的密钥。捕获AmazonServiceException(或AmazonS3Exception),并检查
e.getErrorCode()
是否等于
“NoSuchKey”
。如果是这种情况,那么您就拥有对bucket的读取权限。如果它是任何其他错误代码,那么您没有访问权限,或者bucket不存在,等等(可能有很多种情况)。确保明确检查错误代码而不是状态代码,因为如果bucket不存在,也会得到404状态代码(与密钥不存在时得到的状态代码相同)。以下是S3错误/状态代码的完整列表:


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

此外,您可能没有查看ACL的权限。因此,除非您需要
READACL
访问bucket,并且不允许策略,否则您将需要使用
getBucketACL
getBucketPolicy
的一些组合


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

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

// 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();
}
//获取bucket权限列表
列表bucketPermissions=s3Client
.getBucketAcl(bucketName)
.getGrantsaList().stream().distinct()
.map(t->t.getPermission().toString())
.collect(Collectors.toList());
//检查读/写或完全控制权限
如果(
!((bucketPermissions.contains(“读取”)
&&bucketPermissions.contains(“写入”))
||(bucketPermissions.contains(“完全控制”)){
抛出新的InsufficentBucketPermissionException();
}

请随时改进此解决方案。

我认为只有当bucket具有ACL时,此解决方案才有效。如果您通过bucket策略分配权限,此解决方案是否仍然有效?此处是否可以模拟PrincipalPolicy或SimulateCompolicy?