管理 Amazon S3 存储桶和对象的访问权限 - 适用于 Java 的 AWS 开发工具包。
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

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

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

注意

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

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

要获取存储桶的当前 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;

Code

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;

Code

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;

Code

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;

Code

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 上的完整示例

更多信息