View a markdown version of this page

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

Amazon SDK for Java 1.x于2025年12月31日达到支撑终止状态。我们建议您迁移到 Amazon SDK for Java 2.x 以继续获得新功能、可用性改进和安全更新。

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

使用桶策略管理对 Amazon S3 桶的访问

您可以设置、获取或删除存储桶策略 来管理对 Amazon S3 存储桶的访问。

设置存储桶策略

您可以通过以下方式为特定的 S3 存储桶设置存储桶策略:

  • 调用 AmazonS3 客户端的 setBucketPolicy 并为其提供 SetBucketPolicyRequest

  • 使用接收存储桶名称和策略文本 (JSON 格式) 的 setBucketPolicy 重载直接设置策略

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.policy.Policy; import com.amazonaws.auth.policy.Principal;

代码

s3.setBucketPolicy(bucket_name, policy_text); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

使用策略类生成或验证策略

setBucketPolicy 提供存储桶策略时,您可以执行以下操作:

  • 使用 JSON 格式的文本字符串直接指定策略

  • 使用 Policy 类构建策略

使用 Policy 类,您不必担心如何正确设置文本字符串的格式。要从 Policy 类获取 JSON 策略文本,请使用其 toJson 方法。

导入

import com.amazonaws.auth.policy.Resource; import com.amazonaws.auth.policy.Statement; import com.amazonaws.auth.policy.actions.S3Actions; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder;

代码

new Statement(Statement.Effect.Allow) .withPrincipals(Principal.AllUsers) .withActions(S3Actions.GetObject) .withResources(new Resource( "{region-arn}s3:::" + bucket_name + "/*"))); return bucket_policy.toJson();

Policy 类还提供 fromJson 方法,它会尝试使用传入的 JSON 字符串构建策略。该方法会验证文本以确保可以转换为有效策略结构,如果策略文本无效,就会失败并引发 IllegalArgumentException

Policy bucket_policy = null; try { bucket_policy = Policy.fromJson(file_text.toString()); } catch (IllegalArgumentException e) { System.out.format("Invalid policy text in file: \"%s\"", policy_file); System.out.println(e.getMessage()); }

您可以使用此方法,提前验证您从文件读入或通过其他方法得到的策略。

请参阅 GitHub 上的完整示例

获取存储桶策略

要检索 Amazon S3 桶的策略,请调用 AmazonS3 客户端的 getBucketPolicy 方法,将桶名称传递给它以获取策略。

导入

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

代码

try { BucketPolicy bucket_policy = s3.getBucketPolicy(bucket_name); policy_text = bucket_policy.getPolicyText(); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

如果指定的存储桶不存在、您没有访问该存储桶的权限或者其中不包含存储桶策略,会引发 AmazonServiceException

请参阅 GitHub 上的完整示例

删除存储桶策略

要删除桶策略,请调用 AmazonS3 客户端的 deleteBucketPolicy,并为其提供桶名称。

导入

import com.amazonaws.AmazonServiceException; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3;

代码

try { s3.deleteBucketPolicy(bucket_name); } catch (AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); }

即使存储桶中还没有策略,该方法也会成功。如果您指定的存储桶名称不存在,或者您没有访问该存储桶的权限,会引发 AmazonServiceException

请参阅 GitHub 上的完整示例

更多信息