默认情况下,MongoDB实例启动运行时是没有启用用户访问权限控制的,也就是说,在实例本机服务器上都可以随意连接到实例进行各种操作,MongoDB默认不会对连接客户端进行用户验证,在实际开发中无权限访问操作非常危险。
Mongodb存储所有的用户信息在 admin 数据库的集合 system.users中,保存用户名、密码和数据库信息。
如果不指定数据库,则创建的指定的权限的用户在所有的数据库上有效。
角色:
角色说明:
| 角色 | 权限描述 |
|---|---|
| read | 可以读取指定数据库中任何数据 |
| readWrite | 可以读写指定数据库中任何数据,包括创建、重命名、删除集合 |
| readAnyDatabase | 可以读取所有数据库中任何数据(除了数据库config和local之外) |
| readWriteAnyDatabase | 可以读写所有数据库中任何数据(除了数据库config和local之外) |
| userAdminAnyDatabase | 可以在指定数据库创建和修改用户(除了数据库config和local之外) |
| dbAdminAnyDatabase | 具有对任意数据库操作的权限(除了数据库config和local之外) |
| dbAdmin | 具有对指定数据库操作的权限(除了数据库config和local之外) |
| userAdmin | 创建和修改用户权限 |
| clusterAdmin | 可以对整个集群或数据库系统进行管理操作 |
| backup | 备份MongoDB数据权限 |
| restore | 从备份文件中还原MongoDB数据(除了system.profile集合)的权限 |
| root | 超级账号,超级权限 |
常用角色配置:
数据库用户角色:read、readWrite
所有数据库用户角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
数据库管理角色:dbAdmin、dbOwner、userAdmin
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色:backup、restore
超级用户角色:root
内部角色:system
单机配置:
管理用户创建:
登录单机MongoDB,选择 admin 数据库进行角色创建
#使用单机MongoDB配置进行登录/usr/local/mongo/bin/mongod -f /mongod.conf#选择数据库use admin#创建超级用户db.createUser({user:"myroot",pwd:"123456",roles:["root"]})#创建专门用来管理admin库的账号myadmin,只用来作为用户权限的管理db.createUser({user:"myadmin",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
查看所有角色创建目录:
db.system.users.find().pretty() 需切换到admin库,格式化输出角色数据
<br />**角色配置成功**
验证角色配置可用性:
use admin 选择admin数据库db.auth("myroot","12345") 输入错误的密码,返回错误信息db.auth("myroot","123456") 验证成功,返回1

验证成功
普通用户创建:
创建普通用户可以在没有开启认证的时候添加,也可以在开启认证之后添加,但开启认证之后,必须使用有操作admin库的用户登录认证后才能操作。底层都是将用户信息保存在了admin数据库的集合 system.users 中。
#切换到目标数据库use articledb#创建用户,拥有articledb数据库的读写权限readWrite,密码是123456db.createUser({user: "bobo", pwd: "123456", roles: [{ role: "readWrite", db:"articledb" }]})#测试可用性db.auth("bobo","123456")
开启认证登录:
开启认证登录后,在未登录角色账号的情况下无法对MongoDB进行任何操作
参数方式开启:
/usr/local/mongodb/bin/mongod -f mongod.conf --auth 参数开启认证,不推荐
配置文件方式开启:
在配置文件中添加认证
security:#开启授权认证authorization: enabled

修改配置文件
用户登录:
开启认证配置后进入Shell界面,每个MongoShell只能认证一个用户,当已经使用 A 数据库的用户认证后,其他数据库的用户将无法认证,需要先退出再进行认证
use admin 使用admin 数据库db.system.users.find() 未认证下进行查询操作将报错db.auth("myroot","123456") 进行用户认证db.system.users.find() 再次查询数据,成功返回
<br />**未认证下无法进行任何操作,认证后数据查询成功**
切换数据库后进行再次认证,提示用户过多,需要先退出Shell再重新选择数据库进行用户认证才能完成操作
use articledb 使用articledb数据库db.comment.find() 未认证下进行查询操作将报错db.auth("bobo","123456") 进行用户认证db.comment.find() 再次查询数据,成功返回
<br />** 已经认证了admin的用户,此时在认证articledb的用户将会超出认证数量限制**
一键登录:
在登录命令中直接指定需要操作的数据库和用户信息即可实现访问
/usr/local/mongo/bin/mongo --port 端口号 --authenticationDatabase 数据库 -u 用户名 -p 密码
SpringBoot整合:
指定用户名、密码、操作的数据库、端口即可
#uri的效果和注释的四条注解一致spring:data:mongodb:uri: mongodb://bobo:123456@192.168.182.147:27017/articledb#username: bobo#password: 123456#database: articledb#host: 192.168.182.147:27017
复制集配置:
对于用户账号,只需要在主节点上添加用户,副节点即会自动同步;外部访问需要认证用户,且复制集和分片集群内的各个节点需要使用秘钥文件来进行认证
所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限,否则会报错:permissions on 秘钥文件路径 are too open
这里以《复制集》章节搭建的集群为例进行演示
管理用户添加:
#启用副本集/usr/local/mongo/bin/mongod -f /mongodb/replica_sets/myrs_27017/mongod.conf/usr/local/mongo/bin/mongod -f /mongodb/replica_sets/myrs_27018/mongod.conf/usr/local/mongo/bin/mongod -f /mongodb/replica_sets/myrs_27019/mongod.conf#切换数据库并添加管理员用户use admindb.createUser({user:"myroot",pwd:"123456",roles:["root"]})
创建秘钥文件:
openssl rand -base64 90 -out ./mongo.keyfilechmod 400 ./mongo.keyfile 设置为对当前用户可读ll mongo.keyfile

