ChatGPT解决这个技术问题 Extra ChatGPT

MongoDB - 管理员用户未授权

我正在尝试向我的 MongoDB 添加授权。我正在使用 MongoDB 2.6.1 在 Linux 上完成所有这些工作。我的 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 用户有权执行任何操作,以便
然后他可以创建其他用户并授予他们更具体的权限。

这很烦人或记录不充分。我在那里苦苦挣扎。最后,我有一个具有全局“root”角色的用户,但仍然无法执行某些操作,例如执行命令......

D
Dan Dascalescu

我也在为同样的问题摸不着头脑,并且在添加第一个管理员用户时将角色设置为 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' }])

有关完整的身份验证设置参考,请参阅我在互联网上进行数小时研究后编写的steps


怎么回事?!为这种愚蠢的事情浪费了一个小时。为什么他们放入文档 userAdminAnyDatabase 而不是 root
这个想法是您首先创建一个仅用于管理其他用户的用户(因此该角色以“userAdmin”开头),然后才创建您的普通用户。这有点道理,但我第一次也没有得到它......@akostadinov
这对我在 MongoDB v3.4.7 上不起作用:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }])
@Cerin 此代码 DID 为我工作:db.grantRolesToUser('admin',[{ role: "root", db: "admin" }]),这让我感到困惑。我无权运行命令,但我可以运行命令使自己成为 root,然后然后运行该命令。很奇怪:S
我知道上游文档提到了它,如果您正在寻找它,要进行身份验证,您必须像这样“使用”管理数据库:use admin; 然后 db.auth("username", "password"); 希望这对某人有所帮助。
J
John Petrone

这有点令人困惑 - 我相信您需要授予自己 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
答案是正确的 - dbadmin 和 useradmin 角色(这是原始发帖人所问的)不包括 readWrite。 dbOwner 确实如此,但这不是原始海报使用和询问的内容。
你是绝对正确的。道歉。我花了太长时间争论角色并且感到困惑。
所以你可以让一个管理员用户访问实际的 mongodb 服务器,然后让其他用户访问特定的数据库?
B
Bart C

也许如何更改当前用户的快速示例对某人有所帮助。这就是我真正想要的。

根据@JohnPetrone 的建议,我使用 grantRolesToUser 向我的管理员用户添加了 readWrite 角色

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

执行此操作时我得到 Error: not authorized on admin to execute command
j
jremi

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

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

如果您不想为您的用户添加角色并且只是暂时需要这个,这是最好的方法。
e
el Punch

我知道这个答案在这个线程中来得很晚,但我希望你检查一下。

您收到该错误的原因是基于您授予用户的特定角色,您现在已经收集到了,是的,给该用户角色 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
所以这里问题的答案(不是“例如”)是“阅读”?
是的。请注意,用户将只能读取指定的数据库。
c
cocoTW

这是一个简单的问题。

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

使用你的数据库

检查您的数据库身份验证

显示用户

如果您得到一个 {} 空对象,这就是问题所在。你只需要输入

db.createUser({用户:“您的用户”,密码:“密码”,角色:[“readWrite”,“dbAdmin”]})

或者

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


P
Prathmesh Bijjargi
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" 
    ]
    }
    )

感谢您提供此代码片段,它可能会提供一些有限的短期帮助。通过说明为什么这是一个很好的问题解决方案,正确解释would greatly improve它的长期价值,并使其对有其他类似问题的未来读者更有用。请edit您的回答以添加一些解释,包括您所做的假设。
M
Mr. Dang

我遇到了这个问题,因为我的 MongoDB Compass 中的主机名指向 admin 而不是我的项目。通过在主机名后添加 /projectname 来修复 :) 试试这个:

在 MongoDB atlas 网站中选择你的项目 Connect/Connect with MongoDB Compass 下载 Compass/Choose your OS I used Compass 1.12 or later 复制 Compass 1.12 或更高版本下的连接字符串。打开 MongoDB Compass/Connect(左上角)/Connect To Connection String detected/Yes/ 在主机名后附加您的项目名称:cluster9-foodie.mongodb.net/projectname 使用 POSTMAN 连接并测试 API。成功。

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

之前:mongodb+srv://projectname:password@cluster9-foodie.mongodb.net/admin 之后:mongodb+srv://projectname:password@cluster9-foodie.mongodb.net/projectname

祝你好运。


M
Michael

我在这个线程中遇到了类似的问题,但我的问题是我使用了集合名称而不是数据库名称。


i
ibirite

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

祝你好运!


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

此外,请注意,如果您的 mongo shell 客户端无法正确连接到 mongod 实例,您可能会收到此类“Permission Denied”错误。

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


J
J. Ceron

使用 mydb db.createUser( { user: "test", pwd: "secret", roles: [ "readWrite", "dbAdmin"],passwordDigestor:"server" } )


w
whoami - fakeFaceTrueSoul

同意您必须获得管理员数据库的身份验证,并且至少需要一个具有正确权限的角色,这将避免来自数据库的“本地主机异常”(这是用于 mongoDB 的本地托管),尽管您已经准备好了一切并且仍然在访问使用 Mongo Atlas 创建的 mongoDB 时,几乎每个命令都没有获得授权异常,那么这里是您可能知道原因的地方,为什么:

https://dba.stackexchange.com/questions/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/


M
M. Hamza Rajput

我在 Centos 7 for MongoDB 4.2 上按照这些步骤操作。 (远程用户)

更新 mongod.conf 文件

vi /etc/mongod.conf
   net:
     port: 27017
     bindIp: 0.0.0.0 
   security:
     authorization: enabled

启动MongoDB服务恶魔

systemctl start mongod

打开 MongoDB 外壳

mongo

在 shell 上执行这个命令

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

远程根用户已创建。现在,您可以使用开发机器上的任何 MongoDB GUI 工具来测试此数据库连接。喜欢Robo 3T


G
Gus Bus

如果您使用的是 Atlas,请注意您无法通过 mongo shell 创建用户。

我在墙上撞了一会儿,直到我遇到了这个:https://www.mongodb.com/community/forums/t/cant-create-a-root-user-from-mongo-shell/101369


S
Sorin Veștemean

对于 MongoDB shell 版本 v4.2.8,我尝试了不同的方法来使用 auth 备份我的数据库,我的获胜解决方案是

mongodump -h <your_hostname> -d <your_db_name> -u <your_db_username> -p <your_db_password> --authenticationDatabase admin -o /path/to/where/i/want


B
Buminda

这可能是因为你没有在 mongodb.conf 中设置 noAuth=true

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

设置后使用重启服务

服务 mongod 重启


用户明确表示他想开始使用授权,因此他取消了 auth=true 的注释。你为什么建议禁用授权!?
我想你没有读过这个问题......OP想要auth,s-hunter的响应设置用户和jremi的连接到自定义配置的组合