标签归档:MongoDB角色管理

MongoDB数据库用户角色与权限管理

查看数据库

使用终端命令行输入 mongo 登陆 mongodb 之后切换到 admin 库,并认证后可查看所有数据库,操作如下所示:

[root@renwole.com ~]# mongo
MongoDB shell version v4.4.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("1ea1-4343-9523-167a101973a9") }
MongoDB server version: 4.4.0
> use admin
> db.auth("admin","InaM6Aip#2JBlWwY")
1
> show dbs
admin      0.000GB
config     0.000GB
local      0.000GB

说明:1 表示认证成功,0 表示认证失败,认证失败后查看数据库无任何返回。

创建数据库及用户

创建一个 renwoledb 数据库并授权 renwole 用户为该库的 dbOwner 角色。另外、MongoDB数据库实行注册制,数据库内无内容时,无法查看到新建的数据库,操作如下:

> use renwoledb
> db.createUser(
        {
            user:"renwole",
            pwd:"renwolecom",
            roles:[{role:"dbOwner",db:"renwoledb"}]
        }
)

此时已完成了一库一账号的创建。如果创建用户提示无权限,请先使用超级管理员登录之后切换到对应的数据库再创建即可,如下所示:

MongoDB shell version v4.4.0
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("7be9-4c30-ad2e-2a5b58127ab7") }
MongoDB server version: 4.4.0
> use renwoledb
switched to db renwoledb
> db.createUser(
         {
             user:"renwole",
             pwd:"renwolecom",
             roles:[{role:"dbOwner",db:"renwoledb"}]
         }
 )
uncaught exception: Error: couldn't add user: command createUser requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1343:11
@(shell):1:1

> use admin
switched to db admin
> db.auth("root","renwolecompassword")
1
> use renwoledb
switched to db renwoledb
> db.createUser(
         {
             user:"renwole",
             pwd:"renwolecom",
             roles:[{role:"dbOwner",db:"renwoledb"}]
         }
 )
Successfully added user: {
	"user" : "renwole",
	"roles" : [
		{
			"role" : "dbOwner",
			"db" : "renwoledb"
		}
	]
}

添加 root 用户,拥有整个 MongoDB 最高权限,建议取消认证模式后,先进入到 admin 库,再添加 root 用户权限

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

密码修改

修改某个账号的数据库密码需要进入到该数据库,认证后再修改,否则报错,操作如下:

> use renwoledb
> db.changeUserPassword("renwole", "renwolecompwdnew")
> db.auth("renwole","renwolecompwdnew")
1

删除用户及数据库

删除用户(必须切换到admin使用最高权限删除某个用户角色)
> db.system.users.remove({user:"renwole"});
WriteResult({ "nRemoved" : 1 })

删除所有用户(必须具备超级管理权限才能删除)
> db.system.users.remove({})

删除数据库(必须切换到指定的数据库,然后再删除)
> use renwoledb
switched to db renwoledb
> db.dropDatabase()
{ "ok" : 1 }
>

你可能还需要查看 《MongoDB 基本常用管理命令详解
参阅:https://www.cnblogs.com/pl-boke/p/10063351.html

MongoDB 基本常用管理命令详解

创建认证用户

取消认证:

如不取消认证则无法创建用户,新安装的 MongoDB 默认没开启认证。

注释掉 /etc/mongod.conf 以下内容:

#security:
 # authorization: enabled

注意:创建用户完成后再加上参数并取消注释,修改MongoDB配置文件必须重启MongoDB服务。

重启MongoDB

$ systemctl restart mongod

登录mongo数据库:

$ mongo
MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.9
Server has startup warnings:
2017-11-20T14:50:48.633+0800 I STORAGE  [initandlisten]
2017-11-20T14:50:48.633+0800 I STORAGE  [initandlisten] ** WARNING: Readahead for /apps/mongo is set to 4096KB
2017-11-20T14:50:48.633+0800 I STORAGE  [initandlisten] **          We suggest setting it to 256KB (512 sectors) or less
2017-11-20T14:50:48.633+0800 I STORAGE  [initandlisten] **          //dochub.mongodb.org/core/readahead
2017-11-20T14:50:48.658+0800 I CONTROL  [initandlisten]
2017-11-20T14:50:48.658+0800 I CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
2017-11-20T14:50:48.658+0800 I CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
2017-11-20T14:50:48.658+0800 I CONTROL  [initandlisten]
>

在 admin 库中创建超级用户,超级用户用于管理其他用户的权限:

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

以上参数说明:

user:用户
pwd:用户密码
roles:一组角色设置(对象)
role:角色名
db:角色所控制的数据库名

MongoDB数据库角色说明:

普通用户角色:readreadWrite
数据库管理员角色:dbAdmindbOwneruserAdmin
集群管理员角色:clusterAdminclusterManagerclusterMonitorhostManager
数据库备份与恢复角色:backuprestore
所有数据库角色:readAnyDatabasereadWriteAnyDatabaseuserAdminAnyDatabasedbAdminAnyDatabase
超级用户角色:root,这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwneruserAdminuserAdminAnyDatabase)。
核心角色:__system

