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 参数指定了用于认证的数据库。
如果未指定任何内容,则连接的数据库将成为认证数据库,所以请注意!
请参考