目录
- [MongoDB 权限的设计](#MongoDB 权限的设计)
-
- [演示前准备:启动 mongodb 服务器 和 客户端 :](#演示前准备:启动 mongodb 服务器 和 客户端 :)
-
- [1、启动单机模式的 mongodb 服务器](#1、启动单机模式的 mongodb 服务器)
- [2、启动 mongodb 的客户端](#2、启动 mongodb 的客户端)
- [MongoDB 权限的设计](#MongoDB 权限的设计)
-
- [1、MongoDB 的每个数据库都可以保存用户,不止admin数据库可以保存用户。](#1、MongoDB 的每个数据库都可以保存用户,不止admin数据库可以保存用户。)
- 2、保存用户的数据库和该用户有权限操作的数据库完全可以是不同的。
- 3、当用户登录时,必须在保存该用户的数据库中才能登录。
- 4、该用户登录之后,能否操作哪个数据库,才能看出来该用户对哪些数据库有操作权限。
- 5、在MongoDB中创建一个数据库之后,应该在该数据库中创建自己存储的用户,否则就无法在初始连接时仅通过该数据库建立连接
MongoDB 权限的设计
演示前准备:启动 mongodb 服务器 和 客户端 :
本次演示,只需要启动一个 单机模式的 mongodb 服务器 和 一个 mongodb 的客户端,
1、启动单机模式的 mongodb 服务器
打开命令行窗口,执行如下命令即可启动 MongoDB 服务器了
mongod.exe --config "E:\install\mongodb\mongodb-4.2.25\mongod.conf"
就是只启动一个 mongodb 的服务器
2、启动 mongodb 的客户端
启动 mongodb 的客户端,指定要连接的 mongodb 服务器的端口号:
mongo mongodb://192.168.0.107:27017
即可启动 mongodb 的客户端
启动成功,如图:
之所以只需要输入 mongo 就能启动 mongodb 的客户端,是因为我之前把 mongodb 的 bin 目录添加到 path 环境变量里面 。
MongoDB 权限的设计
1、MongoDB 的每个数据库都可以保存用户,不止admin数据库可以保存用户。
这一点和传统数据库只能使用系统数据库来保存用户是截然不同的。
2、保存用户的数据库和该用户有权限操作的数据库完全可以是不同的。
比如 ljh 这个用户保存在 【admin】这个数据库里面,但是创建 ljh 这个用户的时候,只给这个用户操作【springboot】这个数据库的权限。
所以虽然 ljh 这个用户是在【admin】 这个数据库创建的,当时确没有操作【admin】数据库的权限。
3、当用户登录时,必须在保存该用户的数据库中才能登录。
比如我登录到 admin 这个数据库
mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456
然后创建一个数据【hahaha】
在【hahaha】数据库添加一个用户叫 AAA,然后这个用户对这个数据库有读写的权限
userAdmin:允许对指定数据库执行用户管理的权限,比如创建、删除和修改用户
db.createUser({ user: "AAA",pwd: "123456",roles: [
{ role: "readWrite", db: "hahaha" },
{ role: "userAdmin", db: "hahaha" }]
});
重点来了:这个用户是创建在【hahaha】这个数据库里面的。
演示用户登录时,先演示登录到保存该用户的数据中
mongo mongodb://192.168.0.107:27017/hahaha -u AAA -p 123456
如图,登录成功,还能执行查看用户的操作,说明登录成功没问题。
因为 【AAA】这个用户是保存在【hahaha】这个数据库中的,说明当用户登录时,必须在保存该用户的数据库中才能登录。
AAA 用户是保存在【hahaha】数据库的,现在看能不能登录到 admin 数据库
mongo mongodb://192.168.0.107:27017/admin -u AAA -p 123456
如图:登录失败,这就说明了当用户登录时,必须在保存该用户的数据库中才能登录。
【注意】此时的【hahaha】数据库只是添加了 【AAA】这个用户,还不算是真正创建出这个数据库来,
所以给这个数据库添加一条数据,【hahaha】数据库才算是真正创建出来。
4、该用户登录之后,能否操作哪个数据库,才能看出来该用户对哪些数据库有操作权限。
【切记:】 用户保存在哪个数据库中,用户初始登录时就必须连接该数据库------只有连接该数据库才能验证用户。
这个在第3点也说了,就是 【AAA】这个用户,是保存在【hahaha】这个数据库里面的,所以在初始登录的时候,【AAA】这个用户只有指定是登录【hahaha】这个数据库,才能登录成功,授权成功。
这里再演示一遍:
登录mongodb时,【admin -u admin -p 123456】这个指定【登录的数据库、账号和密码】,就是初始登录时连接的数据
mongo mongodb://192.168.0.107:27017/admin -u admin -p 123456
1、登录的是admin用户,登录的数据库是保存admin用户的【admin】数据库,所以admin这个用户可以正常使用命令查看数据库
2、登录的是 AAA 用户,AAA用户是保存在【hahaha】数据库里面的,但是此时的初始登录,连接的是admin 数据库
mongo mongodb://192.168.0.107:27017/admin -u AAA -p 123456
如图:AAA用户在初始登录时,验证授权没通过,因为用户保存在哪个数据库中,用户初始登录时就必须连接该数据库------只有连接该数据库才能验证用户
3、登录的是 AAA 用户,AAA用户是保存在【hahaha】数据库里面的,此时的初始登录,连接的就是【hahaha】数据库
mongo mongodb://192.168.0.107:27017/hahaha -u AAA -p 123456
如图:AAA用户登录之后,能操作到【hahaha】数据库这个数据库,报名这个用户有操作这个数据库的权限。
但是如图,它只能查看到 【hahaha】这个数据库,也表明它只对这个数据库有操作权限。
注意:因为 AAA 用户只有操作 【hahaha】 数据库的权限,所以查看命令也只能查看到自己有权限操作的数据库。
admin 之所以能查看所有数据库,是因为在之前设置时,把它设置成管理员。
5、在MongoDB中创建一个数据库之后,应该在该数据库中创建自己存储的用户,否则就无法在初始连接时仅通过该数据库建立连接
如图:根据3、4点的解释,来说明:登录的是 AAA 用户,AAA用户是保存在【hahaha】数据库里面的,但是此时的初始登录,连接的是admin 数据库,所以就无法在初始连接时与该数据库建立连接。
演示:
说明:如果你希望程序可以一开始就能连接你所创建的数据库,
-
你应该在该数据库中创建自己的用户。
-
且要让该用户有操作本数据库的权限------否则你只能登录,登录之后根本就无法访问该数据库。
【通常:】 通常保存用户的数据库,跟用户有权限操作的数据库还是应该相同,这样才更符合逻辑。
1、创建一个springboot的数据库
2、在springboot中创建一个用户,且要让该用户有操作本数据库的权限
(这个用户只有读写的权限)
账号:LJHCCC
密码:123456
db.createUser({ user: "LJHCCC",pwd: "123456",roles: [
{ role: "readWrite", db: "springboot" },
{ role: "userAdmin", db: "springboot" }]
});
在启动一个命令行窗口,登录这个数据库
mongo mongodb://192.168.0.107:27017/springboot -u LJHCCC -p 123456
如图:在MongoDB中创建一个数据库(springboot)之后,在该数据库中创建自己存储的用户(LJHCCC),就可以在初始连接时通过该数据库建立连接
因为 LJHCCC 这个用户只能操作 springboot 这个数据库,
所以查看有哪些数据库时,也只能查到有他操作权限的那个数据库
演示创建一个数据库,然后添加一个用户,这个数据库还是没有被真正创建出来,只有往该数据库插入数据,才能算是正在创建出该数据库。
账号:LJHAAA
密码:123456
db.createUser({ user: "LJHAAA",pwd: "123456",roles: [
{ role: "readWrite", db: "local" },
{ role: "userAdmin", db: "local" },
{ role: "readWrite", db: "springboot" },
{ role: "userAdmin", db: "springboot" }]
});
添加一条数据的命令:db.test.insert({"aaa":1})