开启认证并登录 MongoDB 查看数据库:

$ mongo
MongoDB shell version v3.4.9
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.9
> use admin
switched to db admin
> show dbs
2017-11-20T15:23:04.399+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13,
        "codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:769:19
shellHelper@src/mongo/shell/utils.js:659:15
@(shellhelp2):1:1

提示无权限,下面开始认证数据库:

> db.auth("admin","admin")
1

说明:1表示认证通过,0表示认证无法通过。

再次获取数据库列表成功:

> show dbs
admin         0.078GB
local         0.078GB

创建MongoDB用户及数据库

创建普通用户:

> use renwolecomdb
db.createUser(
  {
    user: "renwolecom",
    pwd: "renwolecom",
    roles: [ { role: "readWrite", db: "renwolecomdb" } ]
  }
)

查看系统所有用户授权情况:

> use admin
> db.system.users.find()

查看当前库用户角色情况(包含当前数据库下所有用户):

> use renwolecomdb
> show users

创建数据库

use 命令只是向 MongoDB 注册database,并没有实际的创建,而使用 show dbs 命令也无法查看列表中新建的database

> use renwolecomdb
switched to db renwolecomdb

认证数据库:

> db.auth("renwolecom","renwolecom")

注意:这里需要说明:你每切换一个数据库都需要进行用户认证,否则会提示你没有授权,无法写入。

要在列表中显示新建的(renwolecomdb)数据库,至少需要插入一条文档数据,空数据库无法在列表显示。

现在在当前database中创建collection,并向集合中插入数据:

> db.renwolecomdb.insert({"name":"任我乐-知识分享的开发者技术博客"})
WriteResult({ "nInserted" : 1 })

查看数据库列表:

> show dbs
admin         0.078GB
local         0.078GB
renwolecomdb  0.078GB

已经显示刚刚新建的数据库名。

获取当前数据库详细信息:

> db.stats()
{
        "db" : "renwolecomdb",
        "collections" : 5,
        "views" : 0,
        "objects" : 13,
        "avgObjSize" : 82.46153846153847,
        "dataSize" : 1072,
        "storageSize" : 36864,
        "numExtents" : 5,
        "indexes" : 3,
        "indexSize" : 24528,
        "fileSize" : 67108864,
        "nsSizeMB" : 16,
        "extentFreeList" : {
                "num" : 0,
                "totalSize" : 0
        },
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 22
        },
        "ok" : 1
}

说明:在进行任何集合操作前,都必须先切换到一个数据库。

MongoDB用户角色添加删除管理

给已存在的用户添加额外角色:

db.grantRolesToUser(
   "renwolecom",
   [ { role: "dbAdmin",db:"renwolecomdb"} ]
)

删除回收指定用户角色:

db.revokeRolesFromUser(
   "renwolecom",
   [{ role: "dbAdmin",db:"renwolecomdb"}]
)

查看当前数据库集合信息

获取集合信息(类似于关系型数据库的表):

> show collections
renwolecomdb
system.indexes

查看集合文档中数据

以下实例我们查询了集合 renwolecomdb 中的数据:

> use renwolecomdb
> db.auth("renwolecom","renwolecom")
1
> db.renwolecomdb.find().pretty()
{ "_id" : ObjectId("59f439c17a22e643554d915c"), "name" : "任我乐-知识分享的开发者技术博客" }

删除集合

集合删除语法格式如下:

db.renwolecomdb.drop()

删除数据库

删除指定数据库:

这时需要授权 renwolecom 用户删除角色即(dbAdmin),否则用户只有读写,并没有删除权限。

> use renwolecomdb
> db.dropDatabase()
{ "dropped" : "renwolecomdb", "ok" : 1 }

修改MongoDB用户密码信息

方法一:

以下命令不仅可以更新密码,还可以更新用户名:

> use admin
switched to db admin
> db.changeUserPassword("admin", "7utVM2RAfeAnDosq0jN20tu9jWkZQyNj")
> db.auth("admin","7utVM2RAfeAnDosq0jN20tu9jWkZQyNj")
1

已经修改成功,并且通过验证。

方法二(推荐):

只修改用户密码:

> use admin
switched to db admin
> db.changeUserPassword("admin", "7utVM2RAfeAnDosq0jN20tu9jWkZQyNj")

删除用户

将系统中所有关于 renwolecom 的用户删除:

> use admin
> db.system.users.remove({user:"renwolecom"});

只删除本数据中的 renwolecom 用户

> use renwolecomdb
> db.dropUser("renwolecom");

删除本数据下面所有用户

> use renwolecomdb
> db.dropAllUsers()

授权登录MongoDB

通过下面的方式可以直接登陆数据库并且已获得相应权限:

$ mongo renwolecomdb -u renwolecom -p
MongoDB shell version v3.4.9
Enter password:

更多命令可以输入以下命令查看:

> help

参考:

关于用户认证方法://docs.mongodb.com/manual/tutorial/enable-authentication/
关于用户管理方法://docs.mongodb.com/manual/reference/method/js-user-management/
关于角色管理方法://docs.mongodb.com/manual/reference/method/js-role-management/