本文介绍如何获取和设置对象的访问权限。对象的访问权限优先级高于桶的访问权限,如果对象未设置访问权限,则遵循桶的访问权限。
设置对象的读写权限之前,您需要确保账号拥有 tos:PutObjectACL
权限,或具备 WRITE_ACP 对象 ACL 权限,具体操作,请参见权限配置指南。
您可以在请求体或请求头中设置详细的 ACL 权限信息。对象 ACL 权限包含以下类型。
访问权限 | 描述 | 访问权限值 |
---|---|---|
READ | 允许被授权者读取对象数据及其元数据。 | PermissionType.PermissionRead |
READ_ACP | 允许被授权者读取对象 ACL。 | PermissionType.PermissionReadAcp |
WRITE_ACP | 允许被授权者为适用的对象编写 ACL。 | PermissionType.PermissionWriteAcp |
FULL_CONTROL | 允许被授权者在对象上的 READ、READ_ACP 和 WRITE_ACP 权限。 | PermissionType.PermissionFullControl |
以下代码用于在请求体中设置对象的详细 ACL 权限信息。
using System;
using TOS;
using TOS.Error;
using TOS.Model;
namespace ConsoleApp
{
internal class Program
{
private static void Main(string[] args)
{
var ak = Environment.GetEnvironmentVariable("TOS_ACCESS_KEY");
var sk = Environment.GetEnvironmentVariable("TOS_SECRET_KEY");
// endpoint 若没有指定HTTP协议(HTTP/HTTPS),默认使用 HTTPS
// Bucket 的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com
var endpoint = "https://tos-cn-beijing.volces.com";
var region = "cn-beijing";
// 填写 BucketName
var bucketName = "*** Provide your bucket name ***";
// 填写对象名
var objectKey = "*** Provide your object key ***";
// 创建TOSClient实例
var client = TosClientBuilder.Builder().SetAk(ak).SetSk(sk).SetEndpoint(endpoint).SetRegion(region).Build();
try
{
// 设置对象 ACL
var putObjectACLInput = new PutObjectACLInput()
{
Bucket = bucketName,
Key = objectKey,
// 如果桶开启的多版本,通过设置 VersionID 来设置指定版本
VersionID = "",
Owner = new Owner()
{
ID = "ownerId"
},
Grants = new[]
{
new Grant()
{
Grantee = new Grantee()
{
ID = "userId",
Type = GranteeType.GranteeUser,
},
Permission = PermissionType.PermissionRead
}
}
};
var putObjectAclOutput = client.PutObjectACL(putObjectACLInput);
Console.WriteLine("PutObjectACL succeeded, Request ID {0}", putObjectAclOutput.RequestID);
}
catch (TosServerException ex)
{
Console.WriteLine("PutObjectACL failed, Request ID {0}", ex.RequestID);
Console.WriteLine("PutObjectACL failed, Status Code {0}", ex.StatusCode);
Console.WriteLine("PutObjectACL failed, Response Error Code {0}", ex.Code);
Console.WriteLine("PutObjectACL failed, Response Error Message {0}", ex.Message);
}
catch (TosClientException ex)
{
Console.WriteLine("PutObjectACL failed, Error Message {0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("PutObjectACL failed, {0}", ex.Message);
}
}
}
}
通过 x-tos-acl 请求头设置对象的读写权限有以下六类。
访问权限 | 描述 | 访问权限值 |
---|---|---|
私有 | 私有。对象的所有者拥有所有权限,其他用户没有权限操作该对象。 | ACLType.ACLPrivate |
公共读 | 公共读。对象的所有者拥有所有权限,其他用户只有该对象的读权限。 | ACLType.ACLPublicRead |
公共读写 | 公共读写。所有用户都有该对象的读权限。 | ACLType.ACLPublicReadWrite |
认证用户读 | 对象的所有者拥有所有权限,认证用户拥有该对象的读权限。 | ACLType.ACLAuthRead |
桶所有者读 | 对象所有者拥有所有权限,桶所有者拥有此对象的读权限。 | ACLType.ACLBucketOwnerRead |
桶所有者具备所有权限 | 桶所有者和对象所有者都拥有对象的所有操作权限。 | ACLType.ACLBucketOwnerFullControl |
以下代码通过 x-tos-acl 请求头设置对象的读写权限。
using System;
using TOS;
using TOS.Error;
using TOS.Model;
namespace ConsoleApp
{
internal class Program
{
private static void Main(string[] args)
{
var ak = Environment.GetEnvironmentVariable("TOS_ACCESS_KEY");
var sk = Environment.GetEnvironmentVariable("TOS_SECRET_KEY");
// endpoint 若没有指定HTTP协议(HTTP/HTTPS),默认使用 HTTPS
// Bucket 的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com
var endpoint = "https://tos-cn-beijing.volces.com";
var region = "cn-beijing";
// 填写 BucketName
var bucketName = "*** Provide your bucket name ***";
// 填写对象名
var objectKey = "*** Provide your object key ***";
// 创建TOSClient实例
var client = TosClientBuilder.Builder().SetAk(ak).SetSk(sk).SetEndpoint(endpoint).SetRegion(region).Build();
try
{
// 设置对象 ACL
var putObjectACLInput = new PutObjectACLInput()
{
Bucket = bucketName,
Key = objectKey,
// 如果桶开启的多版本,通过设置 VersionID 来设置指定版本
VersionID = "",
ACL = ACLType.ACLPrivate,
};
var putObjectAclOutput = client.PutObjectACL(putObjectACLInput);
Console.WriteLine("PutObjectACL succeeded, Request ID {0}", putObjectAclOutput.RequestID);
}
catch (TosServerException ex)
{
Console.WriteLine("PutObjectACL failed, Request ID {0}", ex.RequestID);
Console.WriteLine("PutObjectACL failed, Status Code {0}", ex.StatusCode);
Console.WriteLine("PutObjectACL failed, Response Error Code {0}", ex.Code);
Console.WriteLine("PutObjectACL failed, Response Error Message {0}", ex.Message);
}
catch (TosClientException ex)
{
Console.WriteLine("PutObjectACL failed, Error Message {0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("PutObjectACL failed, {0}", ex.Message);
}
}
}
}
注意
获取对象的访问权限前,请确保当前账号拥有 tos:GetObjectACL
权限,或具备 READ_ACP 的对象 ACL 权限,具体操作,请参见权限配置指南。
以下代码用于获取对象的读写权限。
using System;
using TOS;
using TOS.Error;
using TOS.Model;
namespace ConsoleApp
{
internal class Program
{
private static void Main(string[] args)
{
var ak = Environment.GetEnvironmentVariable("TOS_ACCESS_KEY");
var sk = Environment.GetEnvironmentVariable("TOS_SECRET_KEY");
// endpoint 若没有指定HTTP协议(HTTP/HTTPS),默认使用 HTTPS
// Bucket 的 Endpoint,以华北2(北京)为例:https://tos-cn-beijing.volces.com
var endpoint = "https://tos-cn-beijing.volces.com";
var region = "cn-beijing";
// 填写 BucketName
var bucketName = "*** Provide your bucket name ***";
// 填写对象名
var objectKey = "*** Provide your object key ***";
// 创建TOSClient实例
var client = TosClientBuilder.Builder().SetAk(ak).SetSk(sk).SetEndpoint(endpoint).SetRegion(region).Build();
try
{
// 获取对象 ACL
var getObjectACLInput = new GetObjectACLInput()
{
Bucket = bucketName,
Key = objectKey,
};
var getObjectAclOutput = client.GetObjectACL(getObjectACLInput);
Console.WriteLine("GetObjectACL succeeded, Request ID {0}", getObjectAclOutput.RequestID);
// 获取 Bucket Owner 信息
foreach (var grant in getObjectAclOutput.Grants)
{
// 授予者所拥有的 Bucket 权限
Console.WriteLine("Grant Permission {0}", grant.Permission);
// 当 Type 为 CanonicalUser 时,表示权限授予者的 ID
Console.WriteLine("Grant Grantee ID {0}", grant.Grantee.ID);
// 权限被授予者的名称
Console.WriteLine("Grant Grantee DisplayName {0}", grant.Grantee.DisplayName);
// 被授权的用户组
Console.WriteLine("Grant Grantee Canned {0}", grant.Grantee.Canned);
// 权限授予者的类型
Console.WriteLine("Grant Grantee Type {0}", grant.Grantee.Type);
}
}
catch (TosServerException ex)
{
Console.WriteLine("GetObjectACL failed, Request ID {0}", ex.RequestID);
Console.WriteLine("GetObjectACL failed, Status Code {0}", ex.StatusCode);
Console.WriteLine("GetObjectACL failed, Response Error Code {0}", ex.Code);
Console.WriteLine("GetObjectACL failed, Response Error Message {0}", ex.Message);
}
catch (TosClientException ex)
{
Console.WriteLine("GetObjectACL failed, Error Message {0}", ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("GetObjectACL failed, {0}", ex.Message);
}
}
}
}