1. 认证失败的典型表现
当使用pymongo连接MongoDB数据库时,认证失败通常会抛出以下异常:
pymongo.errors.OperationFailure: Authentication failed.
或者更具体的错误信息:
pymongo.errors.ConfigurationError: Invalid credentials
2. 常见原因分析
2.1 凭证信息错误
这是最常见的原因,包括:
- 用户名或密码拼写错误
- 使用了错误的认证数据库
- 特殊字符未正确转义
2.2 连接字符串格式问题
MongoDB连接URI的常见格式问题:
# 错误示例
client = MongoClient("mongodb://user:pass@host:port")
# 正确示例
client = MongoClient("mongodb://user:pass@host:port/dbname?authSource=admin")
2.3 数据库配置问题
服务端可能存在的问题:
- 未启用认证机制
- 用户权限配置不当
- 使用了错误的认证机制(SCRAM-SHA-1/256)
3. 解决方案
3.1 验证凭证信息
使用MongoDB Shell验证凭证:
mongo -u username -p password --authenticationDatabase admin
3.2 检查连接字符串
推荐使用URI连接方式并明确指定参数:
from pymongo import MongoClient
uri = "mongodb://{username}:{password}@{host}:{port}/{dbname}?authSource=admin"
client = MongoClient(uri)
3.3 调试连接问题
启用pymongo的日志记录:
import logging
logger = logging.getLogger('pymongo')
logger.setLevel(logging.DEBUG)
4. 高级排查技巧
4.1 网络连通性检查
使用telnet或nc检查端口是否开放:
telnet mongodb_host 27017
4.2 服务端日志检查
查看MongoDB服务端日志获取详细错误:
tail -f /var/log/mongodb/mongod.log
4.3 使用SSL连接
当需要安全连接时:
client = MongoClient(
uri,
ssl=True,
ssl_cert_reqs=CERT_NONE # 根据实际情况调整
)
5. 预防措施
- 使用环境变量存储敏感凭证
- 实现连接池管理
- 定期轮换数据库密码
- 配置适当的用户权限