MongoDB的身份验证数据库

認証数据库是什么?

创建新的数据库时,必须选择用于对该新数据库进行认证的数据库。adminDB具有system.users集合,包含所有用户信息。

可以通过db.system.users.find()命令查看system.users集合。

如果假设是超级用户的话

{
    _id: 'admin.root',
    userId: new UUID("9b410d09-8836-4e3b-b2c8-a7a7f131109d"),
    user: 'root',
    db: 'admin',
    credentials: {
    },
    roles: [ { role: 'root', db: 'admin' } ]
  },

你可以知道roles中每个DB被分配了哪些角色。

認証DB是在用户ID前面写的认证DB。

举个例子来说,admin.root中的admin是指认证数据库。

创建环境(Docker)

在创建环境时使用的docker-compose和初始信息需要提前放置。

version: "3"
services:
  db:
    build: .
    restart: always
    container_name: db-container
    hostname: db-server
    environment:
      - MONGO_DATA_DIR=/var/lib/mongodb
      - MONGO_LOG_DIR=/var/log/mongodb
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=example
      - MONGO_INITDB_DATABASE=admin
    volumes:
      - ./db:/var/lib/mongodb
    ports:
      - 27017:27017
    command: mongod
db.createUser(
    {
        user: "test",
        pwd: "test",
        roles: [{ role: "readWrite", db: "app1" }]
    }
)

這是在Docker中建立MongoDB。建立了一個名為”root”的超級用戶。

以普通用户身份创建一个名为“test”的用户。

在这种情况下,就像之前的json文件一样,可以看出超级用户既是认证数据库,也是被授予角色的数据库的管理员。

一般的用户呢?

被分配给角色的是名为app1的数据库。至于认证数据库,则是指哪个?

使用docker-compose的环境变量中设置MONGO_INITDB_DATABASE为admin。

设定如下。

これはinit.js(初期化)を実行するDBを表している。

mongoshで表すと

管理员>db.创建用户()

好像是这样的。

なので一般ユーザの認証DBはadminである。

{
    _id: 'admin.test',
    userId: new UUID("5effb343-3362-44b8-9f8e-b2ae3c607084"),
    user: 'test',
    db: 'admin',
    credentials: {
    },
    roles: [ { role: 'readWrite', db: 'app1' } ]
  },

猫鼬

使用Node时,我发现在使用mongoose连接到数据库时出现了认证错误,于是进行了调查。

{
    _id: 'admin.test',
    userId: new UUID("5effb343-3362-44b8-9f8e-b2ae3c607084"),
    user: 'test',
    db: 'admin',
    credentials: {
    },
    roles: [ { role: 'readWrite', db: 'app1' } ]
  },

选项的 authSource 参数指定了用于认证的数据库。

如果未指定任何内容,则连接的数据库将成为认证数据库,所以请注意!

 

请参考

 

广告
将在 10 秒后关闭
bannerAds