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

自2024年7月31日起, 适用于 Java 的 Amazon SDK 1.x已进入维护模式,并将于2025年12月31日end-of-support上线。我们建议您迁移到Amazon SDK for Java 2.x以继续接收新功能、可用性改进和安全更新。

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

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

您可以使用 Amazon S3 存储桶和对象的访问控制列表 (ACLs) 来精细控制您的资源。 Amazon S3

注意

这些代码示例假设您理解《使用》中的内容, 适用于 Java 的 Amazon SDK并已使用设置 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。

更多信息