You need to enable JavaScript to run this app.
导航

管理对象读写权限(.NET SDK)

最近更新时间2024.02.04 18:31:07

首次发布时间2023.08.24 14:41:47

本文介绍如何获取和设置对象的访问权限。对象的访问权限优先级高于桶的访问权限,如果对象未设置访问权限,则遵循桶的访问权限。

注意事项

设置对象的读写权限之前,您需要确保账号拥有 tos:PutObjectACL 权限,或具备 WRITE_ACP 对象 ACL 权限,具体操作,请参见权限配置指南

设置对象的 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);
            }
        }
    }
}

相关文档

  • 关于设置对象的读写权限 API 接口详细介绍,请参见 PutObjectAcl
  • 关于获取对象的读写权限 API 接口详细介绍,请参见 GetObjectAcl