Mongo Change Stream出现‘not authorized to execute command’权限报错
看起来你在通过Scala应用配置ChangeStream时碰了权限钉子,我来帮你拆解下可能的原因和解决办法:
1. 核心问题:账号缺少ChangeStream所需权限
ChangeStream不是只靠普通的read权限就能用的,你的账号需要明确拥有changeStream权限(或者包含该权限的角色,比如readWrite)。
怎么给账号加权限?
登录到MongoDB的shell(可以连远程mongod或者本地mongos),执行以下命令:
// 切换到账号所在的数据库(如果是admin超级账号就切到admin) use myDB // 给用户授予read和changeStream权限 db.grantRolesToUser("username", [ { role: "read", db: "myDB" }, { role: "changeStream", db: "myDB" } ])
如果只想给特定集合开权限,可以更精准:
db.grantRolesToUser("username", [ { role: "read", db: "myDB", collection: "your_target_collection" }, { role: "changeStream", db: "myDB", collection: "your_target_collection" } ])
2. 确认认证数据库是否正确
你的代码里用的是MongoCredential.createCredential("username", "myDB", ...),要注意:
- 如果这个账号是在
myDB数据库下创建的,那没问题; - 如果账号是在
admin数据库创建的(超级账号),这里的第二个参数必须改成"admin",否则认证会失败,后续的ChangeStream自然也没权限。
修正后的代码示例:
private val mongo = new MongoClient( new ServerAddress("localhost", 27017), MongoCredential.createCredential("username", "admin", "password".toCharArray), MongoClientOptions.builder().addServerListener(ServerStateListener).build() )
3. 检查mongos的认证转发配置
因为你是通过本地mongos连接远程mongod,要确保mongos本身已经启用了认证(启动参数带--auth),并且能正确把客户端的认证信息转发到后端的mongod节点。如果mongos没有配置认证,可能会导致后端mongod拒绝未授权的ChangeStream请求。
4. 先验证基础连接权限
在排查ChangeStream之前,先写个简单的测试代码,比如查询目标集合的文档,确认账号能正常访问数据库:
val db = mongo.getDatabase("myDB") val collection = db.getCollection("your_target_collection") val count = collection.countDocuments() println(s"Collection count: $count")
如果这个基础查询都报错,那先解决核心的认证/权限问题,再处理ChangeStream。
内容的提问来源于stack exchange,提问作者nukie
相关产品推荐
相关产品推荐

