MongoDB - 管理员用户未被授权

324
我正在尝试为我的MongoDB添加授权验证,所有操作都在Linux上进行,并使用MongoDB 2.6.1版本。mongod.conf 文件采用旧的兼容格式(这是安装时自带的)。
1)我按照此处(3)描述的方式创建了管理员用户: http://docs.mongodb.org/manual/tutorial/add-user-administrator/ 2)然后,我取消注释 mongod.conf 文件中的以下行: auth = true 3)最后,我重启了 mongod 服务,并尝试使用以下命令登录: /usr/bin/mongo localhost:27017/admin -u sa -p pwd
4)我可以连接,但它在连接时显示以下内容。
MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:47:16 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }

5) 现在看起来我创建的这个sa用户完全没有权限。

root@test02:~# mc
MongoDB shell version: 2.6.1
connecting to: localhost:27017/admin
Welcome to the MongoDB shell!
The current date/time is: Thu May 29 2014 17:57:03 GMT-0400 (EDT)
Error while trying to show server startup warnings: not authorized on admin to execute command { getLog: "startupWarnings" }
[admin] 2014-05-29 17:57:03.011 >>> use admin
switched to db admin
[admin] 2014-05-29 17:57:07.889 >>> show collections
2014-05-29T17:57:10.377-0400 error: {
        "$err" : "not authorized for query on admin.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[admin] 2014-05-29 17:57:10.378 >>> use test
switched to db test
[test] 2014-05-29 17:57:13.466 >>> show collections
2014-05-29T17:57:15.930-0400 error: {
        "$err" : "not authorized for query on test.system.namespaces",
        "code" : 13
} at src/mongo/shell/query.js:131
[test] 2014-05-29 17:57:15.931 >>>

什么是问题?我已经按照MongoDB文档的规定重复了这个过程3次,但它不起作用。我期望这个"sa"用户被授权做任何事情,以便他可以创建其他用户并给他们更具体的权限。

29
这非常令人烦恼或者文档说明不够清晰。我自己也曾经遇到过类似的问题。最终,我使用具有全局“root”角色的用户仍然无法执行某些命令。 - ToBe
17个回答

787

我也曾在同一个问题上苦思冥想,当我将角色设置为根用户并添加第一个管理员用户后,一切都运作良好。

use admin
db.createUser(
  {
    user: 'admin',
    pwd: 'password',
    roles: [ { role: 'root', db: 'admin' } ]
  }
);
exit;

如果您已经创建了admin用户,则可以像这样更改其角色:

use admin;
db.grantRolesToUser('admin', [{ role: 'root', db: 'admin' }])

如需完整的身份验证设置参考,请参阅我在互联网上研究数小时后编制的步骤


235
为什么文档里要写成userAdminAnyDatabase而不是root,这种蠢事让我浪费了一个小时。WTF! - akostadinov
19
这个想法是先创建一个仅用于管理其他用户的用户(因此角色以"userAdmin"开头),然后再创建普通用户。这种做法听起来有道理,但我第一次也没理解对… @akostadinov - TomTasche
16
在MongoDB v3.4.7版本中,以下方法不起作用:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }]) - user124384
4
@Cerin 这段代码 确实 对我起作用了:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }]),这让我感到困惑。我没有权限运行命令,然而我可以运行一个命令来使自己成为根用户,然后再运行那个命令。非常奇怪 :S - user993683
5
我知道上游文档提到了这一点,如果你正在四处寻找身份验证方法,你需要使用管理员数据库进行身份验证,像这样:use admin;然后db.auth("username", "password");希望这能帮助到某些人。 - Harlin
显示剩余8条评论

48

有点令人困惑 - 我认为您需要授予自己读写权限才能查询数据库。具有dbadmin或useradmin身份的用户可以管理数据库(包括授予自己其他权限),但不能执行查询或编写数据。

因此,请授予自己读写权限,然后您就可以了解了 -

http://docs.mongodb.org/manual/reference/built-in-roles/#readWrite


我不确定这个答案与问题是否相关,但无论如何它提供了错误的信息。dbOwner角色包括readWrite角色:http://docs.mongodb.org/manual/reference/built-in-roles/#dbOwner - Andy Triggs
11
答案是正确的 - dbadmin和useradmin角色(这是原帖询问的内容)不包括readWrite权限。dbOwner角色拥有该权限,但这不是原帖作者使用和询问的角色。 - John Petrone
3
你说得完全正确。抱歉,我花了太长时间来处理角色,导致有些困惑了。 - Andy Triggs
1
那么您可以拥有一个管理员用户来访问实际的MongoDB服务器,然后为特定数据库设置其他用户? - basickarl

