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

管理对象访问权限(Node.js SDK)

最近更新时间2024.02.04 18:30:57

首次发布时间2022.05.13 18:28:15

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

设置对象的读写权限

注意

设置对象的读写权限前,您必须具有 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 权限信息,或在请求头中设置访问权限。

请求体中填写详细 ACL 权限信息

// 导入 SDK, 当 TOS Node.JS SDK 版本小于 2.5.2 请把下方 TosClient 改成 TOS 导入
import { TosClient, TosClientError, TosServerError, GranteeType, PermissionType } from '@volcengine/tos-sdk';

// 创建客户端
const client = new TosClient({
  accessKeyId: process.env['TOS_ACCESS_KEY'],
  accessKeySecret: process.env['TOS_SECRET_KEY'],
  region: "Provide your region", // 填写 Bucket 所在地域。以华北2(北京)为例,则 "Provide your region" 填写为 cn-beijing。
  endpoint: "Provide your endpoint", // 填写域名地址
});

function handleError(error) {
  if (error instanceof TosClientError) {
    console.log('Client Err Msg:', error.message);
    console.log('Client Err Stack:', error.stack);
  } else if (error instanceof TosServerError) {
    console.log('Request ID:', error.requestId);
    console.log('Response Status Code:', error.statusCode);
    console.log('Response Header:', error.headers);
    console.log('Response Err Code:', error.code);
    console.log('Response Err Msg:', error.message);
  } else {
    console.log('unexpected exception, message: ', error);
  }
}

async function main() {
  try {
    const bucketName = 'node-sdk-test-bucket';
    // 指定的 objectKey
    const objectKey = '*** Provide your object key ***';

    // 设置对象 ACL
    const { requestId } = await client.putObjectAcl({
      bucket: bucketName,
      key: objectKey,
      // 如果桶开启了多版本,通过设置 versionId 来设置指定版本
      versionId: '',
      aclBody: {
        Owner: {
          // 获取 Bucket Owner ID
          ID: 'ownerid',
        },
        Grants: [
          {
            Grantee: {
              ID: 'userId',
              Type: GranteeType.GranteeUser,
            },
            Permission: PermissionType.PermissionRead,
          },
        ],
      },
    });
    console.log('putObjectAcl Request ID:', requestId);
  } catch (error) {
    handleError(error);
  }
}

main();

请求头中设置访问权限

通过 x-tos-acl 请求头设置对象的读写权限包含以下类型。

访问权限

描述

访问权限值

私有

对象的所有者拥有所有权限,其他用户没有权限操作该对象。

private

公共读

对象的所有者拥有所有权限,其他用户只有该对象的读权限。

public-read

公共读写

所有用户都有该对象的读权限。

public-read-write

认证用户读

对象的所有者拥有所有权限,认证用户拥有该对象的读权限。

authenticated-read

桶所有者读

对象所有者拥有所有权限,桶所有者拥有此对象的读权限。

bucket-owner-read

桶所有者具备所有权限

桶所有者和对象所有者都拥有对象的所有操作权限。

bucket-owner-full-control

以下代码通过 x-tos-acl 设置对象的读写权限。

// 导入 SDK, 当 TOS Node.JS SDK 版本小于 2.5.2 请把下方 TosClient 改成 TOS 导入
import { TosClient, TosClientError, TosServerError, ACLType } from '@volcengine/tos-sdk';

// 创建客户端
const client = new TosClient({
  accessKeyId: process.env['TOS_ACCESS_KEY'],
  accessKeySecret: process.env['TOS_SECRET_KEY'],
  region: "Provide your region", // 填写 Bucket 所在地域。以华北2(北京)为例,则 "Provide your region" 填写为 cn-beijing。
  endpoint: "Provide your endpoint", // 填写域名地址
});

function handleError(error) {
  if (error instanceof TosClientError) {
    console.log('Client Err Msg:', error.message);
    console.log('Client Err Stack:', error.stack);
  } else if (error instanceof TosServerError) {
    console.log('Request ID:', error.requestId);
    console.log('Response Status Code:', error.statusCode);
    console.log('Response Header:', error.headers);
    console.log('Response Err Code:', error.code);
    console.log('Response Err Msg:', error.message);
  } else {
    console.log('unexpected exception, message: ', error);
  }
}

async function main() {
  try {
    const bucketName = 'node-sdk-test-bucket';
    // 指定的 objectKey
    const objectKey = '*** Provide your object key ***';

    // 设置对象 ACL
    const { requestId } = await client.putObjectAcl({
      bucket: bucketName,
      key: objectKey,
      // 如果桶开启了多版本,通过设置 versionId 来设置指定版本
      // versionId: '',
      acl: ACLType.ACLPublicRead,
    });
    console.log('putObjectAcl Request ID:', requestId);
  } catch (error) {
    handleError(error);
  }
}

main();

相关文档

关于设置对象的读写权限 API 文档,请参见 PutObjectAcl

获取对象的读写权限

注意

获取对象的访问权限前,您必须具有 tos:GetObjectACL 权限,或具备 READ_ACP 的对象 ACL 权限,具体操作,请参见权限配置指南

以下代码用于获取对象的访问权限。

// 导入 SDK, 当 TOS Node.JS SDK 版本小于 2.5.2 请把下方 TosClient 改成 TOS 导入
import { TosClient, TosClientError, TosServerError, ACLType } from '@volcengine/tos-sdk';

// 创建客户端
const client = new TosClient({
  accessKeyId: process.env['TOS_ACCESS_KEY'],
  accessKeySecret: process.env['TOS_SECRET_KEY'],
  region: "Provide your region", // 填写 Bucket 所在地域。以华北2(北京)为例,则 "Provide your region" 填写为 cn-beijing。
  endpoint: "Provide your endpoint", // 填写域名地址
});

function handleError(error) {
  if (error instanceof TosClientError) {
    console.log('Client Err Msg:', error.message);
    console.log('Client Err Stack:', error.stack);
  } else if (error instanceof TosServerError) {
    console.log('Request ID:', error.requestId);
    console.log('Response Status Code:', error.statusCode);
    console.log('Response Header:', error.headers);
    console.log('Response Err Code:', error.code);
    console.log('Response Err Msg:', error.message);
  } else {
    console.log('unexpected exception, message: ', error);
  }
}

async function main() {
  try {
    const bucketName = 'node-sdk-test-bucket';
    // 指定的 objectKey
    const objectKey = '*** Provide your object key ***';

    // 设置对象 ACL
    const { data, requestId } = await client.getObjectAcl({
      bucket: bucketName,
      key: objectKey,
      // 如果桶开启了多版本,通过设置 versionId 来设置指定版本
      // versionId: '',
    });
    console.log('getObjectAcl Request ID:', requestId);

    // 获取对象 Owner 信息
    console.log('GetObjectACL Owner: %o', data.Owner);
    for (const grant of data.Grants) {
      // 授予者所拥有的权限
      console.log('Grant Permission:', grant.Permission);
      // 权限授予者的类型
      console.log('Grant GranteeV2 Type', grant.Grantee.Type);
      // 当 Type 为 CanonicalUser 时,表示权限授予者的 ID
      console.log('Grant GranteeV2 ID', grant.Grantee.ID);
      // 权限被授予者的名称
      console.log('Grant GranteeV2 DisplayName', grant.Grantee.DisplayName);
      // 被授权的用户组
      console.log('Grant GranteeV2 Canned', grant.Grantee.Canned);
    }
  } catch (error) {
    handleError(error);
  }
}

main();

相关文档

关于获取对象的读写权限 API 文档,请参见 GetObjectAcl