本文介绍如何获取和设置对象的访问权限。对象的访问权限优先级高于桶的访问权限,如果对象未设置访问权限,则遵循桶的访问权限。
设置对象的读写权限之前,您需要确保账号拥有 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); } } } }