所谓权限,就是开启认证,从而确定一个用户是否能访问某一个库,因此和用户是分不开的。默认情况下,mongodb是没开启认证的,也没有用户。这样肯定是不安全的,因此我们要开启认证,同时还要配置用户。
用户
mongodb的用户有一下几个特点:
- 用户是分角色的,有内置角色,也可以自定义角色
- 用户是和库绑定的,登录认证的时候也要在对应的库中认证
- 一般需要先创建管理员账号,然后再开启服务端认证
常见内置角色说明
-
数据库用户角色(Database User Roles)
read :授权用户只读数据的权限,允许用户读取指定的数据库
readWrite: 授权用户“读/写”数据的权限,允许用户“读/写”指定的数据库
-
数据库管理角色(Database Admininstration Roles)
dbAdmin:在当前的数据库中执行管理操作,如索引的创建、删除、统计、查看等
dbOwner:在当前的数据库中执行任意操作,增、删、改、查等
userAdmin:在当前的数据库中管理用户,创建、删除和管理用户。 -
备份和还原角色(Backup and Restoration Roles)
backup:备份角色
restore:还原角色 -
可跨库角色(All-Database Roles)
readAnyDatabase:授权在所有的数据库上读取数据的权限,只在admin 中可用
readWriteAnyDatabase:授权在所有的数据库上读写数据的权限,只在admin 中可用
userAdminAnyDatabase:授权在所有的数据库上管理用户的权限,只在admin中可用
dbAdminAnyDatabase: 授权管理所有数据库的权限,只在admin 中可用 -
集群管理角色(Cluster Administration Roles)
clusterAdmin:授权管理集群的最高权限,只在admin中可用
clusterManager:授权管理和监控集群的权限
clusterMonoitor:授权监控集群的权限,对监控工具具有readonly的权限
hostManager:管理server -
超级角色(super master Roles)
root :超级账户和权限,只在admin中可用
创建用户
# 第二个参数是可选的
db.createUser(user, writeConcern)
第一个参数user
的格式是这样的:
{
user: "<name>",
// Or "<cleartext password>"
pwd: passwordPrompt(),
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
],
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>",],
serverAddress: ["<IP>" | "<CIDR range>",]
},
],
mechanisms: [ "<SCRAM-SHA-1|SCRAM-SHA-256>",],
passwordDigestor: "<server|client>"
}
常见的配置项有:
user:用户的名字(字符串类型)
pwd:用户的密码(字符串类型)
roles:用户的角色(数组类型)
使用案例1:
# 切换到xxx数据库
use xxx;
# 创建一个用户,账号为ss,密码为:123456,角色为:xxx库的readWrite
db.createUser({
user:"ss",
pwd: "123456",
roles:["readWrite"]
});
使用案例2:
# 切换到yyy库
use yyy;
# 创建一个用户,账号为zs,密码为:654321,角色有多个,分别是:
# 1. yyy库中的readWrite角色
# 2. xxx库中的read角色
db.createUser({
user : "zs",
pwd : "654321",
roles : [
# 这里虽然绑定的事xxx库,但是验证的时候也要在yyy库中进行
{ role : "read", db : "xxx" },
"readWrite"
]
})
开启验证
方法1:使用配置文件
# 在配置文件中加入这段配置
auth=true
修改完配置后别忘了重启服务端
方法2:启动时候加入--auth
mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logs/mongodb.log --logappend --port=27017 --fork --auth
执行验证
方法1:在数据库内验证
# 使用客户端连接到服务端
mongo
执行验证
# 切换到对应的数据库
use xxx
# 使用账号和密码验证(返回值1表示通过,0表示未通过验证)
db.auth('ss','123456');
注意:一次连接尽量只验证一个用户,也就是说尽量不要多次使用db.auth()
,否则有可能出现:too many users are authenticated
错误,遇到这个错误的话,退出重新连接即可。
方法2:连接的时候验证
mongo -u zs -p 654321 --authenticationDatabase yyy
上面的参数解释:
-u: 用户名
-p: 密码
--authenticationDatabase:在哪个数据库中验证(就是用户创建的那个数据库)
# 其它的参数还有,比如:--port
附一:创建管理员
一般情况下,我们用一些普通的用户就可以完成很多操作,但是,很多时候,为了我们可以更方便的管理数据库,我们会创建一个管理账号,比如创建个 root
角色的用户:
use admin;
db.createUser({
user:"smart",
pwd: "123456",
roles:["root"]
});
附二:管理权限的其它操作
查看当前库下的所有用户
use xxx
# 查看当前库的所有用户
show users
修改当前库下的某个用户的信息
# 成功后无返回值
db.updateUser('zs', {pwd: '666666'});
修改当前库下的某个用户的密码
# 成功后无返回值
db.changeUserPassword('zs', '888888');
删除当前库下的某个用户
# 成功后返回true
db.dropUser('zs')
查看系统中的所有用户
# 要在admin库下操作
use admin
db.system.users.find()