Mongodb

参考文档

  1. Mongodb菜鸟教程
  2. Mongodb官方文档

安装

macOS 系统使用 brew 安装 mongodb

# 更新 brew
brew update
brew install mongodb

作为服务,立刻启动并且系统登录自动启动

brew services start mongodb
brew services stop mongodb

仅当前启动一次

mongod --config /usr/local/etc/mongod.conf

配置

brew 安装位置

/usr/local/Cellar/mongodb/x.x.x

配置文件

/usr/local/etc/mongod.conf

配置初始内容

systemLog:
  destination: file
  // 日志文件位置
  path: /usr/local/var/log/mongodb/mongo.log
  logAppend: true
storage:
  // 数据库存储位置
  dbPath: /usr/local/var/mongodb
net:
  // 绑定访问IP
  bindIp: 127.0.0.1

修改配置

当前使用的用户名为 rainx

修改日志文件位置以及数据库位置,添加用户权限验证

systemLog:
  destination: file
  path: /Users/rainx/Documents/MongoDB/log/mongo.log
  logAppend: true
storage:
  dbPath: /Users/rainx/Documents/MongoDB/db
net:
  bindIp: 127.0.0.1
security:
  authorization: enabled

角色介绍

  1. 数据库用户角色:针对每一个数据库进行控制。
    1. read:提供了读取所有非系统集合,以及系统集合中的 system.indexes, system.js, system.namespaces
    2. readWrite:包含了所有read权限,以及修改所有非系统集合的和系统集合中的 system.js 的权限.
  2. 数据库管理角色:每一个数据库包含了下面的数据库管理角色。
    1. dbOwner:该数据库的所有者,具有该数据库的全部权限。
    2. dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:dbAdmin
    3. userAdmin:为当前用户创建、修改用户和角色。拥有 userAdmin 权限的用户可以将该数据库的任意权限赋予任意的用户。
  3. 集群管理权限:admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
    1. clusterAdmin:提供了最大的集群管理功能。相当于 clusterManager / clusterMonitor / hostManager / dropDatabase的权限组合。
    2. clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作 config 和 local 数据库(即分片和复制功能)
    3. clusterMonitor:仅仅监控集群和复制集。
    4. hostManager:提供了监控和管理服务器的权限,包括 shutdown 节点,logrotate, repairDatabase 等。
    5. 备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backuprestore等等。
  4. 所有数据库角色:admin数据库提供了一个mongod实例中所有数据库的权限角色:
    1. readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。
    2. readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
    3. userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
    4. dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
  5. 超级管理员权限
    1. root:dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。
  6. 备份恢复角色:backuprestore
  7. 内部角色:__system

创建用户

数据库用户有两种,一种是管理员,用来管理用户,一种是普通用户,用来访问数据。

为 Mongodb 规划用户鉴权时,至少要规划两种角色:用户管理员和数据库用户。如果搭建了分片或主从,可能还会要规划数据库架构管理员的角色,它们专门用来调整数据库的 分布式架构。

创建用户管理员

用户管理员是第一个要创建的用户。在没有创建任何用户之前,你可以随意创建用户;但数据库中一旦有了用户,那么未登录的客户端就没有权限做任何操作了,除非使用db.auth(username, password)方法登录。

用户管理员的角色名叫 userAdminAnyDatabase,这个角色只能在 admin 数据库中创建。

切换到 admin 数据库

use admin

创建用户 xzy

db.createUser({
  user: "xzy",
  pwd: "123456",
  roles:["userAdminAnyDatabase"]
});

创建完了之后,我们应该马上以该用户的身份登录,方法返回 1 表示登录成功。

db.auth( "xzy", "123456" );

创建数据库用户

首先保证你已经以用户管理员的身份登录 admin 数据库。然后用 use 命令切换到目标数据库,同样用db.createUser() 命令来创建用户,其中角色名为 “readWrite”。

> use test
switched to db blog
> db.createUser({ user: "username", pwd: "123456", roles:["readWrite"]}) 
Successfully added user: { "user" : "username", "roles" : [ "readWrite" ] }
> db.auth( "username","123456" )
1

常用的用户函数

函数 描述
db.getUsers() 获得数据库的所有用户权限信息
db.getUser() 获得数据库某个用户权限信息
db.createRole() 创建角色
db.updateRole() 更新角色
db.dropRole() 删除角色
db.getRole() 获得某个角色信息
db.dropUser() 删除用户
db.dropAllUsers() 删除所有用户
db.grantRolesToUser() 将一个角色赋予给用户
db.revokeRolesFromUser() 撤销某个用户的某个角色权限
db.changeUserPassword() 更改密码

数据库操作

如果数据库不存在,则创建数据库,否则切换到指定数据库。

> use blog
switched to db blog
> db
blog
>

查看所有有数据的数据库,刚创建的数据库要插入数据才会显示

> show dbs
admin  0.078GB
local  0.078GB
>

创建 xzy 用户

# > db.createUser({ user: "xzy", pwd: "123456", roles: ["readWrite"] });
> db.createUser({
  user: "diandao",
  pwd: "diandao",
  roles: [{
    role: "readWrite",
    db: "diandao"
  }],
  mechanisms : ["SCRAM-SHA-1"]
});
# Successfully added user: { "user" : "xzy", "roles" : [ "readWrite" ] }
Successfully added user: {
    "user" : "diandao",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "diandao"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1"
    ]
}

获取操作权限

> db.auth( "xzy", "123456" );

创建名为 users 的集合,插入数据

> db.users.insert({ "username": "admin", password: "123456" });
WriteResult({ "nInserted" : 1 })
> show dbs
admin  0.078GB
blog   0.078GB
local  0.078GB
> db.users.find()
{ "_id" : ObjectId("5a9615240449c046146033ab"), "username" : "admin", "password" : "123456" }
>

results matching ""

    No results matching ""