产品动态
公告
分类项 | 说明/规则 |
连接方式 | 请尽可能使用长连接访问数据库。 |
启用前置条件 | 启用 CAM 验证前,需要提前在腾讯云访问管理(CAM)中配置好相关的权限策略。 |
账号数量 | 单个数据库实例内,建议不超过10个账号开启 CAM 验证。 |
修改密码 | 启用 CAM 验证后,不支持修改该账号密码,只能通过 CAM 提供的 Token 进行访问。 |
实例类型 | 不支持为开启了“免密码认证”的实例启用 CAM 验证。 |
关闭操作 | 关闭 CAM 验证时,必须为该账号设置一个新的静态密码,否则将无法连接数据库。 |
版本说明 | 支持 MongoDB 4.4 及以上版本,同时兼容物理盘与云盘版。 |
{"statement": [{"action": ["cam:GetMongoDBPassword"],"effect": "allow","resource": ["qcs::cam::uin/<用户 uin>:resourceUser/<实例 ID>/<账号名>",]}],"version": "2.0"}






<dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-dbauth-sdk-java</artifactId><version>1.0.4</version></dependency>
<dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.1.1039</version></dependency>
package com.tencentcloud.dbauth;import com.tencentcloudapi.common.Credential;import com.tencentcloud.dbauth.model.GenerateAuthenticationTokenRequest;import com.tencentcloudapi.common.exception.TencentCloudSDKException;import com.tencentcloudapi.common.profile.ClientProfile;import com.tencentcloudapi.common.profile.HttpProfile;public class GenerateDBAuthentication {public static void main(String[] args) {// 定义认证令牌的参数String region = "<实例所在地域>";String instanceId = "<实例 ID>";String userName = "<账号名>";// 从环境变量中获取凭证Credential credential = new Credential(System.getenv("<TENCENTCLOUD_SECRET_ID>"), System.getenv("<TENCENTCLOUD_SECRET_KEY>"));System.out.println(getAuthToken(region, instanceId, userName, credential));}public static String getAuthToken(String region, String instanceId, String userName, Credential credential) {try {// 实例化一个 http 选项,可选的,没有特殊需求可以跳过HttpProfile httpProfile = new HttpProfile();httpProfile.setEndpoint("cam.tencentcloudapi.com");// 实例化一个 client 选项,可选的,没有特殊需求可以跳过ClientProfile clientProfile = new ClientProfile();clientProfile.setHttpProfile(httpProfile);// 构建 GenerateAuthenticationTokenRequestGenerateAuthenticationTokenRequest tokenRequest = GenerateAuthenticationTokenRequest.builder().region(region).credential(credential).userName(userName).instanceId(instanceId).clientProfile(clientProfile) // clientProfile 是可选的.build();return DBAuthentication.generateAuthenticationToken(tokenRequest);} catch (TencentCloudSDKException e) {e.printStackTrace();}return "";}}
<dependency><groupId>org.mongodb</groupId><artifactId>mongodb-driver-sync</artifactId><version>4.11.0</version></dependency>
import com.mongodb.client.MongoClient;import com.mongodb.client.MongoClients;import com.mongodb.client.MongoDatabase;public class MongoDBConnectExample {public static void main(String[] args) {// 连接字符串格式String connectionString = "mongodb://<账号名>:<密码>@localhost:27017/<数据库名>?authSource=admin";try (MongoClient mongoClient = MongoClients.create(connectionString)) {MongoDatabase database = mongoClient.getDatabase("<数据库名>");System.out.println("Connected to MongoDB successfully!");// 你可以使用database进行后续操作} catch (Exception e) {e.printStackTrace();}}}
import loggingimport osimport timefrom pymongo import MongoClientfrom dbauth.db_authentication import DBAuthenticationfrom dbauth.model.generate_authentication_token_request import GenerateAuthenticationTokenRequestfrom tencentcloud.common import credentialfrom tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKExceptionfrom tencentcloud.common.profile.client_profile import ClientProfilefrom tencentcloud.common.profile.http_profile import HttpProfile# 配置root loggerlogging.basicConfig(level=logging.INFO,format='[%(asctime)s] - [%(threadName)s] - {%(module)s:%(funcName)s:%(lineno)d} %(levelname)s - %(message)s',datefmt='%Y-%m-%d %H:%M:%S')log = logging.getLogger(__name__)def main():region = "ap-guangzhou"instance_id = "cmgo-xxxx" # MongoDB实例IDuser_name = "camtest"host = "10.0.0.1"port = 27017db_name = "test"secret_id = os.environ['AK']secret_key = os.environ['SK']client = Nonetry:# 获取MongoDB连接client = get_mongo_connection_using_cam(secret_id, secret_key, region,instance_id, user_name, host, port, db_name)# 验证连接是否成功db = client[db_name]# 查询测试dummy_collections = db.list_collection_names()log.info(f"Collections: {dummy_collections}")log.info("Success!")except Exception as e:log.error(f"An error occurred: {e}")finally:if client:client.close()def get_mongo_connection_using_cam(secret_id, secret_key, region, instance_id, user_name, host, port, db_name):cred = credential.Credential(secret_id, secret_key)max_attempts = 3last_exception = Nonefor attempt in range(1, max_attempts + 1):try:auth_token = get_auth_token(region, instance_id, user_name, cred)# MongoDB连接字符串mongo_uri = (f"mongodb://{user_name}:{auth_token}@{host}:{port}/{db_name}?authSource={db_name}")client = MongoClient(mongo_uri, serverSelectionTimeoutMS=5000)# 测试连接client.admin.command("ping")return clientexcept Exception as e:last_exception = elog.info(f"Attempt {attempt} failed: {e}")time.sleep(5)log.error(f"All attempts failed: {last_exception}")raise last_exceptiondef get_auth_token(region, instance_id, user_name, cred):try:http_profile = HttpProfile()http_profile.endpoint = "cam.tencentcloudapi.com"client_profile = ClientProfile()client_profile.httpProfile = http_profilerequest = GenerateAuthenticationTokenRequest(region=region,instance_id=instance_id,user_name=user_name,credential=cred,client_profile=client_profile)return DBAuthentication.generate_authentication_token(request)except TencentCloudSDKException as err:log.error(err)raiseif __name__ == "__main__":main()
文档反馈