mongodb操作之用户篇

mongodb操作之用户篇

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”});
发布于 2017-04-06

文章被以下专栏收录