(1)在admin库中创建stargao用户,用于远程管理
> use admin
switched to db admin
> db.createUser({user:"stargao",pwd:"123456",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
"user" : "stargao",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
> db.auth("stargao", "123456")
1
(2)访问控制
db.createUser(
{
user:"stargao",
pwd:"123456",
roles:[{role:"root",db:"admin"}],
authenticationRestrictions:[{
clientSource: ["10.25.0.0/16"],
serverAddress: ["192.168.0.0/16"]
}]
}
)
authenticationRestrictions:该字段为3.6版本以后的新特性,服务器在创建用户上强制执行的身份验证限制。指定可连接服务器的访问用户的ip地址列表或指定可连接服务器的服务器ip地址列表。(即白名单验证)
字段名称 数据类型 描述
clientSource ip地址数组或CIDR范围 如果存在,则服务器验证客户端的ip地址是否位于给定列表中,或者属于列表中的一个CIDR范围。如果客户端的ip地址不在当前,服务器就不会对用户进行身份验证。
serverAddress ip地址数组或CIDR范围 客户端可以连接的ip地址列表或CIDR范围。如果存在,服务器将验证客户端的连接是否符合给定列表中的ip地址列表或CIDR。如果不符合,则服务器不会对用户进行身份验证
经测试authenticationRestrictions参数对MongoDB shell客户端版本有要求,建议4.0+,否则可能会出现参数错误的报错。如下:
MongoDB shell报错:
2021-08-25T18:15:03.628+0800 E QUERY [thread1] Error: couldn't add user: "authenticationRestrictions" is not a valid argument to createUser :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1437:15
@(shell):1:1
图形化执行命令报错:
[Error]Error:"authenticationRestrictions"is not a valid argument to createUser at line2,column 1
# 创建拥有test库的读写权限的用户
> use test
switched to db test
> db.createUser({user:"user_dbtest",pwd:"pwd_dbtest",roles:[{role:"readWrite",db:"test"}]})
Successfully added user: {
"user" : "user_dbtest",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
}
]
}
> db.createUser({user:"user_db1_db2",pwd:"pwd_db1_db2",roles:[{role:"readWrite",db:"db1"},{role:"readWrite",db:"db2"}]})
Successfully added user: {
"user" : "user_db1_db2",
"roles" : [
{
"role" : "readWrite",
"db" : "db1"
},
{
"role" : "readWrite",
"db" : "db2"
}
]
}
> use admin # 查看admin库用户
switched to db admin
> show users
{
"_id" : "admin.ucloud_super_user",
"user" : "ucloud_super_user",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
{
"_id" : "admin.ucloudbackup",
"user" : "ucloudbackup",
"db" : "admin",
"roles" : [
{
"role" : "superuser",
"db" : "admin"
}
]
}
{
"_id" : "admin.root",
"user" : "root",
"db" : "admin",
"roles" : [
{
"role" : "superuser",
"db" : "admin"
}
]
}
{
"_id" : "admin.user_dbtest",
"user" : "user_dbtest",
"db" : "admin",
"roles" : [
{
"role" : "readWrite",
"db" : "admin"
}
]
}
{
"_id" : "admin.stargao",
"user" : "stargao",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
udb-1ndw2anr:PRIMARY> use test # 查看test库用户
switched to db test
udb-1ndw2anr:PRIMARY> show users
{
"_id" : "test.user_dbtest",
"user" : "user_dbtest",
"db" : "test",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
}
]
}
{
"_id" : "test.user_db1_db2",
"user" : "user_db1_db2",
"db" : "test",
"roles" : [
{
"role" : "readWrite",
"db" : "db1"
},
{
"role" : "readWrite",
"db" : "db2"
}
]
}
> db.serverStatus().connections;
{ "current" : 3, "available" : 19997, "totalCreated" : NumberLong(2032123) }
> use test
switched to db test
> db.changeUserPassword("user_dbtest","1234567")
> db.auth("user_dbtest","1234567")
1
# 使用update修改权限,update修改方式是替换原来的权限
# 修改用户user_dbtest的权限为只读test库
> db.updateUser("user_dbtest",{roles:[{role:"read",db:"test"}]})
> show users
{
"_id" : "test.user_dbtest",
"user" : "user_dbtest",
"db" : "test",
"roles" : [
{
"role" : "read", # 已经变成了只读权限
"db" : "test"
}
]
}
# 在原有权限的基础上增加别的权限db.grantRolesToUser()
# 给user_dbtest增加对DB1库读写和DB2库的读权限
> db.grantRolesToUser("user_dbtest",[{role:"readWrite",db:"db1"},{role:"read",db:"db2"}])
> show users
{
"_id" : "test.user_dbtest",
"user" : "user_dbtest",
"db" : "test",
"roles" : [
{
"role" : "read", # db2 增加了读权限
"db" : "db2"
},
{
"role" : "readWrite", # db1增加了读写权限
"db" : "db1"
},
{
"role" : "read",
"db" : "test"
}
]
}
# 删除用户的权限db.revokeRolesFromUser()
# 删除user_dbtest对db2库的读写权限
> db.revokeRolesFromUser("user_dbtest",[{role:"read",db:"db2"}])
> show users
{
"_id" : "test.user_dbtest",
"user" : "user_dbtest",
"db" : "test",
"roles" : [
{
"role" : "readWrite",
"db" : "db1"
}, # 对比2.7.2 db2的读权限已经被回收
{
"role" : "read",
"db" : "test"
}
]
}
# 删除user_dbtest
> db.dropUser("user_dbtest")
true
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。