

# 对单个账户内的请求进行策略评估
<a name="reference_policies_evaluation-logic_policy-eval-basics"></a>

## 对 IAM 角色进行策略评估
<a name="policy-eval-basics-single-account-role"></a>

以下流程图详细介绍了如何针对单一账户中的 IAM 角色作出策略评估决策。

![\[单个账户中 IAM 角色的评估流程图\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/PolicyEvaluationSingleAccountRole.png)


## 对 IAM 用户进行策略评估
<a name="policy-eval-basics-single-account-user"></a>

以下流程图详细介绍了如何针对单一账户中的 IAM 用户作出策略评估决策。

![\[单个账户中 IAM 用户的评估流程图\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/PolicyevaluationSingleAccountUser.png)


## 基于身份的策略和基于资源的策略评估示例
<a name="reference_policies_evaluation-logic_policies_evaluation_example"></a>

策略的最常见类型是基于身份的策略和基于资源的策略。当请求访问资源时，AWS 会评估策略为同一账户中**至少一个允许**所授予的所有权限。任一项策略中的显式拒绝将覆盖允许。

**重要**  
如果同一账户中基于身份的策略或基于资源的策略其中一个允许该请求，而另一个不允许，仍可允许该请求。

假定 Carlos 具有用户名 `carlossalazar`，他尝试将文件保存到 `amzn-s3-demo-bucket-carlossalazar-logs` Amazon S3 存储桶。

还假定将以下策略附加到 `carlossalazar` IAM 用户。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowS3ListRead",
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:GetAccountPublicAccessBlock",
                "s3:ListAccessPoints",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Sid": "AllowS3Self",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-carlossalazar/*",
                "arn:aws:s3:::amzn-s3-demo-bucket-carlossalazar"
            ]
        },
        {
            "Sid": "DenyS3Logs",
            "Effect": "Deny",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::*log*"
        }
    ]
}
```

------

此策略中的 `AllowS3ListRead` 语句允许 Carlos 查看账户中的所有存储桶的列表。`AllowS3Self` 语句允许 Carlos 完全访问与其用户名同名的存储桶。`DenyS3Logs` 语句拒绝 Carlos 访问名称中包含 `log` 的任何 S3 存储桶。

此外，以下基于资源的策略（称为存储桶策略）附加到 `amzn-s3-demo-bucket-carlossalazar` 存储桶。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/carlossalazar"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket-carlossalazar/*",
                "arn:aws:s3:::amzn-s3-demo-bucket-carlossalazar"
            ]
        }
    ]
}
```

------

此策略指定只有 `carlossalazar` 用户可以访问 `amzn-s3-demo-bucket-carlossalazar` 存储桶。

当 Carlos 请求将文件保存到 `amzn-s3-demo-bucket-carlossalazar-logs` 存储桶时，AWS 将确定应用于请求的策略。在此示例中，仅基于身份的策略和基于资源的策略适用。这些都是权限策略。由于没有任何权限边界适用，评估逻辑将减少为以下逻辑。

![\[评估流程图\]](http://docs.aws.amazon.com/zh_cn/IAM/latest/UserGuide/images/EffectivePermissionsShort.png)


AWS 首先检查应用于请求上下文的 `Deny` 语句。它找到一个，因为基于身份的策略显式拒绝 Carlos 访问用于日志记录的任何 S3 存储桶。拒绝 Carlos 访问。

假设他随后意识到自己的错误，尝试将文件保存到 `amzn-s3-demo-bucket-carlossalazar` 存储桶。AWS 检查 `Deny` 语句，但未找到。然后，它检查权限策略。基于身份的策略和基于资源的策略均允许请求。因此，AWS 允许请求。如果其中任何一个显式拒绝了语句，则将拒绝请求。如果其中一种策略类型允许请求，而另一种不允许，则仍允许请求。