设置对象访问权限

与桶访问权限类似,对象访问权限同样具有 AccessControlList 与 CannedAccessControlList 两种。需要注意的是,对象的访问优先级要高于桶访问权限。比如桶访问权限是 private,但是对象访问权限是 public read,则所有用户都可以访问该对象。默认情况下,只有对象的拥有者才能访问该对象,即对象的访问权限默认是 private。

  • AccessControlList

使用 AccessControlList 设置对象访问权限时,可以设置特定用户对象的访问权限。对象的 AccessControlList 权限如下表:

权限 对应Permission值
可读取object的数据。 READ
WRITE
可读取object的acl规则。 READ_ACP
可修改object的acl规则。 WRITE_ACP
完全权限。以上的所有权限 FULL_CONTROL

使用AccesssControlList设置对象的权限示例代码如下:

$bucket = '<your-bucket-name>';
$keyname = '<your-object-key>';
$params = [
    'AccessControlPolicy' => [
        'Grants' => [
            [
                //开启用户 exampleuser 的完全控制权限
                'Grantee' => [
                    'ID' => 'exampleuser',
                    'Type' => 'CanonicalUser',
                ],
                'Permission' => 'FULL_CONTROL',
            ],
            [
                //开启所有用户的读权限
                'Grantee' => [
                    'Type' => 'Group',
                    'URI' => 'http://acs.amazonaws.com/groups/global/AllUsers',
                ],
                'Permission' => 'READ',
            ],
            // ...
        ],
        // 可以从 getBucketAcl 接口获取 Owner 信息
        'Owner' => [
            'DisplayName' => 'Example DisplayName',
            'ID' => 'exampleuser',
        ],
    ],
    'Bucket' => $bucket,
    'Key' => $key,
];

try {
    $resp = $s3Client->putObjectAcl($params);
    echo "Succeed in setting object ACL.\n";
} catch (AwsException $e) {
    // Display error message
    echo $e->getMessage();
    echo "\n";
}
  • CannedAccesssControlList

CannedAccesssControlList 是一系列的预定义访问权限,包含了:private(私有读写),public-read(公共读私有写),public-read-write(公共读写)。

权限 对应ACL值
私有读写 private
公共读私有写 public-read
公共读写 public-read-write
注册用户可读 authenticated-read

使用 CannedAccesssControlList 设置桶的访问权限示例代码如下:

//设置对象为公共读写
$params = [
    'ACL' => 'public-read',
    'Bucket' => $bucket,
    'Key' => $key,
];
try {
    $resp = $s3Client->putObjectAcl($params);
    echo "Succeed in setting object ACL.\n";
} catch (AwsException $e) {
    echo $e->getMessage();
    echo "\n";
}