情况

首先需要明确的是mongoDB是没有默认管理员权限的,后端代码连接数据库,不需要账户密码,在自己本地开发的时候,确实是方便了些,但如果是要开放或者上线的话,虽然是局域网,但也不应该继续让数据库裸奔啦。

方法步骤

  1. admin数据库(admin数据库是mongoDB自带的数据,有一张user表,用来存放用户,以及用户权限),添加管理员账号
    切换到数据库admin
use admin
  1. 创建超级管理员账号root,密码123456
db.createUser({user: "root", pwd: "123456", roles: [{role: "root", db:"admin"}})
  1. 可以查看创建的账号
show users
  1. 重新启动mongoDB(以命令启动为例,也可以用mongodb.conf配置文件设置auth=true,),并开启权限验证(命令行启动,直接启动时加 --auth参数即可)
mongod --auth
  1. 验证身份方式一
mongo
use admin
db.auth('root', '123456')
  1. 验证身份方式二 mongo ip:port/database --username "username" -- password "password"
mongo localhost:27017/admin --username "root" -- password "123456"
  1. 给某个数据库test单独设置管理员
use test  // 跳转到需要添加用户的数据库
db.createUser({
  user: 'testAdmin',  // 用户名
  pwd: '123456',  // 密码
  roles:[{
    role: 'readWrite',  // 角色
    db: 'test'  // 数据库名
  }]
})

Robo 3T的身份验证

  1. 点击编辑
  2. 切换到Authentication,填写User name和Password,并保存
  3. 发现已经有了账号和权限,点击连接数据库

Node中mongoose代码中身份验证

const mongoose = require('mongoose');
// mongoose.connect('mongodb://username:password@host:port/database?options...');
// 账号:密码@ip:端口/数据库

mongoose.connect('mongodb://testAdmin:123456@localhost/test', 
{useNewUrlParser: true, useUnifiedTopology: true});

常用命令

show users  // 查看当前库下的用户
db.dropUser('testadmin')  // 删除用户
db.updateUser('admin', {pwd: '654321'})  // 修改用户密码
db.auth('admin', '654321')  // 密码认证

数据库角色与权限

Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

参考信息:
mongodb 设置用户账号密码MongoDB 设置用户名密码mongodb设置账号密码MongoDB学习笔记(六)——MongoDB配置用户账号与访问控制