展示数据库出现“未获得执行命令的授权”错误。

22

我花了一些时间试图找出问题所在,但是由于我无法找到答案,所以我决定在这里提问。

我在Windows 8上运行MongoDB(Windows 64位2008 R2+版本3.2.3),路径为:

C:\MongoDB\bin 用于安装

C:\data\db 用于数据文件夹

我按照官方文档中的这个视频这个教程进行了安装。

第一个可能的问题是,我不确定是否存在问题,就是客户端(mongo.exe)和服务器(mongod.exe)之间的连接。

我通过命令行(使用管理员权限)启动了mongod.exe,一切都进行得很顺利,我收到了以下消息:

waiting for connections on port 27017

但是当我通过一个新的命令行实例启动mongo.exe时,服务器(mongod.exe)没有打印出一条消息,说明有一个新的连接(在我观看的教程中是这样的)

另一方面,mongo.exe会打印

connecting to : test

目前我不确定一切是否正确,但我尝试了一些基本命令:

show dbs 返回 not authorized on admin to execute command

实际上,所有我尝试的命令都有相同的错误消息,即使是我刚刚使用 use 'dbName' 创建的“新”数据库。

一些网上的答案说我必须创建一个具有适当角色的用户,我尝试了这个。仍然出现相同的错误消息 not authorized to execute command

我的问题如下:

当我启动mongo.exe时,mongod.exe是否不显示新连接是正常的?如果正确,则我该怎么做才能使基本命令运行?

其他信息:

我尝试了几次卸载/重新安装,“自定义模式”和Windows安装程序中的“完整模式”,但始终导致相同的问题。

我还尝试按照官方文档创建MongoDB服务,但我不确定这是否是个好主意。(我不能添加更多链接,但它在我分享的第二个链接的一个部分中)

编辑区域:

我决定在另一台电脑上尝试它,这台电脑我已经多年没有碰过,运行的是Windows 7 64位。

我将MongoDB安装文件夹复制到此计算机的根目录下,创建了 \data\db 文件夹并启动了 mongod.exe。

然后我启动了 mongo.exe,这时 mongod.exe 打印出一条消息,指示有一个新的打开连接。但在我的实际电脑上不会出现这种情况。我认为问题就在这里,因为我能够从官方文档开始基本教程,并执行诸如创建新数据库、插入、查找、显示 dbs 等简单命令。这些都是我在实际电脑上无法完成的。

所以我认为问题来自于 mongod.exe 和 mongo.exe 之间的连接

您有任何想法,我该如何解决这个问题,因为我已经试过几次卸载。


当前用户的权限明显不正确。这是一个新的安装。首先进行无授权安装并熟悉操作。然后仔细按照教程进行设置(我建议使用主站点文档而非个人博客文章)以正确设置授权。 - Blakes Seven
你已经创建了用户吗?如果没有,请从配置文件中删除--auth,重新启动并重试。 - genericuser
由于这是一次全新的安装,我认为我没有创建用户。关于配置文件,我没有一个,因为我使用了.msi文件,如果需要的话,显然必须手动创建一个。 - Anjou
@BlakesSeven 所以我尝试按照官方文档(https://docs.mongodb.org/v3.2/tutorial/install-mongodb-on-windows/)重新安装MongoDB,但我仍然面临着同样的问题。这可能与mongod.exe和mongo.exe之间的连接有关吗?谢谢。 - Anjou
如果您正在使用MongoDB Compass,请查看我的解决方案 - Mr. Dang
8个回答

34

你应该使用访问控制来启动mongod实例,即--auth命令行选项,例如:

$ mongod --auth

让我们开始Mongo Shell,并在admin数据库中创建一个管理员:

$ mongo
> use admin
> db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

现在,如果你运行命令 "db.stats()" 或者 "show users",你会得到错误信息 "not authorized on admin to execute command..."

> db.stats()
{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { dbstats: 1.0, scale: undefined }",
        "code" : 13,
        "codeName" : "Unauthorized"
}

原因是您尚未向用户myUserAdmin授予"read"或"readWrite"角色。您可以按照以下方式执行:

> db.auth("myUserAdmin", "abc123")
> db.grantRolesToUser("myUserAdmin", [ { role: "read", db: "admin" } ])

现在您可以验证它(命令“show users”现在可用):

> show users
{
        "_id" : "admin.myUserAdmin",
        "user" : "myUserAdmin",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "read",
                        "db" : "admin"
                },
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}

现在如果运行 "db.stats()",你也将是OK的:

> db.stats()
{
        "db" : "admin",
        "collections" : 2,
        "views" : 0,
        "objects" : 3,
        "avgObjSize" : 151,
        "dataSize" : 453,
        "storageSize" : 65536,
        "numExtents" : 0,
        "indexes" : 3,
        "indexSize" : 81920,
        "ok" : 1
}

除了管理员数据库之外,该用户和角色机制也可以应用于MongoDB中的任何其他数据库。

