首页 > > > MongoDB账号管理及实践
其中authorization表示是否启用访问权限认证,keyFile指定了MongoDB复制集或分片集群内部各组件相互间通信的认证文件;MongoDB提供了本地例外机制,避免用户在启用认证前未设置账号导致无法访问MongoDB实例的尴尬。
2、创建用户所需的数据库账号,如下:
mongos> use admin
mongos> db.createUser(
{
user: "myuser",
pwd: "xxxxx",
roles: [ { role: "readWrite", db: "admin" } ]
}
)
指定了认证数据库为admin,角色采用内建的readWrite,由于指定的数据库是admin,那么等同于创建了readWriteAnyDatabase角色的账号。用该账号登陆:
use admin
db.auth("myuser","wzh123")
3、但该账号无法执行如下这些操作:
mongos> use mydb
mongos> db.dropDatabase()
{
"ok" : 0,
"errmsg" : "not authorized on shardtest to execute command { dropDatabase: 1.0 }",
"code" : 13,
"codeName" : "Unauthorized"
}
mongos> sh.enableSharding("wzhshard")
{
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { enableSharding: \"wzhshard\" }",
"code" : 13,
"codeName" : "Unauthorized"
}
4、所以,只能通过创建自定义角色来满足需求,先切换到root账号:
use admin
db.auth("root","wzh123") // root为已创建的具备超级用户角色的管理账号。
创建自定义角色:
db.createRole({
role: "wzhRole",
privileges: [{ resource: { db: "", collection: "" }, actions: ["enableSharding","dropDatabase" ] }],
roles: ["readWriteAnyDatabase"]
})
privileges字段指定了该角色具有的对resource字段所述资源具有actions字段所述的操作权限enableSharding和dropDatabase,同时通过roles字段继承了readWriteAnyDatabase的所有权限。
5、进一步操作myuser账号,先去掉其readWrite角色,操作如下:
db.revokeRolesFromUser(
"myuser",
[
{ role: "readWrite", db: "admin" }
]
)
确认权限已收回:
mongos> db.getUser("myuser")
{
"_id" : "admin.myuser",
"user" : "myuser",
"db" : "admin",
"roles" : [ ]
}
6、为myuser增加wzhRole角色:
db.grantRolesToUser(
"myuser",
[
{ role: "wzhRole", db: "admin" }
]
)
确认权限已经赋予:
db.getUser("myuser")
{
"_id" : "admin.myuser",
"user" : "myuser",
"db" : "admin",
"roles" : [
{
"role" : "wzhRole",
"db" : "admin"
}
]
}
7、再使用myuser登陆
use admin
db.auth("myuser","wzh123")
8、执行操作:
mongos> sh.enableSharding("wzhshard")
{ "ok" : 1 }
mongos> sh.shardCollection("wzhshard.table1",{mykey:1})
{ "collectionsharded" : "wzhshard.table1", "ok" : 1 }
mongos> use wzhshard
switched to db wzhshard
mongos> db.dropDatabase()
{ "dropped" : "wzhshard", "ok" : 1 }
一切看起来那么美好!
MongoDB在权限管理中引入了角色这一中间层,一般情况下,直接基于内建角色来创建账号即可,有特殊需求的话,可以创建自定义角色来满足需求,这样一来就无需暴露繁多的具体权限。对于新司机,更容易上手。但不足之处在于MongoDB数据库并未像MySQL一样未提供IP过滤功能(未提供Host字段用来设置账号所适用的主机IP列表)。
最后,网易数据库团队正在热火朝天地调研和开发MongoDB分片集群功能,计划上半年在蜂巢上提供MongoDB分片集群能力,届时将带给大家更加强大的文档数据库能力。
参考资料:
1、https://docs.mongodb.com/manual/reference/built-in-roles
2、https://docs.mongodb.com/manual/reference/privilege-actions/
3、https://docs.mongodb.com/manual/reference/resource-document/
4、Role-Based Access Control
5、User-Defined Roles
6、Manage Users and Roles
原文作者:;如有侵权,请联系管理员删除。