MongoDB root角色查询db.system.sessions.count()提示无权限如何解决
报错原因
- 查询对象错误:MongoDB默认将会话信息存储在
config库的system.sessions集合中,若当前处于admin库下执行db.system.sessions.count(),实际是尝试查询admin.system.sessions集合,你当前配置的角色没有该集合的查询权限,就会触发对应报错。 - 版本权限继承缺陷:MongoDB 4.2版本的内置
root角色权限继承存在小概率异常,查询全局会话列表需要的viewAllSessions集群权限未被正常继承,导致权限校验不通过。 - 认证上下文异常:登录时未指定正确的认证库,虽然你的用户属于
admin库,但如果登录时没有加--authenticationDatabase admin参数,会默认使用当前连接的库进行认证,导致角色权限未生效。 - 分片集群访问方式错误:如果你是直接连接分片集群的单个分片主节点执行命令,而非通过
mongos路由节点访问,分片节点的本地权限校验会拦截集群级别的会话查询请求,即使配置了全局角色也会报错。
排查解决思路
- 优先修正查询语句,指定查询
config库的会话集合,执行命令:
也可以直接执行跨库查询命令:use config; db.system.sessions.count()
验证修正后是否还会报错。db.getSiblingDB('config').system.sessions.count() - 检查当前登录的认证上下文,执行命令:
查看返回结果中db.runCommand({connectionStatus:1})authInfo.authenticatedUsers字段,确认用户信息和所属角色已经正确加载。 - 如果确认是权限缺失问题,可手动给用户授予
viewAllSessions权限:
也可以直接授予包含该权限的use admin db.grantPrivilegesToUser("admshard", [ { resource: { cluster: true }, actions: [ "viewAllSessions" ] } ])clusterMonitor内置角色:use admin db.grantRolesToUser("admshard", [{role: "clusterMonitor", db: "admin"}]) - 分片集群场景下不要直接连接单个分片节点执行集群级查询,改为通过
mongos路由节点执行对应操作。 - 如果你确实需要查询
admin库下的system.sessions集合(非常规场景),可以单独授予该集合的查询权限:use admin db.grantPrivilegesToUser("admshard", [ { resource: { db: "admin", collection: "system.sessions" }, actions: [ "find" ] } ])
内容的提问来源于stack exchange,提问作者no-stale-reads
相关产品推荐
相关产品推荐

