我知道你可以尝试通过Java SDK读取ACL或Bucket策略,但是否有更简单的方法只是检查您是否具有对存储桶及/或其内容的读写权限?我没有在AmazonS3类中看到“haveReadPermissions()”方法或任何其他内容,但也许我错过了什么?我认为很难相信没有简单的方法来检查权限。
我知道你可以尝试通过Java SDK读取ACL或Bucket策略,但是否有更简单的方法只是检查您是否具有对存储桶及/或其内容的读写权限?我没有在AmazonS3类中看到“haveReadPermissions()”方法或任何其他内容,但也许我错过了什么?我认为很难相信没有简单的方法来检查权限。
我认为,至少目前没有绝对可靠的方法来实现这个,但有几种其他方法可以尝试解决这个问题。我最初尝试使用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完全相同,方法是先读取它,然后使用它进行设置)。
如果没有定义Bucket Policies,使用getBucketACL
是可以的,但是Policy可以覆盖ACL。
此外,您可能没有权限查看ACL。因此,除非您可以要求对Buckets进行READACL
访问,并且不允许Policies,否则您将需要使用getBucketACL
和getBucketPolicy
的某种组合。
在那时,尝试您需要检查这些权限的操作可能会更容易。
getBucketACL(String bucketName)
这个属于AmazonS3
的方法。这里是您可以实现它的方法:
// 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有关的大型程序,这可能不是一个坏主意。