之前在多系统安装 MongoDB一文中,在创建 docker-compose.yml
文件时,创建了 root 管理员的用户名和密码。由于 root 用户权限非常高,通常这个密码是不透露出去的,一般只交给数据库的维护人员去使用到的一个超级管理员密码。因此,需为单个数据库添加管理用户。
一、MongoDB内置角色
MongoDB 为数据库系统不同级别的访问需求提供了内置的角色,每个数据库都存在内置的数据库用户角色和数据库管理员角色,admin数据库还包含额外的角色。
这里简单的介绍一下内置的角色,更多见官方链接。
1.1 数据库用户角色
每个数据库都包含下列的角色:
- read: 提供读取所有的非系统集合的能力,也能读取以下系统集合:system.indexes、system.js、system.namespaces;
- readWrite: 提供所有读权限,另外还能修改非系统集合和system.js集合;
1.2 数据库管理员角色
每个数据库都包含以下数据库管理员角色:
- dbAdmin: 提供执行管理任务的能力,比如schema相关的任务,索引和聚合分析。这个角色不能对用户和角色做授权管理;
- dbOwner: 数据库拥有者可以在数据库上执行任何管理动作,这个角色组合了readWrite、dbAdmin、userAdmin角色的特权(一般来说,新建数据库时使用dbOwner这个角色就OK了);
- userAdmin: 在当前数据库中创建和修改角色和用户的能力,userAdmin角色允许用户授予任何特权给任何用户,包括他们自己,此角色还可以直接提供 superuser 访问任何数据库,甚至是admin数据库、集群。
1.3 集群管理员角色
admin 数据库包括下列角色来管理整个系统而不仅仅是单个数据库,这些角色包括但不限于副本集和分片集群管理功能:
- clusterAdmin:提供最大的机器管理访问权限,此角色组合了clusterManager、clusterMonitor和hostManager角色,另外此角色还提供dropDatabase动作;
- clusterManager:在机器上能进行管理和监控动作。拥有此角色的用户可以访问config和local数据库,它们分别用于分片和副本集;
- clusterMonitor:为监控工具提供只读权限,比如MongoDB cloud manager 和ops manager 监控代理;
- hostManager:提供监控和管理服务器的能力
二、添加管理用户
2.1 链接数据库
在 Docker 环境下,连接数据库:
docker exec -it mongotest_mongo_1 mongo
其中:
- mongotest_mongo_1 为当前mongoDB的容器名称;
注: 因为只是进入shell终端,所以不需要账号密码**。
切换到管理员的数据库:
use admin db.auth(‘root’, ‘example’)
此时在输入 show dbs
,就可以查看到多个数据库。
2.2 为单个数据库添加管理用户
- 创建数据库
testdb
:use testdb
- 创建当前数据库的管理员用户(用户名和密码),并创建相应角色dbOwner。
db.createUser({user: ‘Li’, pwd: ‘123456’, roles:[{role: ‘dbOwner’, db: ‘testdb’}]})
- db保留关键词,代表当前数据库。
role: 'dbOwner', db: 'testdb'
表示创建的用户在testdb
数据库是属于什么角色,dbOwner表示数据库的所有者。
- 创建成功后,可以新开一个终端,使用db.auth进行鉴权登录。
use testdb db.auth(‘Li’,’123456’)
注:如何为用户创建多个数据库权限?
// 指定数据库
use reporting
db.createUser({
user: "reportsUser",
pwd: passwordPrompt(), // or cleartext password
roles: [
// 在reporting数据库中的角色是 read
{ role: "read", db: "reporting" },
{ role: "read", db: "products" },
{ role: "read", db: "sales" },
{ role: "readWrite", db: "accounts" }
]
})
2.3 增删改查操作
针对刚才创建的用户,测试能否进行增删改查操作。更多增删改查操作,参照官网手册。
2.3.1 插入单条数据
db.users.insertOne({name: ‘李二’, age: 30})
其中 users 表示collections(集合)。collections 在MongoDB中是非常重要的概念,相当于关系型数据库的Table(表格)。在MongoDB中,用户不需要显式定义Collection就能向Collection插入数据。
查看当前database中的collection列表:
show collections
2.3.2 查询所有结果
db.users.find({})
2.3.3 更新数据
db.users.updateOne({name: ‘李二’}, {$set: {age: 35}})
- 第一个参数表示过滤条件;
- 第二个参数表示更新内容。使用$set操作符对age字段设置指定值;
2.3.4 删除文档
删除满足匹配条件的最多一个文档。
db.users.deleteOne({name: “李二”})