情况
首先需要明确的是mongoDB
是没有默认管理员权限的,后端代码连接数据库,不需要账户密码,在自己本地开发的时候,确实是方便了些,但如果是要开放或者上线的话,虽然是局域网,但也不应该继续让数据库裸奔啦。
方法步骤
- 在
admin
数据库(admin
数据库是mongoDB
自带的数据,有一张user
表,用来存放用户,以及用户权限),添加管理员账号切换到数据库admin
use admin
创建超级管理员账号root,密码123456
db.createUser({user: "root", pwd: "123456", roles: [{role: "root", db:"admin"}})
可以查看创建的账号
show users
- 重新启动
mongoDB
(以命令启动为例,也可以用mongodb.conf
配置文件设置auth=true
,),并开启权限验证(命令行启动,直接启动时加--auth
参数即可)
mongod --auth
验证身份方式一
mongo
use admin
db.auth('root', '123456')
验证身份方式二 mongo ip:port/database --username "username" -- password "password"
mongo localhost:27017/admin --username "root" -- password "123456"
- 给某个数据库
test
单独设置管理员
use test // 跳转到需要添加用户的数据库
db.createUser({
user: 'testAdmin', // 用户名
pwd: '123456', // 密码
roles:[{
role: 'readWrite', // 角色
db: 'test' // 数据库名
}]
})
Robo 3T的身份验证
- 点击编辑
- 切换到Authentication,填写User name和Password,并保存
- 发现已经有了账号和权限,点击连接数据库
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配置用户账号与访问控制