启用身份验证后无法从 local.system.replset 中删除文档

Posted

技术标签:

【中文标题】启用身份验证后无法从 local.system.replset 中删除文档【英文标题】:Cannot delete document from local.system.replset when authentication enabled 【发布时间】:2020-06-02 10:37:14 【问题描述】:

我有启用身份验证的 MongoDB 副本集。我想更改副本集名称。为此,我必须从 local.system.replset 集合中删除文档。我有分配了root@admin 角色的管理员用户,也有分配了readWrite@local 角色的普通用户。当我尝试使用上述任何用户从 shell 执行 remove 时,我得到 Unauthorized 异常:

> db.system.replset.remove()
WriteCommandError(
        "operationTime" : Timestamp(1582026365, 1),
        "ok" : 0,
        "errmsg" : "not authorized on local to execute command  delete: \"system.replset\", ordered: true, lsid:  id: UUID(\"43182bad-b13d-4ff4-a31b-3cdcb1dd49fa\") , $clusterTime:  clusterTime: Timestamp(1582026355, 1), signature:  hash: BinData(0, E9FD8A23702CE215B193423CAF1C2AF3FEE83D6B), keyId: 6794747247067136002  , $db: \"local\" ",
        "code" : 13,
        "codeName" : "Unauthorized",
        "$clusterTime" : 
                "clusterTime" : Timestamp(1582026365, 1),
                "signature" : 
                        "hash" : BinData(0,"CyCvFtgLkpdhIrsJV67KBlVwL+U="),
                        "keyId" : NumberLong("6794747247067136002")
                
        
)

如果我尝试在未启用身份验证的副本集上执行相同的命令,我可以成功删除记录。为了让用户从local.system.replset 中删除记录,我缺少什么角色?还是开启认证时不支持?

【问题讨论】:

【参考方案1】:

https://***.com/a/20120639/2138959 这个答案给了我一个提示,root 用户可能没有所需的权限,实际上它只有find 权限。我仍然不知道为什么readWrite@local 不允许写信给system.replicaset,但是当我使用findinsertremoveupdatebypassDocumentValidation、@987654331 添加新角色时@local.system.replset 资源的特权我终于能够删除副本集并更新名称。

另一个更简单的选择是将dbOwner@local 角色分配给用户。

【讨论】:

同样的问题,本地数据库不允许创建任何自定义角色。但是我们可以在管理数据库中为本地数据库创建角色。

以上是关于启用身份验证后无法从 local.system.replset 中删除文档的主要内容,如果未能解决你的问题,请参考以下文章

启用 2FA 后 Git 身份验证失败

sql server 无法用sql server身份验证

启动后启用/禁用身份验证选项

在 Kong 中启用基本身份验证和会话插件时如何获取用户 ID?

在启用身份验证的情况下,无法使用 DriverManager.getConnection(url, properties) 连接到 Derby

我在服务器上的iis上的身份验证选项中去掉了匿名访问,启用了集成windows身份验证