36
也许举一个快速更改当前用户的例子对某些人会有所帮助。这就是我实际上正在寻找的内容。
根据@JohnPetrone的建议,我使用readWrite角色将其授予我的管理员用户,使用grantRolesToUser
> use admin
> db.grantRolesToUser("admin",["readWrite"])
> show collections
system.users
system.version

8
当我执行这个操作时,出现了 Error: not authorized on admin to execute command 的错误提示。 - SirHawrk

35

你可以尝试:使用 --authenticationDatabase 参数会有所帮助。

mongo --port 27017 -u "admin" -p "password" --authenticationDatabase "admin"

如果您不想为用户添加角色,只是暂时需要这个功能,那么这是最好的方法。 - Didier L

13

我知道我的回答来得很晚,但是我希望你能查看它。

你收到错误的原因是基于你授予给用户的特定角色,这点你现在已经了解了。是的,将该用户赋予root角色可以解决你的问题,但是在向用户授权之前,必须首先了解这些角色具体执行什么任务。

在教程中,你授予用户userAdminAnyDatabase角色,这基本上使该用户能够管理所有数据库的用户。你尝试使用用户进行的操作超出了其角色定义。

root角色包括这个角色定义以及readWriteAnyDatabasedbAdminAnyDatabase和其他角色,使其成为超级用户(基本上因为你可以用它做任何事情)。

你可以查看角色定义,以查看哪些角色需要授予你的用户才能完成某些任务。 https://docs.mongodb.com/manual/reference/built-in-roles/ 不建议使所有用户都成为超级用户:)


那么,如果不是root用户,你建议采取什么角色来解决问题? - Hendy Irawan
嗨,@HendyIrawan,我建议您决定每个用户能够做什么,并给予他们使其只能执行该操作的角色。例如,如果您只想让用户阅读(这就是问题尝试使用show collections进行的操作),则应该赋予它该能力,而不是其他任何能力 roles: [ { role: "read", db: "admin" } ]。请注意,此处的角色是读取,这是特定于数据库的,您不能做其他任何事情。请查看此链接以获取其他角色 https://docs.mongodb.com/manual/reference/built-in-roles/ - el Punch
这里问题的答案(不是“例如”)是“读取”? - Hendy Irawan
是的。请注意,用户只能阅读指定的数据库。 - el Punch

7

这是一个简单的问题。

  1. 重要的是您必须切换目标数据库,而不是管理员。

use yourDB

  1. 通过以下命令检查您的数据库身份验证:

show users

  1. 如果您得到空对象 {},那么问题就出现了。您只需输入以下命令即可:

db.createUser( { user: "yourUser", pwd: "password", roles: [ "readWrite", "dbAdmin" ] } )

或者

db.grantRolesToUser('yourUser',[{ role: "dbAdmin", db: "yourDB" }])


3

3
我遇到了这个问题,是因为我的MongoDB Compass中的主机名指向admin而不是我的项目。通过在主机名后添加/projectname来解决了这个问题 :) 请按照以下步骤操作:
  1. MongoDB atlas网站中选择您的项目
  2. 连接/使用MongoDB Compass连接
  3. 下载Compass/选择您的操作系统
  4. 我使用的是Compass1.12或更高版本
  5. 复制Compass 1.12或更高版本下的连接字符串。
  6. 打开MongoDB Compass/连接(左上角)/连接到
  7. 检测到连接字符串/是/
  8. 在主机名后添加您的项目名称: cluster9-foodie.mongodb.net/projectname
  9. 连接并使用POSTMAN测试API。
  10. 成功。

在代码中也要使用相同的连接字符串:

  1. 之前:
    • mongodb+srv://projectname:password@cluster9-foodie.mongodb.net/admin
  2. 之后:
    • mongodb+srv://projectname:password@cluster9-foodie.mongodb.net/projectname
祝好运。

3
Use Admin :
    use admin

Create a super user : 

    db.createUser(
    {
    user: "master",
    pwd: "test@123",
    roles: [ 
    { 
    role: "readWriteAnyDatabase", 
    db: "admin" 
    }, 
    {
    "role" : "dbAdminAnyDatabase",
    "db" : "admin"
    },
    {
    "role" : "clusterAdmin",
    "db" : "admin"
    },
    "userAdminAnyDatabase" 
    ]
    }
    )

1
感谢您提供这段代码片段,它可能会在短期内提供一些有限的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来具有类似问题的读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。 - Toby Speight

1
我遇到了一个类似的问题,但我的问题是我使用了集合名称而不是数据库名称。

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