环境

MongoDB:4.4.6
MacBook Pro

前言

已经安装好了MongoDB
如何安装MongoDB,可以参考:Macbook pro 安装 MongoDB

这篇和以前写的

测试数据

我们现在假设,创建好了两个数据库:ssmwoos

数据库:ssm
	   |__user 表
数据库:woos
	   |__template 表

启用权限前,需要先创建管理员用户

官方说明:

With access control enabled, ensure you have a user with userAdmin or userAdminAnyDatabase role in the admin database. This user can administrate user and roles such as: create users, grant or revoke roles from users, and create or modify customs roles.

启用访问控制后,请确保您在admin数据库中拥有一个具有userAdmin或userAdminAnyDatabase角色的用户。该用户可以管理用户和角色,例如:创建用户,向用户授予或撤消角色,以及创建或修改海关角色。

https://docs.mongodb.com/manual/tutorial/enable-authentication/#user-administrator

创建管理员账号

admin数据库是管理用户权限的数据库。

在Robo 3T中执行如下命令:

use admin
db.createUser(
  {
    user: "admin",
    pwd: "admin", // or cleartext password
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

执行后的结果:

Successfully added user: {
	"user" : "admin",
	"roles" : [
		{
			"role" : "userAdminAnyDatabase",
			"db" : "admin"
		},
		"readWriteAnyDatabase"
	]
}

说明:
use admin: 切换数据库的作用;
上面的过程是:
①先切换到admin数据库
②然后创建admin账号,并赋予相应的角色。

认证数据库

MongoDB用户账号有个特点是和数据库进行绑定的

userAdminAnyDatabase 角色具有的权限:
https://docs.mongodb.com/manual/reference/built-in-roles/#mongodb-authrole-userAdminAnyDatabase

创建普通账号

接下来创建一个普通用户:

use woos
db.createUser(
  {
    user: "yutao",
      pwd: "yutao",
      roles: [{role: "readWrite", db: "woos"},
               {role: "read", db: "ssm"}]
  }
)

上面是创建了一个账户名:yutao,密码是:yutao的用户,该用户,注册数据是woos,具有读写权限;除此之外,授予该账户,具有数据库ssm的读权限;

修改用户权限:

use woos
db.updateUser("yutao",
  {
      roles: [{role: "readWrite", db: "woos"},
               {role: "read", db: "ssm"}]
  }
);

创建超级用户root账户

use admin
db.createUser(
	{
	  user: "root",
	  pwd: "root",
	  roles: [ {role: "root", db: "admin"} ]
	}
)

root 角色具有的权限:https://docs.mongodb.com/manual/reference/built-in-roles/#mongodb-authrole-root

启用权限

在配置文件中添加如下配置:

我配置文件的路径是:vim data/mongodb/config/mongod.conf

security:
    authorization: enabled

完整的配置:

systemLog:
   destination: file
   path: "logs/mongodb/mongod.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "data/mongodb/db"
net:
   port: 27017
security:
    authorization: enabled

我们先停止mongodb服务,因为我是使用命令方式启动,所以只需要Ctrl + C就可以关闭服务;

也可以在Robo 3T客户端中,执行如下命令来关闭MongoDB服务:

// 执行该命令需要root角色的账号才行。
db.adminCommand( { shutdown: 1 } )

执行上面的命令,需要root角色的账号才行。

然后,再启动MongoDB服务。

yutao@MacBook-Pro ~ % mongod --config ~/data/mongodb/config/mongod.conf

使用账号登录

利用Robo 3T进行登录:

mongodb修改用户权限 mongodb用户权限设置_数据

mongodb修改用户权限 mongodb用户权限设置_数据库_02


mongodb修改用户权限 mongodb用户权限设置_mongodb修改用户权限_03

成功后的效果:

mongodb修改用户权限 mongodb用户权限设置_数据库_04

特别说明

Robo 3T 以前的版本,普通账号,只能看到认证数据,是不会显示其他数据的;

比如:普通账号:yutao的认证数据库是woos,并且也对ssm数据库拥有读权限,没有写权限;以前的版本中,是看不到ssm的显示的;但是新版本中,如上面的图示,已经能看到了。

今天想到这里时,我突然有个疑问:

① 到底是mongodb取消了认证数据库的限制,还是因为robo 3T的版本升级的缘故,所以能看到非认证数据库?

带着这样的疑问,我在window电脑上做实验(因为window电脑上,安装的mongodb是3.4.2)

mongodb修改用户权限 mongodb用户权限设置_数据_05

账号说明:

{
    "_id" : "test.yutao",
    "user" : "yutao",
    "db" : "test",
    "credentials" : {
        "SCRAM-SHA-1" : {
            "iterationCount" : 10000,
            "salt" : "qgewkOikdl4c/tXTAjd+4Q==",
            "storedKey" : "0k7fgg42EFwmrrykGUsxotvL/x0=",
            "serverKey" : "LvjDxD/rbSVgMUEixrbbbQF5BBg="
        }
    },
    "roles" : [ 
        {
            "role" : "read",
            "db" : "myTest"
        }, 
        {
            "role" : "readWrite",
            "db" : "test"
        }
    ]
}

也就是说:yutao账号的认证数据库是test,并且对myTest数据库有读的权限。

然后我再下载最新版的Robo 3T,之后在连接:

mongodb修改用户权限 mongodb用户权限设置_mongodb_06


上面的提示是指,如果想访问指定的数据库,可以在window -> Authentication tab页面中指定。

mongodb修改用户权限 mongodb用户权限设置_mongodb_07


可以看到,只能看到认证数据库test

现在我们根据提示来操作下:

mongodb修改用户权限 mongodb用户权限设置_数据库_08

实际上,认证数据库test可以不用指定,也会显示出来。
看到截图中粗体字:listDatabases;可以猜测, Robo 3T利用这道命令来达到显示效果;

再次,连接:

mongodb修改用户权限 mongodb用户权限设置_mongodb修改用户权限_09


我们发现,已经可以显示出来了,所以这只是因为Robo 3T版本升级带来的变化。

listDatabases

参考地址:

Enable Access Control

Built-In Roles