mongodb身份验证禁用和启用问题

Pen*_*nny 5 mongodb

现在我的计算机中有一个mongoDB,位于c:\ mongodb \ bin。首先,它是身份验证禁用。所以当我按:

C:\ Windows \ system32> mongo

有一些警告:

2018-03-28T16:53.516 + 0800 I CONTROL [initandlisten] **警告:未为数据库启用访问控制。2018-03-28T16:53.516 + 0800 I CONTROL [initandlisten] **
对数据和配置的读取和写入访问不受限制。

因此,我尝试将访问控制添加到mongoDB。我所做的是:

C:\mongodb\bin>use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "abc123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)
Run Code Online (Sandbox Code Playgroud)

但是在完成上述操作之后,仍然可以在没有用户名和密码的情况下登录MongoDb。即使在重新启动mongoDB服务之后,还是重新启动计算机。例如:

C:\Windows\system32>mongo
MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.9
Server has startup warnings:
2018-03-28T16:53:43.515+0800 I CONTROL  [initandlisten]
2018-03-28T16:53:43.516+0800 I CONTROL  [initandlisten] ** WARNING: Access contr
ol is not enabled for the database.
2018-03-28T16:53:43.516+0800 I CONTROL  [initandlisten] **          Read and wri
te access to data and configuration is unrestricted.
2018-03-28T16:53:43.516+0800 I CONTROL  [initandlisten]
2018-03-28T16:53:43.516+0800 I CONTROL  [initandlisten] Hotfix KB2731284 or late
r update is not installed, will zero-out data files.
2018-03-28T16:53:43.516+0800 I CONTROL  [initandlisten]
> show dbs
admin  0.000GB
local  0.000GB
> use admin
switched to db admin
>
Run Code Online (Sandbox Code Playgroud)

我可以将mongodb更改为身份验证的唯一方法是删除mongodb服务,然后使用以下脚本再次安装此服务:

C:\mongodb\bin>sc delete MongoDB  
C:\mongodb\bin>mongod --dbpath C:\mongodb\data --logpath C:\mongodb\log\MongoDB.log --auth --install
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用这种方式创建auth mongoDB,则当我尝试不使用用户名和密码登录时,它将失败,如下所示:

C:\Windows\system32>mongo
MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.9
> show dns
2018-03-28T17:59:06.344+0800 E QUERY    [thread1] Error: don't know how to show
[dns] :
shellHelper.show@src/mongo/shell/utils.js:906:11
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1
> show dbs
2018-03-28T17:59:10.073+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases:
1.0 }",
        "code" : 13,
        "codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1
>
Run Code Online (Sandbox Code Playgroud)

因此,我无法为此mongoDB创建用户和密码。我该如何登录?

谁能告诉我如何逐步进行设置以使我的mongoDB进行身份验证?还是删除一个旧的mongoDB并使用身份验证以及用户名和pwd创建一个新的mongoDB?

如果我尝试设置一个不带身份验证的mongoDB和一个不带身份验证的代码,则会在下面出现异常。

C:\Windows\system32>mongod --auth --port 27017 --dbpath C:\mongodb\data
2018-03-28T16:49:43.874+0800 I CONTROL  [initandlisten] MongoDB starting : pid=7
988 port=27017 dbpath=C:\mongodb\data 64-bit host=wolf-PC
.....
2018-03-28T16:49:43.877+0800 I STORAGE  [initandlisten] exception in initAndList
en: 98 Unable to create/open lock file: C:\mongodb\data\mongod.lock Another program is using this file.... Is a mongod instance already running?, terminating
Run Code Online (Sandbox Code Playgroud)

我检查了以下问题: MongoDB:服务器出现启动警告“未为数据库启用访问控制”

在上述情况下,我未能按照步骤4进行操作。

MongoDB:服务器有启动警告

我有同样的例外。

因此,任何人都可以给我详细的介绍?

jor*_*lis 7

第一个示例中的身份验证不起作用的原因是,您尚未启用它。验证仅通过配置启用,而不通过数据库用户的存在启用。正如您已经演示的那样,启用身份验证的方法是使用--auth标志启动db 或确保在mongod.conf文件的安全性部分中启用了授权(如下所示)。

security:
  authorization: enabled
Run Code Online (Sandbox Code Playgroud)

启用授权后,启动外壳程序时,必须使用以下选项在执行任何操作之前首先进行身份验证。

mongo <db> -u <username> -p <password>

例如,由于您已经在数据库myUserAdmin上创建了用户admin,则可以像这样进行身份验证:

mongo admin -u myUserAdmin -p abc123

或者,如果您已经使用just启动了shell mongo,则可以像这样进行身份验证:

1)首先切换到admin数据库。

use admin

2)然后验证您的用户:

db.auth('myUserAdmin ', 'abc123')

另外,请记住,userAdminAnyDatabase是非常强大的管理员角色,但是它仅允许对admin数据库(而不是为存储应用程序数据而创建的数据库)进行读/写访问。它还可以跨所有数据库启用管理员操作(例如createUsercreateRole等),如果受到危害,可能会很危险。

因此,如果您试图创建一个要从非系统数据库读取/写入的用户,则应该为此创建一个不同的特定用户。例如...

1)对您的管理员用户进行身份验证(如上所示)。

2)创建一个新用户以从您的应用程序数据库读取/写入:

db.createUser(
  {
    user: <app db user>,
    pwd: <password>,
    roles: [ { role: "readWrite", db: <app db> } ]
  }
);
Run Code Online (Sandbox Code Playgroud)

以下是有关每个mongodb角色及其行为方式的更多详细信息。