MongoDB-管理员用户未经授权


200

我正在尝试向我的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 >>>

问题是什么?我将整个过程重复了3次,
我认为我按照MongoDB文档中的说明进行了所有操作。但这是行不通的。
我期望该sa用户有权执行任何操作,以便
他可以随后创建其他用户并为他们提供更具体的权限。


20
这是非常令人讨厌的或不良记录的。我在那儿挣扎。最后,我有一个具有全局“ root”角色的用户,ans仍然无法执行某些命令,例如执行命令……
ToBe 2014年

Answers:


471

我也为同一个问题着迷,添加第一个管理员用户时将角色设置为root,一切正常。

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

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

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

有关完整的身份验证设置的参考,请参阅经过数小时的互联网研究后编写的步骤


154
WTF ?!像这样一个愚蠢的事情浪费了一个小时。为什么他们放文件userAdminAnyDatabase而不是文件root
akostadinov

15
这个想法是,您首先创建一个仅用于管理其他用户的用户(因此该角色以“ userAdmin”开头),然后才创建您的普通用户。有点道理,但是我第一次也没有得到... @akostadinov
TomTasche

10
在MongoDB v3.4.7上,这对我不起作用:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
user124384 '17

2
@Cerin此DID代码对我有用:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }]),这让我感到困惑。我无权运行命令,但是我可以运行命令以使自己成为root用户,然后运行该命令。很奇怪:S

2
对于那些db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])无法正常工作的用户,请确保您切换回use admin...遇到相同的问题,一旦我切换回去,它就像一个魅力一样工作
esko22

37

这有点令人困惑-我相信您将需要授予自己readWrite来查询数据库。具有dbadmin或useradmin的用户可以管理数据库(包括授予自己其他权限),但是不能执行查询或写入数据。

因此,请授予自己readWrite,您应该会很好-

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


我不确定该答案是否与问题有关,但是无论哪种方式,它都能提供不正确的信息。dbOwner角色包括readWrite角色:docs.mongodb.org/manual/reference/built-in-roles/#dbOwner
Andy Triggs

10
答案是正确的-dbadmin和useradmin角色(原始发布者要求的角色)不包括readWrite。dbOwner会这样做,但这不是原始海报正在使用并询问的内容。
约翰·彼得罗尼

3
你是绝对正确的。道歉。我花了太多时间为角色争吵,被迷住了。
安迪·特里格斯

因此,您可以让管理员用户访问实际的mongodb服务器,然后让其他用户访问特定的数据库?
K-SO的毒性在增加。

32

一个有关如何更改当前用户的快速示例可能会对某人有所帮助。这就是我真正想要的。

@JohnPetrone我的以下建议添加读写角色与我的管理员用户grantRolesToUser

> use admin
> db.grantRolesToUser("admin",["readWrite"])
> show collections
system.users
system.version

26

您可以尝试:使用--authenticationDatabase标志有帮助。

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

8

我知道这个线程的答案真的很晚,但是我希望您能检查一下。

发生此错误的原因是基于您现在授予用户的特定角色,是的,是的,给该用户该角色root将解决您的问题,但是在授予他们角色之前,您必须首先了解这些角色的确切作用给用户。

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

root角色拥有这个角色包含在它的定义还有readWriteAnyDatabasedbAdminAnyDatabase和其他角色使其成为一个超级用户(主要是因为你可以用它做任何事情)。

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


因此,如果不是root用户,那么您建议解决该问题的角色是什么?
亨迪·爱侣湾

您好,@HendyIrawan,我建议您确定您希望每个用户能够执行的操作,并赋予他们使其能够执行此操作的角色。例如,如果您只希望用户阅读(这是问题要解决的问题show collections),则应赋予其这种能力,而没有别的 roles: [ { role: "read", db: "admin" } ]。请注意,这里的角色是只读的,这是特定于数据库的,除此之外您什么也不能做。查看此链接以了解其他角色docs.mongodb.com/manual/reference/built-in-roles
El Punch

因此,这里的问题(不是“例如”)的答案是“已读”?
Hendy Irawan

是。请注意,用户将只能读取指定的数据库。
El Punch

2

这是一个简单的问题。

  1. 重要的是您必须切换目标数据库NOT admin。

