mongodb 在使用metamodel getCollectionNames拉取到系统表

在MongoDB 4.0.28、4.0.14和5.0.5版本中,遇到一个用户权限问题。用户xianchang对数据库longtest有readWrite权限,但无权访问system.profile集合。尽管longtestAdmin用户有开启DatabaseProfiler的权限,当使用xianchang用户通过Metamodel执行db.getCollectionNames()时,由于不具find()权限,导致了'notauthorizedonlongtesttoexecutecommand'错误。Navicat同样显示了system.profile,但实际查询会失败。问题在于如何正确配置用户权限以避免此类异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Query failed with error code 13 and error message 'not authorized on longtest to execute command { find: "system.profile", limit: 1000, $db: "longtest", $readPreference: { mode: "primaryPreferred" } }

没有开场白,直接说,mongodb 版本 4.0.28、4.0.14、5.0.5发现的问题

 我有个用户 xianchang 对 数据库 longtest 有 readWrite。
然后另一个用户longtestAdmin  对数据库 longtest 有权限开启 Database Profiler 的权限。

Database Profiler — MongoDB Manual

这时当我用metamodel 用xianchang用户 使用 db.getCollectionNames()就会拉取到system.profile 这张表,

 

但是用户 xianchang 对 system.profile 这张表是没有find() 权限的

所以后端报错:

com.mongodb.MongoQueryException: Query failed with error code 13 and error message 'not authorized on longtest to execute command { find: "system.profile", limit: 1000, $db: "longtest", $readPreference: { mode: "primaryPreferred" } }' on server 172.16.0.209:28017
    at com.mongodb.operation.FindOperation$1.call(FindOperation.java:706)
    at com.mongodb.operation.FindOperation$1.call(FindOperation.java:695)
    at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:462)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:406)
    at com.mongodb.operation.FindOperation.execute(FindOperation.java:695)
    at com.mongodb.operation.FindOperation.execute(FindOperation.java:83)
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:179)
    at com.mongodb.client.internal.MongoIterableImpl.execute(MongoIterableImpl.java:132)
    at com.mongodb.client.internal.MongoIterableImpl.iterator(MongoIterableImpl.java:86)
    at org.apache.metamodel.mongodb.mongo3.MongoDbDataContext.detectTable(MongoDbDataContext.java:155)
    at org.apache.metamodel.mongodb.mongo3.MongoDbDataContext.detectSchema(MongoDbDataContext.java:132)
    at org.apache.metamodel.mongodb.mongo3.MongoDbDataContext.<init>(MongoDbDataContext.java:113)

在metamodel 的源码中便会用的find()语句

在客户的那边使用Navicat 遍历 db.getCollectionNames()也发现了这张表,

 暂时先写这么多有空再补……请有懂的大佬赐教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值