标签归档:MongoDB用户认证

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/