设置MongoDB账户密码
背景
MongoDB裸奔确实很爽,尤其是在服务器上用来学习再适合不过了,但是网络有风险,裸奔需谨慎
。这不之前在学习MongoDB的时候裸奔,开放了27017端口号,结果被黑了,所有的测试数据
都被加密了,库都没了,只留下了一条留言,感觉这条留言好像在嘲讽我,没有设置账户和密码,附上截图:
让我花费点大洋购买0.021比特币,家人们,瞬间笑不活了,就这一百多万条测试数据就收0.021,那以后是不是找到了发家致富的道路,哈哈哈哈哈,玩笑归玩笑,兄弟们,切勿当真。问题来了,现在已经知道了因为裸奔导致库被黑,那么貌似
现在只需要设置账户名密码就OK
PS❤️:如果你的数据非常重要,而且没有备份的话,讲道理兄弟,你可能需要花费点大洋买比币了🙈(因为我之前允许所有来源0.0.0.0
,或许可以尝试允许定向IP访问)
正文开始
1、准备工作
因为之前是裸奔,所以先暂时把防火墙中的27017端口先关闭,防止在重新配置过程中再次被黑掉
2、删除之前的数据库
因为我的MongoDB数据库是使用Docker进行安装的,所以先删除之前的MongoDB容器,所有数据都被黑了,也没有保留的必要了,害怕被插入后台运行脚本,所以干脆删除了吧!!!
# 查看所有运行的容器
> docker ps
# 停止运行中的MongoDB容器
> docker stop CONTAINER ID(容器编号)
# 删除刚刚停止的MongoDB容器
> docker rm 容器id
3、运行MongoDB容器
因为我的docker中的MongoDB中的版本是5.0.7,所以兄弟们在运行MongoDB容器的时候要注意版本号,或者是重新拉取一个和我一样的版本也可以,貌似目前我的版本是最新的(2022-04-30)
# 拉取MongoDB5.0.7版本的数据库
> docker pull mongo:5.0.7
# 查看拉取的镜像
> docker images
# 运行docker容器
> docker run -d --name mongo(给容器起个名称) -p 27017:27017 mongo:5.0.7 --auth
4、设置账户名密码
4.1、进入MongoDB数据库
直接进入docker容器
# 查看当前运行的docker镜像
> docker ps
# 进入MongoDB容器
> docker exec -it mongo(容器名称) bash
# 进入MongoDB数据库
> mongo
或者进入linux解压完之后的mongoDB文件夹中的bin文件夹,运行脚本
> ./mongo
4.2、MongoDB默认角色
角色描述 | 角色标识 |
---|---|
数据库用户角色 | read、readWrite |
数据库管理角色 | dbAdmin、dbOwner、userAdmin |
集群管理角色 | clusterAdmin、clusterManager、clusterMonitor、hostManager |
备份恢复角色 | backup、restore |
所有数据库角色 | readAnyDatabase、readWriterAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase |
超级用户角色 | root |
权限相关说明❤️
- read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,所索引的创建、删除等
- userAdmin:允许用户向system.users集合中写入数据,可以找指定数据库李创建、删除、管理用户
- clusterAdmin:只在Admin数据库中可用,用来赋予用户所有分片和赋值集群相关函数的管理权限
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriterAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
- root:只在admin数据库中可用。全部权限
因为MongoDB和关系型数据库类似都有库的相关概念,所以先创建一个总的管理员账户
# 查看所有的库
> shwo dbs
# 选择admin库
> use admin
# 新增账户
>db.createUser({
user: '账户', # 用户名
pwd: '密码', # 密码
roles:[{
role: 'root', # 超级用户角色
db: 'admin' # 该角色所对应的数据库
}]
})
# 完成之后,可以查一下是否设置成功
> show users
4.3、创建数据库以及每个数据库对应的角色
切换刚刚创建的管理员用户,创建一个新的数据库(demo)以及对应管理的角色(zhangsan)
# 使用admin数据库 一定要使用admin数据库,否则会登录不上
> use admin
# 使用db.auth("username","password")来登录管理员账户,如果登录成功则显示1
> db.auth("管理员账户","管理员密码")
# 创建一个新的数据库
> use demo
# 创建一个新的用户 来给这个数据库设置一个对应的角色
>db.createUser({
user: 'zhangsan', # 用户名
pwd: 'zhangsan', # 密码
roles:[{
role: 'dbOwner', # 数据库管理角色
db: 'demo' # 该角色所管理的数据库 也就是刚才所建的demo
}]
})
# 执行完之后可以查询一下demo数据对应的用户是否设置成功
> show users
角色管理操作对应的数据库的sql,登录完之后就可以对库中的集合和文档进行操作了
# 登录方式一
> mongo
# 选择对应的数据库
> use database
# 登录该数据库对应的账户角色
> db.auth("username","password")
# 登录方式二
> mongo database名 -u username -p password
4.4、用户角色以及数据库的使用
注意❤️:admin库的超级用户角色,demo库以及demo库的管理角色(zhangsan)创建完毕之后,在使用zhangsan账户去操作demo数据库之前需要退出当前的shell脚本(ps:退出当前脚本也会退出当前登录的超级用户角色
),因为MongoDB一次会话不允许认证多个用户
,如果强行操作会提示mongodb logical sessions can't have multiple authenticated users
# 退出当前MongoDB数据库
> exit
# 登录方式1
# 重新进入MongoDB数据,以docker为例 进入容器后直接运行mongo命令即可
> mongo
# 先不要登录,直接切换数据库
> use demo
# 登录刚才使用超级管理用户创建的demo数据库对应的角色 登录完之后就可以对该数据库进行操作了
> db.auth("zhangsan","zhangsan")
# 登录方式2直接使用命令登录
> mongo 数据库名称 -u 该数据库对应权限账户 -p
# 即
> mongo demo -u zhangsan -p zhangsan
4.5、使用Navicat连接服务器MongoDB数据库
PS❤️:因为在设置用户名和密码之前把防火墙对应的MongoDB的端口关掉了,所以要先将端口打开,打开完之后再去设置Navicat
4.5.1、管理所有的库
主机:服务器的IP地址或者域名
端口:MongoDB映射的端口号
验证:None -> Password
验证数据库:admin
用户名:之前在4.2中新建的超级角色用户
密码:超级角色用户的密码
4.5.2、仅仅对于某个数据库管理
以4.3创建的demo数据库为例
主机:服务器的IP地址或者域名
端口:MongoDB映射的端口号
验证:None -> Password
验证数据库:demo
用户名:zhangsan
密码:zhangsan
4.6、SpringBoot集成MongoDB
配置文件需要进行修改
在裸奔的时候我的配置文件(application.yml)中写的是如下配置
# mongodb 没有开启任何安全协议
# mongodb(协议)://ip地址或域名(主机):27017(端⼝)/demo(库名)
spring:
data:
mongodb:
uri: mongodb://ip地址或域名:27017/demo
设置完账户密码之后修改为以下内容
spring:
data:
mongodb:
username: zhangsan # 账户
password: zhangsan # 密码
database: demo # 该账户所对应的库
host: ip地址或域名 # 服务器ip地址或域名
port: 27017 # MongoDB端口号
结束
以上内容就是我整理的MongoDB设置账户名和密码,因为是自己的个人小总结,可能会有纰漏或不同的地方,有任何问题可以留言。兄弟们加油!