C++管理文件訪問(wèn)權(quán)限
本文中含有需要您注意的重要提示信息,忽略該信息可能對(duì)您的業(yè)務(wù)造成影響,請(qǐng)務(wù)必仔細(xì)閱讀。
本文介紹如何管理文件訪問(wèn)權(quán)限。
注意事項(xiàng)
本文以華東1(杭州)外網(wǎng)Endpoint為例。如果您希望通過(guò)與OSS同地域的其他阿里云產(chǎn)品訪問(wèn)OSS,請(qǐng)使用內(nèi)網(wǎng)Endpoint。關(guān)于OSS支持的Region與Endpoint的對(duì)應(yīng)關(guān)系,請(qǐng)參見(jiàn)OSS地域和訪問(wèn)域名。
本文以OSS域名新建OSSClient為例。如果您希望通過(guò)自定義域名、STS等方式新建OSSClient,請(qǐng)參見(jiàn)新建OssClient。
要設(shè)置Object訪問(wèn)權(quán)限,您必須具有
oss:PutObjectAcl
權(quán)限;要獲取Object訪問(wèn)權(quán)限,您必須具有oss:GetObjectAcl
權(quán)限。具體操作,請(qǐng)參見(jiàn)為RAM用戶授權(quán)自定義的權(quán)限策略。
讀寫(xiě)權(quán)限類型
Object包含以下4種讀寫(xiě)權(quán)限:
Object的訪問(wèn)權(quán)限優(yōu)先級(jí)高于Bucket的訪問(wèn)權(quán)限。例如,Bucket的訪問(wèn)權(quán)限為私有,而Object的訪問(wèn)權(quán)限是公共讀,則任何人(包括匿名用戶)都可以對(duì)該Object進(jìn)行讀操作。
權(quán)限類型 | 描述 | 權(quán)限值 |
繼承Bucket(默認(rèn)權(quán)限) | 當(dāng)Object未設(shè)置訪問(wèn)權(quán)限時(shí),該Object遵循Bucket的讀寫(xiě)權(quán)限,即Bucket是什么權(quán)限,Object就是什么權(quán)限。 | CannedAccessControlList.Default |
私有 | 只有Object的擁有者可以對(duì)該Object進(jìn)行讀寫(xiě)操作,其他人無(wú)法訪問(wèn)該Object。 | CannedAccessControlList.Private |
公共讀 | 只有該Object的擁有者可以對(duì)該Object進(jìn)行寫(xiě)操作,任何人(包括匿名訪問(wèn)者)都可以對(duì)該Object進(jìn)行讀操作。 警告 互聯(lián)網(wǎng)上任何用戶都可以對(duì)該Object進(jìn)行訪問(wèn),這有可能造成您數(shù)據(jù)的外泄以及費(fèi)用激增,請(qǐng)謹(jǐn)慎操作。 | CannedAccessControlList.PublicRead |
公共讀寫(xiě) | 任何人(包括匿名訪問(wèn)者)都可以對(duì)該Object進(jìn)行讀寫(xiě)操作。 警告 互聯(lián)網(wǎng)上任何用戶都可以對(duì)該Object進(jìn)行訪問(wèn),并且向該Object寫(xiě)入數(shù)據(jù)。這有可能造成您數(shù)據(jù)的外泄以及費(fèi)用激增,如果被人惡意寫(xiě)入違法信息還可能會(huì)侵害您的合法權(quán)益。除特殊場(chǎng)景外,不建議您配置公共讀寫(xiě)權(quán)限。 | CannedAccessControlList.PublicReadWrite |
設(shè)置文件訪問(wèn)權(quán)限
以下代碼用于設(shè)置指定Object的訪問(wèn)權(quán)限:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號(hào)信息。*/
/* yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫(xiě)為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 填寫(xiě)B(tài)ucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫(xiě)Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "exampledir/exampleobject.txt";
/* 初始化網(wǎng)絡(luò)等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 設(shè)置文件訪問(wèn)權(quán)限。*/
SetObjectAclRequest request(BucketName, ObjectName);
request.setAcl(CannedAccessControlList::Private);
auto outcome = client.SetObjectAcl(request);
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "SetObjectAcl fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
/* 釋放網(wǎng)絡(luò)等資源。*/
ShutdownSdk();
return 0;
}
獲取文件訪問(wèn)權(quán)限
以下代碼用于獲取指定Object的訪問(wèn)權(quán)限:
#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;
int main(void)
{
/* 初始化OSS賬號(hào)信息。*/
/* yourEndpoint填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Endpoint。以華東1(杭州)為例,Endpoint填寫(xiě)為https://oss-cn-hangzhou.aliyuncs.com。*/
std::string Endpoint = "yourEndpoint";
/* yourRegion填寫(xiě)B(tài)ucket所在地域?qū)?yīng)的Region。以華東1(杭州)為例,Region填寫(xiě)為cn-hangzhou。*/
std::string Region = "yourRegion";
/* 填寫(xiě)B(tài)ucket名稱,例如examplebucket。*/
std::string BucketName = "examplebucket";
/* 填寫(xiě)Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。*/
std::string ObjectName = "exampledir/exampleobject.txt";
/* 初始化網(wǎng)絡(luò)等資源。*/
InitializeSdk();
ClientConfiguration conf;
conf.signatureVersion = SignatureVersionType::V4;
/* 從環(huán)境變量中獲取訪問(wèn)憑證。運(yùn)行本代碼示例之前,請(qǐng)確保已設(shè)置環(huán)境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。*/
auto credentialsProvider = std::make_shared<EnvironmentVariableCredentialsProvider>();
OssClient client(Endpoint, credentialsProvider, conf);
client.SetRegion(Region);
/* 獲取文件訪問(wèn)權(quán)限。*/
GetObjectAclRequest request(BucketName, ObjectName);
auto outcome = client.GetObjectAcl(request);
if (!outcome.isSuccess()) {
/* 異常處理。*/
std::cout << "GetObjectAcl fail" <<
",code:" << outcome.error().Code() <<
",message:" << outcome.error().Message() <<
",requestId:" << outcome.error().RequestId() << std::endl;
return -1;
}
else {
std::cout << " GetObjectAcl success, Acl:" << outcome.result().Acl() << std::endl;
}
/* 釋放網(wǎng)絡(luò)等資源。*/
ShutdownSdk();
return 0;
}
相關(guān)文檔
關(guān)于設(shè)置Object訪問(wèn)權(quán)限的API接口說(shuō)明,請(qǐng)參見(jiàn)PutObjectACL。
關(guān)于獲取Object訪問(wèn)權(quán)限的API接口說(shuō)明,請(qǐng)參見(jiàn)GetObjectACL。