概述
MongoDB安装完成后,数据库 admin 中没有任何用户账户。此时,MongoDB 向从本地主机发起的连接提供完整的数据库管理权限。因此配置 MongoDB 新实例时,首先需要创建用户管理员账户和数据库管理员账户:
- 用户管理员账户可在 admin 和其他数据库中创建用户账户。
- 数据库管理员账户,用于管理数据库、集群、复制和 MongoDB 其他方面的超级用户。
用户管理员账户和数据库管理员账户都是在数据库 admin 中创建的。在 MongoDB 服务器中启用身份验证后,要以用户管理员或数据库管理员的身份连接到服务器,必须向 admin 数据库验证身份,您还需在每个数据库中创建用户账户,让这些用户能够访问该数据库。
MongoDB中的用户角色:
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:__system
一些角色的功能说明
- read:允许用户读取指定数据库;
- readWrite:允许用户读写指定数据库;
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile;
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户;
- readWriteAnyDatabase:授予该权限的用户只能被创建在admin数据库中,该权限赋予用户所有数据库的读写权限;
- readAnyDatabase:授予该权限的用户只能被创建在admin数据库中,该权限赋予用户所有数据库的读权限;
- dbAdminAnyDatabase:授予该权限的用户只能被创建在admin数据库中,该权限赋予用户所有数据库的dbAdmin权限;
- clusterAdmin:授予该权限的用户只能被创建在admin数据库中,该权限赋予用户所有分片和复制集相关函数的管理权限;
- userAdminAnyDatabase:授予该权限的用户只能被创建在admin数据库中,该权限用户所有数据库的userAdmin权限;
- root:授予该权限的用户只能被创建在admin数据库中。超级账号,超级权限;
创建用户
注意:用户只能在数据库里面创建,我这里说的是你需要 use 一个数据出来之后再创建
db.createUser({
user: "admin",
pwd: "admin",
roles: [
{role: "userAdminAnyDatabase",db: "admin"}
]
})
启用认证
修改/etc/mongod.conf
security:
authorization: enabled
重启mongo后,需要验证
use admin;
db.auth("admin","admin")
也可以通过如下方式直接验证:
mongo -uadmin -padmin --authenticationDatabase admin
创建数据库管理员账户
db.createUser({
user: "dbadmin",
pwd: "dbadmin",
roles: ["readWriteAnyDatabase","dbAdminAnyDatabase","clusterAdmin"]
})
readWriteAnyDatabase:授予该权限的用户只能被创建在admin数据库中,该权限赋予用户所有数据库的读写权限;
dbAdminAnyDatabase:授予该权限的用户只能被创建在admin数据库中,该权限赋予用户所有数据库的dbAdmin权限;
clusterAdmin:授予该权限的用户只能被创建在admin数据库中,该权限赋予用户所有分片和复制集相关函数的管理权限;
创建超级管理员账户
db.createUser({
user: "dbadmin",
pwd: "dbadmin",
roles: ["root"]
})
root:授予该权限的用户只能被创建在admin数据库中。超级账号,超级权限;
创建普通用户
db.createUser({
user: "bernie",
pwd: "bernie",
roles: [{role: "readWrite",db: "test"}]
})
readWrite:允许用户读写指定数据库;
查看用户
show users;
查看指定用户
adb> db.runCommand({usersInfo:'bernie'})
{
users: [
{
_id: 'adb.bernie',
userId: UUID('bc118876-f261-4330-9273-710d2b7da1ca'),
user: 'bernie',
db: 'adb',
roles: [ { role: 'readWrite', db: 'test' } ],
mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}
],
ok: 1
}
删除用户
db.dropUser("bernie")
修改用户信息
db.changeUserPassword("username", "xxx")
db.runCommand(
{
updateUser:"username",
pwd:"xxx",
customData:{title:"xxx"}
}
)
修改用户权限
// 为用户natasha追加权限
db.grantRolesToUser("zhangsan",[{role: "readWrite", db: "saturn"}])
// 替换原有的权限
db.updateUser("zhangsan",{roles: [{role: "readWrite",db: "saturn"},{role: "readWrite",db: "runoob"}]})
// 删除指定权限
db.revokeRolesFromUser("zhangsan",[{role: "readWrite", db: "saturn"}])