0.前言
mongodb作为时下最为热门的数据库,那么其安全验证也是必不可少的,否则一个没有验证的数据库暴露出去,任何人可随意操作,这将是非常危险的。
本篇就mongodb的用户操作及用户验证来作探讨。
1. 安装
老生常谈的话题,网上很多优秀的教程,这里不再细说。
自docker面世以来,后端部署和环境搭建已逐渐步入容器化时代,作为一名有追求有作为的程序员,你有必要对前沿的技术有所了解和探讨。
个人推荐使用docker搭建你的mongodb,操作也十分简单。
首先,获取docker官方的mongodb镜像,也可以是第三方源的镜像
docker pull mongo
效果图如下:
其次,启动你的mongo镜像,如下:
docker run --name mymongo -p 27017:27017 -v /home/mongodb/data:/data/db -d mongo
简单解释下:
docker run 命令用于启动一个容器, --name mymongo 指定容器的名称为mymongo
-p 27017:27017,将容器内27017端口映射到服务器27017端口
-v /home/mongodb/data:/data/db,指定数据存储目录/home/mongodb/data映射到容器内的/data/db存储目录
-d 守护进程运行
mongo 指定运行的镜像
那么,如何开启验证呢?
也简单,只需要加上--auth即可:
docker run --name mymongo -p 27017:27017 -v /home/mongodb/data:/data/db -d mongo --auth
至此,一个mongo容器就可以跑起来了,还有更多可操作的地方,不在主题范围内,这里不做详细阐述。
要注意的是,首次启动,或还没有设置用户验证之前,请不要开启验证,后面会讲到。
2. 创建db管理账户
在创建用户之前,我们来看看db用户具体可以有哪些权限:
mongodb用户权限列表:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
mongodb有一个用户管理机制,简单描述为,有一个管理用户组,这个组的用户是专门为管理普通用户而设的,暂且称之为管理员。
管理员通常没有数据库的读写权限,只有操作用户的权限, 因此我们只需要赋予管理员userAdminAnyDatabase角色即可
另外管理员账户必须在admin数据库下创建,3.0版本后没有admin数据库,但我们可以手动use一个
use admin
下面我们来创建一个管理账户
首先,要进入mongo,以我本地数据库为例
如图:
如果数据库使用docker搭建的,则需要进入你的mongo容器内去操作。
比如,以我的服务器mongo镜像为例:
切换到admin数据库,创建管理员
进入mongo之后,那么意味着我们可以操作db了。
需要明白的一点是,管理员需要在admin数据库下创建,所以我们得进入admin数据库
使用use命令,即可进入某个数据库,如下:
use admin
切换到admin数据库后,我们可以查看db的用户列表,此时用户列表是空的,因为我们还没有创建db用户
db.system.users.find()
# 此时列表为空
接着,开始创建你的管理员账户,比如,创建一个用户名为super, 密码为superpwd的管理员账户:
db.createUser({
user: ‘super’,
pwd: ‘superpwd’,
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
成功则会提示Successfully
注意:这里使用createUser()方法来创建,addUser()方法已经被废弃
管理员授权
创建管理员后,需要给管理员授权,否则无权限操作用户
授权也十分简单,如下:
db.auth('super','superpwd')
如果结果返回1,则表示授权成功,返回0则表示失败
至此,管理员创建完成。
下面是完整流程:
3. 使用管理员账户创建普通用户
普通用户由管理员创建,并授权。通常需要指定某个数据库来操作。
先看需求
比如,现在我需要创建一个blog数据库,并且给这个数据库添加一个用户,用户名为develop,密码为developpwd,
只有这个用户可以操作这个blog数据库。
管理员账户登录
需要明白一点的是,普通用户需要由管理员创建并授权,所以,我们首先做的就是用管理员账户登录数据库
提示:在管理员账户创建完成后,我们需要重新启动数据库,并开启验证
以docker为例:
# 重新启动,开启验证
docker run --name mymongo -p 27017:27017 -v /home/mongodb/data:/data/db -d mongo --auth
重新启动之后,我们就可以用管理员账户进入mongo,如下:
# 指定用户进入mongo可使用: mongo admin -u 用户名 -p 密码
mongo admin -u super -p superpwd
进入之后,我们就可以做用户操作了
创建数据库,并创建用户
进入mongo之后,首先切换到blog数据库
use blog
# 没有则会自动创建
紧接着,可以创建develop用户了
db.createUser({
user: "develop",
pwd: "developpwd",
roles: [ { role: "readWrite", db: "blog" } ]
})
# 指定可访问blog数据库,并给予readWrite(读写)权限
再接着就是给develop用户授权了
db.auth('develop','developpwd')
至此,普通用户develop创建完成。
这时,我们就可以使用develop用户连接blog数据库了,如下;
mongo mongodb://develop:developpwd@localhost:27017/blog
至此,用户验证处理完成。
4. 一些用户操作命令
提示: 需要使用管理员账户来操作
创建用户
db.createUser({
user:用户名,
pwd:密码,
roles:[
{ role:权限类型, db:可访问的db}
]
})
查看用户列表
db.system.users.find()
查看某个用户信息
db.runCommand({usersInfo:用户名})
修改用户信息
db.runCommand(
{
updateUser:用户名,
pwd:密码,
customData:{title:"xxx"……}
}
)
修改用户密码
db.changeUserPassword(‘user’,’pwd’);
删除用户
db.system.users.remove({user:”username”});