(MongoDB版本3.4.3)


这给了我一个 [js] 错误:无法找到用户 myUserAdmin@test。 - Stepan Yakovenko
@StepanYakovenko,我刚试了一下4.0.9版本,这个方法仍然可以正常使用。不知道你在哪一步遇到了你提到的错误? - Yuci
很不幸,我不得不删除整个数据库来重新做这个,所以现在我无法再现它 :( - Stepan Yakovenko
1
@StepanYakovenko,你可能会遇到那个错误的原因是你忘记运行 use admin 命令了,因为我也遇到了同样的错误并检查后发现我在连接之后忘记运行该命令了。 - Vignesh S

16

在执行cmd-1创建用户之后,请使用cmd-2为该用户分配读/写/根角色,并通过命令"mongod --auth"重启mongodb。

为用户分配角色的好处是,您可以通过mongo shell或python/java等方式进行读/写操作,否则在尝试读取/写入数据库时将遇到“pymongo.errors.OperationFailure:未经授权”错误。

cmd-1:

use admin
db.createUser({
  user: "newUsername",
  pwd: "password",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})

命令-2:

db.grantRolesToUser('newUsername',[{ role: "root", db: "admin" }])

谢谢 - 这个答案确实解决了我的问题 - 我正在执行3.4.10社区版。仅添加读取角色并不能解决授权问题。对于其他人:我建议阅读以下页面以了解为什么需要进行此更改:https://docs.mongodb.com/manual/core/security-built-in-roles/。 - LMA1980

14

按照以下方式创建用户:

db.createUser(
      {
        user: "myUserAdmin",
        pwd: "abc123",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    )

然后按照以下方法连接它:

mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

查看手册:

https://docs.mongodb.org/manual/tutorial/enable-authentication/


1
如果我理解正确,MongoDB在为管理员数据库创建第一个用户时提供了一个异常。因此,在新安装后,我启动了mongod.exe然后mongo.exe,我使用''use admin''切换到管理数据库,并尝试使用您提供的代码创建用户。但是,我仍然收到错误消息,说:未经授权在管理员上执行命令。我的客户端是否未连接到服务器?因为我用Ctrl+C关闭了mongod.exe,但我仍然能够在mongo.exe上键入命令。它不应该像“已断开连接”之类的东西吗?谢谢。 - Anjou
显然应该显示未连接。在运行mongod之前,您不应该能够运行mongo。 - Istiak Morsalin
是的,连接出现了问题,因为即使mongod/mongo shell关闭,某个进程仍在监听默认端口。我将默认端口更改为一个空闲的端口,现在一切都正常工作了。谢谢你的帮助。 - Anjou
请在答案处打上勾。不用谢。@Anjou - Istiak Morsalin
如果你认为答案对你有帮助,请接受它作为正确答案。这也许是社区的一种礼貌。 - Istiak Morsalin
显示剩余2条评论

8

问题中提问者发布的答案副本:

解决方案

在上一次编辑后的更新之后,我稍微研究了一下客户端和服务器之间的连接,发现即使 mongod.exe 没有运行,仍然有 某些东西 通过 netstat -a 监听着 27017 端口。

所以我尝试使用随机端口启动服务器:

[dir]mongod.exe --port 2000

然后使用 Shell 命令行:
[dir]mongo.exe --port 2000

这一次,服务器打印了一条消息,表示有一个新的连接。 我输入了几个命令,一切都运行得非常完美,我开始从文档中学习基础教程以检查是否正常,目前看来一切都很好。


谢谢,这个问题花费了太多时间。在Windows 10上,似乎启用了消息队列mqsvc.exe,并且正在使用端口27017。 - dan

1

有两件事情,

1)您可以首先在没有用户名和密码的情况下运行mongodb实例。

2)然后使用以下查询将用户添加到mongodb的系统数据库(默认情况下)。

db.createUser({
  user: "myUserAdmin",
  pwd: "abc123",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})

感谢。


1
尝试这个...
use admin;
db.createUser({
   user: 'admin',
   pwd: 'SecurePass',
   roles: [ { role: 'root', db: 'admin' } ]
});
db.auth("admin", "SecurePass");
db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])

在执行db.grantRolesToUser()之前,请先执行db.auth()

解决我的问题 :)

如果不起作用,请尝试将角色更改为'readWrite'


0

对我来说,通过添加以下内容解决了问题:

1)“您可以先在不使用用户名和密码的情况下运行mongodb实例。---OK

2)“然后,您可以使用以下查询将用户添加到mongodb的系统数据库中,该数据库是默认数据库。”---OK

db.createUser({
  user: "myUserAdmin",
  pwd: "abc123",
  roles: [ { role: "userAdminAnyDatabase", db: "admin" } ],
  mechanisms:[ "SCRAM-SHA-1" ] // I added this line

})

-1

在我的情况下,是 Docker 在后台运行。如果你安装了 Docker,你可能想关闭它然后再试一次。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接