创建秘钥文件成功
将秘钥文件拷贝到具体的文件夹(模拟集群位于不同的Linux主机)
cp mongo.keyfile /mongodb/replica_sets/myrs_27017cp mongo.keyfile /mongodb/replica_sets/myrs_27018cp mongo.keyfile /mongodb/replica_sets/myrs_27019
修改各节点配置文件:
依次修改27017、27018、27019节点的配置文件,添加 security 参数即可,这里以 27017节点为例进行演示
vim /mongodb/replica_sets/myrs_27017/mongod.conf
systemLog:destination: filepath: "/mongodb/replica_sets/myrs_27017/log/mongod.log"logAppend: truestorage:dbPath: "/mongodb/replica_sets/myrs_27017/data/db"journal:enabled: trueprocessManagement:fork: truepidFilePath: "/mongodb/replica_sets/myrs_27017/log/mongod.pid"net:bindIp: 0.0.0.0port: 27017replication:replSetName: myrssecurity:#KeyFile鉴权文件keyFile: /mongodb/replica_sets/myrs_27017/mongo.keyfile#开启认证方式运行authorization: enabled
重启服务:
依次停止各个节点服务并进行重启,停止方式参考《复制集》章节的“关闭副本集”操作
普通用户添加:
切换到复制集的主节点,创建和单机配置中相同的用户账号
#切换数据库use admin#管理员账号认证db.auth("myroot","123456")#切换到需要创建用户账号的数据库use articledb#创建用户账号db.createUser({user: "bobo", pwd: "123456", roles: ["readWrite"]})
SpringBoot整合:
和单机认证一致,在未认证的基础上添加用户名:密码即可
spring:data:mongodb:uri: mongodb://bobo:123456@192.168.182.147:27017,192.168.182.147:27018,192.168.182.147:27019/articledb??maxIdleTimeMS=3000&connect=replicaSet&slaveOk=true&replicaSet=myrs
分片集群配置:
分片集群环境下的认证和复制集一致,各个节点之间都需要使用秘钥文件进行认证。如果在添加认证之前已存入数据,应先进行数据备份然后再还原,数据备份操作参考《MongoExport》章节,这里以《数据分片》章节搭建环境进行讲解
通过mongos添加的账号信息,只会保存到配置服务器节点中,具体的数据节点不保存账号信息,因
此,分片中的账号信息不涉及到同步问题。
创建秘钥文件:
openssl rand -base64 90 -out ./mongo.keyfilechmod 400 ./mongo.keyfile 设置为对当前用户可读ll mongo.keyfile

