

 适用于 Java 的 AWS SDK 1.x于2025年 end-of-support 12月31日达到。我们建议您迁移到 [AWS SDK for Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/home.html) 以继续获得新功能、可用性改进和安全更新。

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

# 访问控制策略
<a name="java-dg-access-control"></a>

 AWS *访问控制策略*使您能够对资源指定精细的访问控制。 AWS 访问控制策略包含一组*语句*，其形式如下：

 在*条件 D* 适用的情况下，*账户 A* 有权对*资源 C* 执行*操作 B*。

其中：
+  *A* 是*委托人* AWS 账户 ，即请求访问或修改您的某个 AWS 资源。
+  *B* 是*操作*-访问或修改 AWS 资源的方式，例如向 Amazon SQS 队列发送消息或将对象存储在存储 Amazon S3 桶中。
+  *C* 是*资源*-委托人想要访问的 AWS 实体，例如 Amazon SQS 队列或存储在中的对象 Amazon S3。
+  *D* 是*一组条件* – 指定何时允许或拒绝主体访问资源的可选约束。有许多富有表现力的条件，还有一些特定于每项服务的条件。例如，您可以使用日期条件以仅允许在特定时间之后或之前访问资源。

## Amazon S3 示例
<a name="s3-example"></a>

以下示例演示了一项策略，该策略允许任何人访问存储桶中的所有对象，但将向该存储桶上传对象的访问权限限制为两个特定 AWS 账户的（存储桶拥有者的账户除外）。

```
Statement allowPublicReadStatement = new Statement(Effect.Allow)
    .withPrincipals(Principal.AllUsers)
    .withActions(S3Actions.GetObject)
    .withResources(new S3ObjectResource(myBucketName, "*"));
Statement allowRestrictedWriteStatement = new Statement(Effect.Allow)
    .withPrincipals(new Principal("123456789"), new Principal("876543210"))
    .withActions(S3Actions.PutObject)
    .withResources(new S3ObjectResource(myBucketName, "*"));

Policy policy = new Policy()
    .withStatements(allowPublicReadStatement, allowRestrictedWriteStatement);

AmazonS3 s3 = AmazonS3ClientBuilder.defaultClient();
s3.setBucketPolicy(myBucketName, policy.toJson());
```

## Amazon SQS 示例
<a name="sqs-example"></a>

策略的一个常见用途是授权 Amazon SQS 队列接收来自 Amazon SNS 主题的消息。

```
Policy policy = new Policy().withStatements(
    new Statement(Effect.Allow)
        .withPrincipals(Principal.AllUsers)
        .withActions(SQSActions.SendMessage)
        .withConditions(ConditionFactory.newSourceArnCondition(myTopicArn)));

Map queueAttributes = new HashMap();
queueAttributes.put(QueueAttributeName.Policy.toString(), policy.toJson());

AmazonSQS sqs = AmazonSQSClientBuilder.defaultClient();
sqs.setQueueAttributes(new SetQueueAttributesRequest(myQueueUrl, queueAttributes));
```

## Amazon SNS 示例
<a name="sns-example"></a>

一些服务提供可用于策略的其他条件。Amazon SNS 根据订阅主题请求的协议（例如电子邮件、HTTP、HTTPS Amazon SQS）和终端节点（例如电子邮件地址、URL、 Amazon SQS ARN）为允许或拒绝订阅 SNS 主题提供了条件。

```
Condition endpointCondition =
    SNSConditionFactory.newEndpointCondition("*@mycompany.com");

Policy policy = new Policy().withStatements(
    new Statement(Effect.Allow)
        .withPrincipals(Principal.AllUsers)
        .withActions(SNSActions.Subscribe)
        .withConditions(endpointCondition));

AmazonSNS sns = AmazonSNSClientBuilder.defaultClient();
sns.setTopicAttributes(
    new SetTopicAttributesRequest(myTopicArn, "Policy", policy.toJson()));
```