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

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

使用存储桶策略管理对 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( "arn:aws: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。

更多信息