本文介绍如何获取和设置对象的访问权限。对象的访问权限优先级高于桶的访问权限,如果对象未设置访问权限,则遵循桶的访问权限。
注意
设置对象的读写权限前,您必须具有 tos:PutObjectACL
权限,或具备 WRITE_ACP 对象 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 权限信息,或在请求头中设置访问权限。
// 导入 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。