创建秘钥文件成功
拷贝到分片集群各节点目录中:
cp mongo.keyfile /mongodb/sharded_cluster/myshardrs01_27018/cp mongo.keyfile /mongodb/sharded_cluster/myshardrs01_27118/cp mongo.keyfile /mongodb/sharded_cluster/myshardrs01_27218/cp mongo.keyfile /mongodb/sharded_cluster/myshardrs02_27318/cp mongo.keyfile /mongodb/sharded_cluster/myshardrs02_27418/cp mongo.keyfile /mongodb/sharded_cluster/myshardrs02_27518/cp mongo.keyfile /mongodb/sharded_cluster/myconfigrs_27019/cp mongo.keyfile /mongodb/sharded_cluster/myconfigrs_27119/cp mongo.keyfile /mongodb/sharded_cluster/myconfigrs_27219/cp mongo.keyfile /mongodb/sharded_cluster/mymongos_27017/cp mongo.keyfile /mongodb/sharded_cluster/mymongos_27117/
修改配置文件:
mongos不需要认证,因此比mongod少了authorization:enabled的配置。配置文件修改方式参考复制集配置,这里各举一例:
副本集一 27018 节点修改:
vim /mongodb/sharded_cluster/myshardrs01_27018/mongod.conf
systemLog:destination: filepath: "/mongodb/sharded_cluster/myshardrs01_27018/log/mongod.log"logAppend: truestorage:dbPath: "/mongodb/sharded_cluster/myshardrs01_27018/data/db"journal:enabled: trueprocessManagement:fork: truepidFilePath: "/mongodb/sharded_cluster/myshardrs01_27018/log/mongod.pid"net:bindIp: 0.0.0.0port: 27018replication:replSetName: myshardrs01sharding:#分片角色clusterRole: shardsvrsecurity:#KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/myshardrs01_27018/mongo.keyfile#开启认证方式运行authorization: enabled
副本集二 27318 节点修改:
vim /mongodb/sharded_cluster/myshardrs02_27318/mongod.conf
systemLog:destination: filepath: "/mongodb/sharded_cluster/myshardrs02_27318/log/mongod.log"logAppend: truestorage:dbPath: "/mongodb/sharded_cluster/myshardrs02_27318/data/db"journal:enabled: trueprocessManagement:fork: truepidFilePath: "/mongodb/sharded_cluster/myshardrs02_27318/log/mongod.pid"net:bindIp: 0.0.0.0port: 27318replication:replSetName: myshardrs02sharding:#分片角色clusterRole: shardsvrsecurity:#KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/myshardrs02_27318/mongo.keyfile#开启认证方式运行authorization: enabled
配置服务器 27019节点修改:
vim /mongodb/sharded_cluster/myconfigrs_27019/mongod.conf
systemLog:destination: filepath: "/mongodb/sharded_cluster/myconfigrs_27019/log/mongod.log"logAppend: truestorage:dbPath: "/mongodb/sharded_cluster/myconfigrs_27019/data/db"journal:enabled: trueprocessManagement:fork: truepidFilePath: "/mongodb/sharded_cluster/myconfigrs_27019/log/mongod.pid"net:bindIp: 0.0.0.0port: 27019replication:replSetName: myconfigrssharding:clusterRole: configsvrsecurity:#KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/myconfigrs_27019/mongo.keyfile#开启认证方式运行authorization: enabled
MongOS 27017节点修改:
vi /mongodb/sharded_cluster/mymongos_27017/mongos.conf
systemLog:destination: filepath: "/mongodb/sharded_cluster/mymongos_27017/log/mongod.log"logAppend: trueprocessManagement:fork: truepidFilePath: "/mongodb/sharded_cluster/mymongos_27017/log/mongod.pid"net:bindIp: 0.0.0.0port: 27017sharding:#指定配置节点副本集configDB: myconfigrs/192.168.182.147:27019,192.168.182.147:27119,192.168.182.147:27219security:#KeyFile鉴权文件keyFile: /mongodb/sharded_cluster/mymongos_27017/mongo.keyfile
创建用户:
按照配置节点 > 分片节点 > 路由节点的顺序启动分片集群,先启动分片节点会提示启动失败,原因不明
#配置节点启动:/usr/local/mongo/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27019/mongod.conf/usr/local/mongo/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27119/mongod.conf/usr/local/mongo/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27219/mongod.conf#副本节点启动:/usr/local/mongo/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27018/mongod.conf/usr/local/mongo/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27118/mongod.conf/usr/local/mongo/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27218/mongod.conf/usr/local/mongo/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27318/mongod.conf/usr/local/mongo/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27418/mongod.conf/usr/local/mongo/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27518/mongod.conf#MongOS节点启动:/usr/local/mongo/bin/mongos -f /mongodb/sharded_cluster/mymongos_27017/mongos.conf/usr/local/mongo/bin/mongos -f /mongodb/sharded_cluster/mymongos_27117/mongos.conf
登录任意一个MongOS路由进行用户添加操作:
#切换数据库创建管理员:use admindb.createUser({user:"myroot",pwd:"123456",roles:["root"]})#验证管理员切换数据库创建普通用户:use articledbdb.auth("myroot","123456")db.createUser({user: "bobo", pwd: "123456", roles: [{ role: "readWrite",db: "articledb" }]})
SpringBoot整合:
spring:data:mongodb:uri: mongodb://bobo:123456@192.168.182.147:27017,192.168.182.147:27117/articledb
