管理对桶和对象的 Amazon S3 访问权限 - Amazon SDK for Java 1.x
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

我们宣布了即将推出 end-of-support 的 Amazon SDK for Java (v1)。建议您迁移到 Amazon SDK for Java v2。有关日期、其他详细信息以及如何迁移的信息,请参阅链接的公告。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

管理对桶和对象的 Amazon S3 访问权限

您可以为 Amazon S3 存储桶和对象使用访问控制列表 (ACL),以实现对 Amazon S3 资源的精细控制。

注意

这些代码示例假定您了解使用Amazon SDK for Java 中的内容,并且已使用设置用于开发的 Amazon 凭证和区域中的信息配置默认 Amazon 凭证。

获取存储桶的访问控制列表

要获取桶的当前 ACL,请调用 AmazonS3 的 getBucketAcl 方法,将桶名称 传递给它以进行查询。此方法将返回 AccessControlList 对象。要获取列表中的每个访问授权,请调用其 getGrantsAsList 方法,这会返回一个包含 Grant 对象的标准 Java 列表。

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.AccessControlList; import com.amazonaws.services.s3.model.Grant;

代码

final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); try { AccessControlList acl = s3.getBucketAcl(bucket_name); List<Grant> grants = acl.getGrantsAsList(); for (Grant grant : grants) { System.out.format(" %s: %s\n", grant.getGrantee().getIdentifier(), grant.getPermission().toString()); } } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

请参阅 GitHub 上的完整示例

设置存储桶的访问控制列表

要添加或修改存储桶对 ACL 的权限,请调用 AmazonS3 的 setBucketAcl 方法。这需要一个 AccessControlList 对象,它包含被授权者和要设置的访问级别的列表。

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.AccessControlList; import com.amazonaws.services.s3.model.EmailAddressGrantee;

代码

final AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build(); try { // get the current ACL AccessControlList acl = s3.getBucketAcl(bucket_name); // set access for the grantee EmailAddressGrantee grantee = new EmailAddressGrantee(email); Permission permission = Permission.valueOf(access); acl.grantPermission(grantee, permission); s3.setBucketAcl(bucket_name, acl); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }
注意

您可以使用 Grantee 类直接提供被授权者的唯一标识符,也可以使用 EmailAddressGrantee 类通过电子邮件设置被授权者,这里采用后者。

请参阅 GitHub 上的完整示例

获取对象的访问控制列表

要获取对象的当前 ACL,请调用 AmazonS3 的 getObjectAcl 方法,将桶名称对象名称 传递给它以进行查询。和 getBucketAcl 类似,此方法将返回一个 AccessControlList 对象,您可以用它来检查每个 Grant

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.AccessControlList; import com.amazonaws.services.s3.model.Grant;

代码

try { AccessControlList acl = s3.getObjectAcl(bucket_name, object_key); List<Grant> grants = acl.getGrantsAsList(); for (Grant grant : grants) { System.out.format(" %s: %s\n", grant.getGrantee().getIdentifier(), grant.getPermission().toString()); } } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

请参阅 GitHub 上的完整示例

设置对象的访问控制列表

要添加或修改对象对 ACL 的权限,请调用 AmazonS3 的 setObjectAcl 方法。这需要一个 AccessControlList 对象,它包含被授权者和要设置的访问级别的列表。

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.AccessControlList; import com.amazonaws.services.s3.model.EmailAddressGrantee;

代码

try { // get the current ACL AccessControlList acl = s3.getObjectAcl(bucket_name, object_key); // set access for the grantee EmailAddressGrantee grantee = new EmailAddressGrantee(email); Permission permission = Permission.valueOf(access); acl.grantPermission(grantee, permission); s3.setObjectAcl(bucket_name, object_key, acl); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } }
注意

您可以使用 Grantee 类直接提供被授权者的唯一标识符,也可以使用 EmailAddressGrantee 类通过电子邮件设置被授权者,这里采用后者。

请参阅 GitHub 上的完整示例

更多信息