Mongoldb 用户管理

Mongo 的用户是以数据库为单位来建立的,每个数据库有自己的管理员。

注意事项

用户管理注意:
验证库,建立用户时 use 到的库,在使用用户时,要加上验证库才能登陆。对于管理员用户,必须在 admin 下创建。
1. 建用户时,use 到的库,就是此用户的验证库 
2. 登录时,必须明确指定验证库才能登录
3, 通常,管理员用的验证库是 admin,普通用户的验证库一般是所管理的库设置为验证库 
4. 如果直接登录到数据库,不进行 use,黑认的验证库是 test,不是我们生产建议的。

角色关系

未命名文件

查看用户

show users

查看当前数据库下的管理用户

只需要切换到对应的数据库中即可查看

use mofang
show users

查看系统中所有的用户

需要切换到admin中使用账号管理员的权限进行操作

use admin

> db.auth('root', '123456')		// 如果开启了 mongodb 的访问控制,就需要先认证用户密码,才能继续如下操作
1

db.system.users.find()		// 只能在 admin 数据库中使用

> db.system.users.remove({user:'mofang'})			// 删除用户,默认返回状态吗 1 为操作成功;
WriteResult({ "nRemoved" : 1 })

db.system.users.find().pretty()		// pretty 结构化展示数据

创建用户

db.createUser(user, pwd, writeConcern)

创建一个数据库新用户用 db.createUser() 方法,如果用户存在则返回一个用户重复错误。

错误信息:uncaught exception: Error: couldn' t add user: User "用户名@数据库" already exists

{
    user: "用户名",
    pwd: "密码",
    customData: { <any information> }, //任意内容,主要是为了表示用户身份的相关介绍 
    roles: [ // 角色和权限分配
    		{role: "<role>", db: "<database>" }, // 也可以直接填写由 mongoDB 内置的角色,例如:"<role>"
    		....
    ]
}

Mongo 的用户是以数据库为单位来建立的,每个数据库有自己的管理员。

管理员可以管理自己的数据库,但是不能直接管理其他数据库,要先在内置数据库 admin 认证后才可以。管理员的权限设置包含了 2 块,分别是角色和权限,由 roles 属性进行设置。

内置角色

数据库用户角色:read、readWrite(读写,但是不能删除);
数据库管理角色:dbAdmin(管理员)、dbOwner(超级管理员)、userAdmin(可以自己分配用户);
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
备份恢复角色:backup、restore(恢复数据);
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 
超级用户角色:root
// 有几个角色间接或直接提供了系统超级用户的访问权限(dbOwner、userAdmin、userAdminAnyDatabase)

内置权限

Read:允许用户读取指定数据库 
readwrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问 system. Profile 
userAdmin:允许用户向 system. Users 集合写入,可以找指定数据库里创建、删除和管理用户 
clusterAdmin:只在 admin 数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在 admin 数据库中可用,赋子用户所有数据库的读权限 
readWriteAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的读写权限 
userAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 userAdmin 权限 
dbAdminAnyDatabase:只在 admin 数据库中可用,赋予用户所有数据库的 dbAdmin 权限。
root:只在 admin 数据库中可用。超级账号,擁有超级权限

创建超级管理员

mongodb 创建之后,一定要首先创建管理员用户;当前账号可以进行数据库相关操作

// 进入/切换数据库到 admin 中
use admin

// 创建超级管理员账号
db.createUser({
    user: "root",
    pwd: "123456",
    roles: [
    	{role: "root", db: "admin"},  // 也可以这样简写:"root",
    ]
})

// 配置密码之后,mongo.conf 开启验证
security:
  authorization: enabled

// 然后通过 远程命令 登录 /也可以通过本地 mongo 命令登录
mongo -uroot -p123456 10.250.0.178/admin

// 本地登录之后,需要认证
db.auth('root', '123456')

// 之后执行其他操作; 

给 Admin 数据库创建账户管理员(相当于 hr)

当前账号只能用于管理 admin 数据库账号,不能进行其他数据库的操作。

// 进入/切换数据库到 admin 中 
use admin; 
//创建账户管理员
//【用户名:admin,密码:123456,数据库:admin,角色 userAdminAnyDatabase,表示 admin 用户在 admin 数据库中具有超级用户权限】
db.createUser({
    user: "admin",
    pwd: "123456",
    roles: [
    	{role: "userAdminAnyDatabase", db: "admin"},
    ]
});adm1

// 终端效果如下
Successfully added user: {
    "user" : "admin",
    "roles" : [
    	{
    		"role" : "userAdminAnyDatabase",
    		"db" : "admin"
    	}
    ]
}

> show users;
{
    "_id" : "admin.admin",
    "userId" : UUID("39477e38-e802-410a-930c-e7db92916ea8"),
    "user" : "admin",
    "db" : "admin",
    "roles" : [
    	{
    		"role" : "userAdminAnyDatabase",
    		"db" : "admin"
    	}
    ],
    "mechanisms" : [
    	"SCRAM-SHA-1",
    	"SCRAM-SHA-256"
    ]
}

创建用户自己的数据库的角色

账号是跟着数据库绑定的,所以是什么数据库的用户,就必须在指定库里授权和验证!!

一般开发中,往往一个项目就分配一个数据库,并给这个数据库分配一个管理员。

// 切换数据库,如果当前数据库不存在,会自动创建数据库
use mofang;

// 创建管理员用户,为了保证不会报错,所以先删除同名管理员, db.system.user.remove({user:"mofang"});
db.createUser({
    	user: "mofang",
    	pwd: "123456",
    	roles: [
    			{ role: "dbOwner", db: "mofang"}
    	]
})


// 查看用户
> show users;
{
    "_id" : "mofang.mofang",
    "userId" : UUID("edb71a93-eefc-4ca0-9faf-3ef396c1a369"),
    "user" : "mofang",
    "db" : "mofang",
    "roles" : [
    	{
    		"role" : "dbOwner",
    		"db" : "mofang"
    	}
    ],
    "mechanisms" : [
    	"SCRAM-SHA-1",
    	"SCRAM-SHA-256"
    ]
}


// 查看所有用户
use admin
> db.system.users.find();

修改密码

必须切换到对应数据库中,才能给用户修改密码

> use mofang;			// 切换到 mofang 数据库
> show users;			// 查看用户是否存在
> db.changeUserPassword('mofang', 'password')			// 修改用户名密码前,需要确认该用户存在

开启 mongodb 认证机制

// 修改mongodb 配置文件,改为如下配置
security:
    authorization: enabled


# 重启数据库
# 登录 mongodb 后,需要认证数据库;
mongo
use mofang
show users			// 这里会报错:uncaught exception: Error: command usersInfo requires authentication
> db.auth('mofang', 'password')			// 返回 1 为执行成功;
1

> show users;
{
    "_id" : "mofang.mofang",
    "userId" : UUID("25d21873-6f71-4f3e-be0c-4b665de32e11"),
    "user" : "mofang",
    "db" : "mofang",
    "roles" : [
    	{
    		"role" : "dbOwner",
    		"db" : "mofang"
    	}
    ],
    "mechanisms" : [
    	"SCRAM-SHA-1",
    	"SCRAM-SHA-256"
    ]
}

⚠️:如果重启以后,认证机制不生效,则执行如下代码

sudo pkill mongod
sudo mongod -f /etc/mongod.conf  --fork --auth   # --auth 表示开启认证模式,默认不加 则关闭;