文章目录
- 1 用户管理简介
- 2 内置角色
- 3 创建用户
-
- 3.1 创建管理员用户
- 3.2 创建普通用户
- 3.3 创建 root 用户
- 3.4 创建具有自定义信息的用户
- 4 查看用户信息
- 5 更新用户角色
- 6 修改用户密码
- 7 删除用户
1 用户管理简介
MongoDB 默认服务没有账号密码,可以在客户端连接上进行各种操作。如果在配置文件中指定auth=true
,即打开认证,客户端连接后需要认证才能执行操作。
默认情况下,MongoDB 没有管理员账户,需要安装 MongoDB之后,在admin
使用数据库db.createUser()
命令添加管理员帐户或其他角色帐户。
2 内置角色
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 可在指定数据库中创建、删除和管理用户。
- clusterAdmin:只能在 admin 在数据库中创建这个角色的用户,并赋予用户所有分片和复制相关函数的管理权限。
- readAnyDatabase:只能在 admin 数据库中创建此角色用户,赋予用户所有数据库的读权限。
- readWriteAnyDatabase:只能在 admin 在数据库中创建这个角色的用户,并赋予用户所有数据库的读写权限。
- userAdminAnyDatabase:只能在 admin 在数据库中创建这个角色的用户,并赋予用户所有的数据库 userAdmin 权限。
- dbAdminAnyDatabase:只能在 admin 在数据库中创建这个角色的用户,并赋予用户所有的数据库 dbAdmin 权限。
- root:只能在 admin 在数据库中创建这个角色的用户,超级账号,超级所有权。 dbOwner 、userAdmin、userAdminAnyDatabase 角色间接或直接提供系统超级用户的权限。
3 创建用户
创建用户的语法如下:
// 在指定的数据库中创建具有指定角色权限的用户,可以选择自定义信息属性 db.createUser({
user:"用户名", pwd:"密码", roles:[{
role:"角色",db:"数据库"},...], customData: {
自定义信息} })
3.1 创建管理员用户
首先,创建管理员用户userAdminAnyDatabase
角色,此角色可以在任何数据库下拥有userAdmin
可以在任何数据库下管理用户的权限。请注意,只有在 admin 在数据库中创建此角色用户。
> use admin switched to db admin > db.createUser({
user:"admin",pwd:"123456",roles:[{
role:"userAdminAnyDatabase",db:"admin"}]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
>
然后使用db.auth("用户名","密码")
进行认证。注意,每一个用户都需要在创建这个用户的认证库下进行认证。
> use admin
switched to db admin
> db.auth('admin','123456')
这时,我们就可以使用 admin 账号管理(创建,删除等)其他用户了。
3.2 创建普通用户
如下,创建一个用户 chenpi,在数据库 chenpidb 上有读写权限。这也是我们一般为不同业务创建的专属用户。
> use chenpidb
switched to db chenpidb
> db.createUser({
user:"chenpi",pwd:"123456",roles:[{
role:"readWrite",db:"chenpidb"}]})
Successfully added user: {
"user" : "chenpi",
"roles" : [
{
"role" : "readWrite",
"db" : "chenpidb"
}
]
}
使用 chenpi 用户连接 MongoDB,切换到认证库下进行认证,只有进行证成功之后才可以进行操作。
[root@chenpihost ~]# mongo
MongoDB shell version v4.2.17
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session {
"id" : UUID("91153167-b4ab-4078-ba6d-44a6f98492e3") }
MongoDB server version: 4.2.17
> use chenpidb
switched to db chenpidb
> show tables
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
> db.person.insert({
"name":"ChenPi"})
WriteCommandError({
"ok" : 0,
"errmsg" : "command insert requires authentication",
"code" : 13,
"codeName" : "Unauthorized"
})
> db.auth('chenpi','123456')
1
> db.person.insert({
"name":"ChenPi"})
WriteResult({
"nInserted" : 1 })
>
注意,chenpi 用户只有在 chenpidb 数据库下的读写操作,对其他数据库没有权限。
> use chenpidb1
switched to db chenpidb1
> show tables
Warning: unable to run listCollections, attempting to approximate collection names by parsing connectionStatus
> db.person.insert({
"name":"ChenPi"})
WriteCommandError({
"ok" : 0,
"errmsg" : "not authorized on chenpidb1 to execute command { insert: \"person\", ordered: true, lsid: { id: UUID(\"91153167-b4ab-4078-ba6d-44a6f98492e3\") }, $db: \"chenpidb1\" }",
"code" : 13,
"codeName" : "Unauthorized"
})
>
3.3 创建 root 用户
上面我们创建的 admin 用户只有管理用户的权限,它没有进行数据库操作的权限,如下所示:
> db.person.insert({
"name":"ChenPi"})
WriteCommandError({
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { insert: \"person\", ordered: true, lsid: { id: UUID(\"f3ba4ad3-b89e-447f-85ca-255c48c97355\") }, $db: \"admin\" }",
"code" : 13,
"codeName" : "Unauthorized"
})
>
如果一个用户需要有管理用户的权限,还需要用操作数据库的权限,例如插入表数据,创建索引等,可以创建 root 角色用户,它是超级用户,拥有所有权限。
> use admin
switched to db admin
> db.createUser({
user:"root",pwd:"123456",roles:[{
role:"root",db:"admin"}]})
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
>
使用 root 用户登录,就可以进行任何操作了,如下所示:
> use admin
switched to db admin
> db.auth('root','123456')
1
> db.system.users.findOne({
})
{
"_id" : "admin.admin",
"userId" : UUID("7c4292ad-3a9a-4591-9ad5-53e56c72f725"),
"user" : "admin",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "1m0m35AVNStekFqyXTPXEQ==",
"storedKey" : "PbxbrSfXpM1mEOTY4OyjvhoHSF8=",
"serverKey" : "HaIm8KBGJZ+92JYJTRoDwNFzQ20="
},
"SCRAM-SHA-256" : {
"iterationCount" : 15000,
"salt" : "AHAYN8l4TrFOg9RzkReUMHA/WkyWpHN6qejcjw==",
"storedKey" : "/IaLQADTe/unVKrpKuZ3lgMmIJzqHlK8H/s4pTLSuQo=",
"serverKey" : "OBx9qg/JwSAPwXLgzKygq/T6+2qg7Yzxml6VlQCEudQ="
}
},
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
> use db1
switched to db db1
> db.person.insert({
"name":"ChenPi"})
WriteResult({
"nInserted" : 1 })
3.4 创建带有自定义信息的用户
我们创建用户时,可以添加一些自定义信息,用于说明此用户,如下:
db.createUser({
user:"chenpiadmin1",
pwd:"123456",
roles:[{
role:"userAdminAnyDatabase",db:"admin"}],
customData: {
"name":"陈皮","age":18},
aoligei: {
"name":"陈皮","age":18}
})
这样,我们查看用户信息时,会展示这些自定义的信息,如下:
> db.system.users.find({
"user":"chenpiadmin"}).pretty()
{
"_id" : "admin.chenpiadmin",
"userId" : UUID("7d83c9db-d696-4ebe-843c-1ccbe42c984f"),
"user" : "chenpiadmin",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "Gv65j7XoE6KAvSlSjGNGuQ==",
"storedKey" : "4rTKkwQG7uRgmCgrB/KXgf4NgT8=",
"serverKey" : "YzQ41ABpWTdX/ZKNjCT94NxdSwo="
},
"SCRAM-SHA-256" : {
"iterationCount" : 15000,
"salt" : "J4DonJjsKkKvxULZcYNZisAOLCQAcCQ10xjTBg==",
"storedKey" : "uCr6S2NNnLxxz6RKmpFwDwSRLK4tQ7waqkH4fhoPXzo=",
"serverKey" : "OAokzaylYh/SdwRAgDVS7PLkulZ/OmH8PAlhIyZKp2A="
}
},
"customData" : {
"name" : "陈皮",
"age" : 18
},
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
>
4 查看用户信息
每一个用户都是在特定库(认证库)下创建的,我们可以使用拥有 userAdmin 权限的用户,查看不同数据库下的用户列表。
可以使用show users
命令查看。例如,查看 admin 数据库下的用户列表。
> use admin
switched to db admin
> show users
{
"_id" : "admin.admin",
"userId" : UUID("7c4292ad-3a9a-4591-9ad5-53e56c72f725"),
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
{
"_id" : "admin.chenpiadmin",
"userId" : UUID("7d83c9db-d696-4ebe-843c-1ccbe42c984f"),
"user" : "chenpiadmin",
"db" : "admin",
"customData" : {
"name" : "陈皮",
"age" : 18
},
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
切换到 chenpidb 数据库,查看此数据库下的用户列表。
> use chenpidb
switched to db chenpidb
> show users
{
"_id" : "chenpidb.chenpi",
"userId" : UUID("2b80f57b-031d-4621-aa72-0895972302ca"),
"user" : "chenpi",
"db" : "chenpidb",
"roles" : [
{
"role" : "readWrite",
"db" : "chenpidb"
}
],
"mechanisms" : [
"SCRAM-SHA-1",
"SCRAM-SHA-256"
]
}
在 admin 数据库下,有个system.users
表,此记录着 MongoDB 所有用户信息,如下:
> use admin
switched to db admin
> show tables
system.users
system.version
> db.system.users.find({
}).pretty()
{
"_id" : "admin.admin",
"userId" : UUID("7c4292ad-3a9a-4591-9ad5-53e56c72f725"),
"user" : "admin",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "1m0m35AVNStekFqyXTPXEQ==",
"storedKey" : "PbxbrSfXpM1mEOTY4OyjvhoHSF8=",
"serverKey" : "HaIm8KBGJZ+92JYJTRoDwNFzQ20="
},
"SCRAM-SHA-256" : {
"iterationCount" : 15000,
"salt" : "AHAYN8l4TrFOg9RzkReUMHA/WkyWpHN6qejcjw==",
"storedKey" : "/IaLQADTe/unVKrpKuZ3lgMmIJzqHlK8H/s4pTLSuQo=",
"serverKey" : "OBx9qg/JwSAPwXLgzKygq/T6+2qg7Yzxml6VlQCEudQ="
}
},
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
{
"_id" : "chenpidb.chenpi",
"userId" : UUID("2b80f57b-031d-4621-aa72-0895972302ca"),
"user" : "chenpi",
"db" : "chenpidb",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "MijUlGFqsm85lYz9gktVYA==",
"storedKey" : "WVXWAcLnNsjT1gVIt4s7MoNBdSo=",
"serverKey" : "qUdJDl+XQJMKu72KH0MN3IUrlrk="
},
"SCRAM-SHA-256" : {
"iterationCount" : 15000,
"salt" : "ms06p++btiQEdRkshyQd5WRZ3wNmPUiHG/ikag==",
"storedKey" : "D6JNgxrjK1SFvGUP+BZ4gk8I9f4u/cZ3mubpTRM4BBA=",
"serverKey" : "IydgVAgPN8x0lhws3HmXQQoIuFyyF+3HolCv7lBUP8U="
}
},
"roles" : [
{
"role" : "readWrite",
"db" : "chenpidb"
}
]
}
{
"_id" : "admin.chenpiadmin",
"userId" : UUID("7d83c9db-d696-4ebe-843c-1ccbe42c984f"),
"user" : "chenpiadmin",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "Gv65j7XoE6KAvSlSjGNGuQ==",
"storedKey" : "4rTKkwQG7uRgmCgrB/KXgf4NgT8=",
"serverKey" : "YzQ41ABpWTdX/ZKNjCT94NxdSwo="
},
"SCRAM-SHA-256" : {
"iterationCount" : 15000,
"salt" : "J4DonJjsKkKvxULZcYNZisAOLCQAcCQ10xjTBg==",
"storedKey" : "uCr6S2NNnLxxz6RKmpFwDwSRLK4tQ7waqkH4fhoPXzo=",
"serverKey" : "OAokzaylYh/SdwRAgDVS7PLkulZ/OmH8PAlhIyZKp2A="
}
},
"customData" : {
"name" : "陈皮",
"age" : 18
},
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
>
5 更新用户角色
更新用户角色语法如下。首先登录具有 userAdmin 或 userAdminAnyDatabase 或 root 角色权限的账号,然后切换到被修改用户的认证库下进行操作。
db.updateUser("用户名",{
roles:[{
角色信息}]})
我们可以对已经存在的用户,更新它的角色信息,例如对 chenpi 用户再添加对 chenpidb 数据库的 dbAdmin 权限。
> use chenpidb switched to db chenpidb > show users { "_id" : "chenpidb.chenpi", "userId" : UUID("2b80f57b-031d-4621-aa72-0895972302ca"), "user" : "chenpi", "db" : "chenpidb", "roles" : [ { "role" : "readWrite", "db" : "chenpidb" } ], "mechanisms" : [ "SCRAM-SHA-1", "SCRAM-SHA-256" ] } > db.updateUser("chenpi",{ roles:[{ role:"readWrite",db:"chenpidb"},{ role:"dbAdmin",db:"chenpidb"}]}) > show users { "_id" : "chenpidb.chenpi", "userId" : UUID("2b80f57b-031d-4621-aa72-0895972302ca"), "user" : "chenpi", 标签:
80f薄膜电容