MongoDB 的安装参考之前的博客:
Redhat 7.7 平台 MongoDB 4.4.6 安装 配置 手册
https://www.cndba.cn/dave/article/4542
1 MongoDB 用户说明
MongoDB安装完成后,默认会有3个数据库:
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
>
此时数据库 admin 中没有任何用户账户,MongoDB 从本地主机发起的连接提供全面的数据库管理权限。
因此配置 MongoDB 新实例时,首先需要创建用户管理员账户和数据库管理员账户。
- 用户管理员账户:可以在 admin 和其他数据库中创建用户账户。
- 数据库管理员账户:作为管理数据库、集群、复制和 MongoDB 其他方面的超级用户。
两类账户的创建语法完全相同,唯一不同的就是角色不一样。
用户管理员账户和数据库管理员账户都是在数据库 admin 中创建的。在 MongoDB 服务器中启用身份验证后,要以用户管理员或数据库管理员的身份连接到服务器,必须向 admin 数据库验证身份,还需在每个数据库中创建用户账户,让这些用户能够访问该数据库。
否则在操作时会报如下错误:
> show collections
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
2 MongoDB的用户操作
2.1 角色分类说明
MongoDB 内置的角色分类如下:
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
相关角色权限说明如下:
- read:允许用户读取指定数据库;
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限;
- readWrite:允许用户读写指定数据库;
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限;
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile;
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限;
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限;
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户;
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限;
- root:只在admin数据库中可用。超级账号,超级权限;
2.2 创建用户管理员账户
配置访问控制的第一步是创建用户管理员账户。用户管理员应只有创建用户账户的权限,而不能管理数据库或执行其他管理任务。这确保数据库管理和用户账户管理之间有清晰的界限。
在 admin 数据库中,添加一个用户并赋予userAdminAnyDatabase角色,userAdminAnyDatabase只在admin数据库中可用,赋予用户所有数据库的userAdmin权限。
例如,下面是在 admin 数据库中创建一个名为admin用户。
> use admin
switched to db admin
> db.createUser( {user: "admin",pwd: "admin",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
>
用户管理员应只有创建用户账户的权限,而不能管理数据库或执行其他管理任务。
要创建某个库的管理用户,必须在 admin 进行认证,给哪个库创建用户就先切换到哪个库下面。
2.3 开启权限验证
编辑配置文件/etc/mongod.conf,添加如下内容:
auth=true
客户端连接到服务器时必须提供用户名和密码。另外,从 MongoDB shell 访问 MongoDB 服务器时,如果要添加用户账户,必须执行下面的命令向数据库 admin 验证身份:
> use admin
switched to db admin
> db.auth("admin","admin")
1
>
也可以在启动 MongoDB shell 时使用选项-u和-p向数据库 admin 验证身份:
mongo -u “admin” -p “admin” —authenticationDatabase admin
2.4 创建数据库管理员账户
要创建数据库管理员,可在 MongoDB shell 中切换到数据库 admin,再使用方法createUser添加角色为readWriteAnyDatabase、dbAdminAnyDatabase和clusterAdmin的用户。
新添加的用户能够访问系统中的所有数据库、创建新的数据库以及管理 MongoDB 集群和副本集。
创建一个名为 admin 的数据库管理员:
> use admin
switched to db admin
--这里提示必须要先验证:
> db.createUser({user: "ustc", pwd: "ustc",roles: [ "readWriteAnyDatabase", "dbAdminAnyDatabase","clusterAdmin" ]} )
uncaught exception: Error: couldn't add user: command createUser requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1386:11
@(shell):1:1
> db.auth("admin","admin")
1
> db.createUser({user: "ustc", pwd: "ustc",roles: [ "readWriteAnyDatabase", "dbAdminAnyDatabase","clusterAdmin" ]} )
Successfully added user: {
"user" : "ustc",
"roles" : [
"readWriteAnyDatabase",
"dbAdminAnyDatabase",
"clusterAdmin"
]
}
>
数据库管理员能够访问系统中的所有数据库、创建新的数据库以及管理 MongoDB 集群和副本集。
如果要求管理其他数据库,首先要去 admin 库里面去认证。
查看全局所有账户
> use admin
switched to db admin
> db.system.users.find().pretty()
查看当前库下的账户
> use admin
> show users
2.5 创建普通用户
一旦经过认证的用户管理员,可以使用db.createUser()去创建普通用户。
可以分配mongodb内置的角色或用户自定义的角色给用户。
创建用户的数据库是该用户认证数据库。尽管用户认证是这个数据库,用户依然可以有其他数据库的角色。即用户认证数据库不限制用户权限。
创建一个角色为readWrite的用户 ustc来管理数据库ustc。
> use admin
switched to db admin
> db.auth('admin','admin')
1
> use ustc
switched to db ustc
> db.createUser({user:"ustc",pwd: "ustc",roles: [{ role: "readWrite", db: "ustc"}]})
Successfully added user: {
"user" : "ustc",
"roles" : [
{
"role" : "readWrite",
"db" : "ustc"
}
]
}
> db.auth('ustc','ustc')
1
创建一个dmp用户,对ustc数据库只读权限。
> use admin
switched to db admin
> db.auth('admin','admin');
1
> use ustc
switched to db ustc
> db.createUser({user:"dmp",pwd: "dmp",roles: [{ role: "read", db: "ustc"}]})
Successfully added user: {
"user" : "dmp",
"roles" : [
{
"role" : "read",
"db" : "ustc"
}
]
}
>
2.6 其他用户授权操作
修改密码
> use ustc
switched to db ustc
> db.updateUser("ustc",{pwd:"dave"}); #方法1
> db.changeUserPassword("ustc","dave"); #方法2
>
添加角色
> use ustc
switched to db ustc
> db.grantRolesToUser("ustc",[ { role: "read",db:"admin"} ] )
>
回收角色权限
> use ustc
switched to db ustc
> db.revokeRolesFromUser("ustc",[ { role: "read",db:"admin"} ] )
删除用户
> use ustc
switched to db ustc
> db.dropUser("ustc")
true
3 用户信息的存储
MongoDB的用户账号是以文档的形式存储在system.users 集合中的,文档结构如下:
> use admin
switched to db admin
> show tables
system.users
system.version
>
> db.system.users.findOne()
{
"_id" : "admin.admin",
"userId" : UUID("833076ba-0904-47c8-b0b7-07be57656cd9"),
"user" : "admin",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "qah5J1t2rEGg3XEMNHzEjw==",
"storedKey" : "S7KMB2JLQoPa92TmY1n89zmCcuI=",
"serverKey" : "Zl11XDk88Z8stY6K4v9cQEs5GBA="
},
"SCRAM-SHA-256" : {
"iterationCount" : 15000,
"salt" : "JzE/A5mfN5LMo85l/bPGvXrNTRNDIx2ST7ovYA==",
"storedKey" : "LMTo/eMHwllCuh7x//lu2sBMBY5FHFKmnM5VXJdaNmM=",
"serverKey" : "m73d/PQLlwAPfk0Sb3c+y4ldePFHoASbR3ZWLf2o1pE="
}
},
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
>
一共有7个列。 知道账户的存储集合后,除了我们之前用到的语法之外,也可以直接对system.users 集合进行操作来管理用户。
比如删除用户:
> db.system.users.find({},{'_id':1,'user':1,'db':1})
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin" }
{ "_id" : "admin.dave", "user" : "dave", "db" : "admin" }
{ "_id" : "admin.ustc", "user" : "ustc", "db" : "admin" }
{ "_id" : "ustc.dmp", "user" : "dmp", "db" : "ustc" }
>
> use admin
switched to db admin
> db.auth('admin','admin')
> db.createUser( { user:"root", pwd:"root", roles:[{role:"root",db:"admin"}] } );
> db.auth('root','root')
1
> db.system.users.remove({'user':'ustc'})
WriteResult({ "nRemoved" : 1 })
>
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 上一篇:Mongodb 基本的CRUD 操作示例
- 下一篇:MongoDB 存储引擎 说明