使用您的数据库

  1. 通过检查您的数据库身份验证

显示用户

  1. 如果您得到一个{}空对象,那就是问题。您只需要输入

db.createUser({user:“ yourUser”,pwd:“ password”,角色:[“ readWrite”,“ dbAdmin”]})

要么

db.grantRolesToUser('yourUser',[{角色:“ dbAdmin”,db:“ yourDB”}])


0

在Windows环境中,我遇到了类似的问题:我安装了Bitnami DreamFactory,并且还安装了另一个在系统启动时启动的MongoDb。我正在运行我的MongoDbService(启动时没有任何错误),但是在浪费大量时间后,我注意到实际上我正在连接Bitnami的MongoDb服务。请查看服务器上是否没有其他mongoDB实例在运行。

祝好运!


2
我不知道为什么这个答案被否决了。这是一个合理的建议。例如,我遇到了一个在后台运行Tomcat的管理控制台。如果启动任何类型的本地服务器,则可能会通过尝试连接到本地服务器来检查其是否正在运行。第一次连接将成功。然后,在检查服务器的日志并注意到服务器无法绑定到所需的端口之前,您将与“隐藏的”服务器搏斗。
保罗

0

此外,请注意,如果您的mongo Shell客户端无法正确连接到mongod实例,您会收到此类“权限被拒绝”错误。

通过检查连接端口来确保您的客户端打开了连接,而且您正在使用的端口mongod未被使用。您可以通过--port <port>在外壳程序和进程中使用参数来设置其他端口。


0

我遇到了这个问题,因为MongoDB Compass中的主机名指向的是我的项目的admin。通过在主机名后面添加/ projectname来解决:)尝试以下操作:

  1. MongoDB地图集网站上选择您的项目
  2. 连接/连接MongoDB Compass
  3. 下载指南针/选择您的操作系统
  4. 我使用了Compass 1.12或更高版本
  5. 将连接字符串复制到Compass 1.12或更高版本下。
  6. 打开MongoDB指南针/连接(左上)/连接到
  7. 检测到连接字符串/是/
  8. 在主机名后追加项目名称:cluster9-foodie.mongodb.net/ projectname
  9. 使用POSTMAN连接并测试API。
  10. 成功。

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

  1. 之前:
    • mongodb + srv://项目名称:密码 @ cluster9-foodie.mongodb.net / admin
  2. 后:
    • MongoDB的+ SRV:// 项目名称:密码 @ cluster9-foodie.mongodb.net / 项目名称

祝好运。


0

使用mydb
db.createUser({user:“ test”,pwd:“ secret”,角色:[“ readWrite”,“ dbAdmin”],passwordDigestor:“ server”})


0

同意您必须通过admin db身份验证,并且至少需要具有正确特权的角色,该角色可以避免来自DB的“本地主机异常”(这是针对mongoDB本地托管的),尽管您已将所有内容放置在适当的地方并且仍然访问访问使用Mongo Atlas创建的mongoDB时,几乎每个命令都会获得未授权的异常,那么在这里您可能会知道原因,为什么:

/dba/219003/not-authorized-on-admin-to-execute-command-mongodb-atlas-m0-free-tier-cluster?newreg=471a9a26108243d78d4ca74a87e7a115

并检查是否已在mongo Atlas上托管mongoDB :

https://docs.atlas.mongodb.com/unsupported-commands/


0
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" 
    ]
    }
    )

感谢您提供此代码段,它可能会提供一些有限的短期帮助。通过说明为什么这是解决问题的好方法,适当的解释将大大提高其长期价值,并且对其他存在类似问题的读者来说,它将更加有用。请编辑您的答案以添加一些解释,包括您所做的假设。
Toby Speight

-10

这可能是因为您尚未在mongodb.conf中设置noAuth = true

# Turn on/off security.  Off is currently the default
noauth = true
#auth = true

设置此选项后,使用重新启动服务

服务mongod重新启动


1
用户明确地说他想开始使用授权,因此未注释auth = true。您为什么建议禁用授权!?
亚历克斯75'5

我猜亚没有阅读的问题... OP想要权威性,S-猎人的设置用户和jremi的用于连接到自定义配置响应的组合
ChrisN
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.