设置桶策略

您可以使用 setBucketPolicy 接口设定桶策略,您可以执行以下操作:

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

您可以使用 Policy 类构建策略,免除设置文本字符串出现格式错误的麻烦,构建完成后使用 toJson 方法可以获取 JSON 策略文本。以下代码展示如何设置禁止除了指定用户以外的用户删除桶的策略:

// 以下示例策略禁止除了用户名为user以外的用户删除桶。
String bucketName = "<your-bucket-name>";
Policy bucketPolicy = new Policy().withStatements(
        new Statement(Statement.Effect.Deny)//指定本条桶策略描述的权限为拒绝请求
                .withPrincipals(Principal.AllUsers)//对所有用户生效
                .withActions(S3Actions.DeleteBucket)//操作为DeleteBucket
                .withConditions(new StringCondition(StringCondition.StringComparisonType.StringNotEquals, "aws:username", "user"))//条件为用户名为use除外
                .withResources(new Resource("arn:aws:s3:::" + bucketName + "/*")));//指定资源为桶内所有对象
try {
    s3.setBucketPolicy(bucketName, bucketPolicy.toJson());
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
}

在上传对象时如果不设置对象访问权限,默认下只有对象的拥有者才能访问该对象。如果需要使桶内对象可公共读,可以通过设置桶策略的方式允许桶内对象公共读,以下代码展示如何设置桶内对象可公共读的策略:

// 以下示例策略允许所有用户可读取桶内对象。
String bucketName = "<your-bucket-name>";
Policy bucketPolicy = new Policy().withStatements(
        new Statement(Statement.Effect.Allow)//指定本条桶策略描述的权限为允许请求
                .withPrincipals(Principal.AllUsers)//对所有用户生效
                .withActions(S3Actions.GetObject)//操作为GetObject
                .withResources(new Resource("arn:aws:s3:::" + bucketName + "/*")));//指定资源为桶内所有对象
try {
    s3.setBucketPolicy(bucketName, bucketPolicy.toJson());
} catch (AmazonServiceException e) {
    System.err.println(e.getErrorMessage());
}