1.确认mongodb的版本

> use admin
switched to db admin
> db.runCommand({"buildInfo":})
{
"version" : "2.6.6",
"gitVersion" : "608e8bc319627693b04cc7da29ecc300a5f45a1f",
"targetMinOS" : "Windows 7/Windows Server 2008 R2",
"OpenSSLVersion" : "",
"sysInfo" : "windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB_VERSION=1_49",
"loaderFlags" : "/nologo /DEBUG /INCREMENTAL:NO /LARGEADDRESSAWARE",
"compilerFlags" : "/TP /nologo /EHsc /W3 /wd4355 /wd4800 /wd4267 /wd4244 /wd4290 /we4099 /Z7 /errorReport:none /MT /O2 /Oy-",
"allocator" : "system",
"versionArray" : [
,
,
, ],
"javascriptEngine" : "V8",
"bits" : ,
"debug" : false,
"maxBsonObjectSize" : ,
"ok" :
}
>

2.启用安全认证

默认启动的mongodb是没有启用安全认证的,在安装完成mongodb后想要启动mongodb的安全认证只需要在启动mongod的时候增加--auth参数或在配置文件中增加auth=true,例如:

mongod.exe --dbpath=D:\MongoDB2.6\data --auth
mongod.exe --config D:\MongoDB2.6\up\mongodb.conf

3.查看图形界面

mongodb的图形界面端口号为其监听端口号加上1000,如我们默认的启动端口号为27017,那么图形界面的端口就为28017,当默认启动mongodb时,访问28017端口发现会无法访问,这时只需要在启动mongod的时候增加--auth参数或在配置文件中增加auth=true就可以正常访问。

mongod.exe --dbpath=D:\MongoDB2.6\data --rest
mongod.exe --config D:\MongoDB2.6\up\mongodb.conf

如图:

4.创建用户并验证认证

> use admin
switched to db admin
> show collections
system.indexes
system.users
system.version
> db.system.users.find()
>

经过查询发现目前库中没有任何用户,现在创建用户:

> use admin
switched to db admin
> show dbs
admin .078GB
local .078GB
test .078GB
> use mydb
switched to db mydb
> show dbs
admin .078GB
local .078GB
test .078GB
> use mydb
switched to db mydb
> db.book.insert({"name":"english"})
WriteResult({ "nInserted" : })
> show dbs
admin .078GB
local .078GB
mydb .078GB
test .078GB

上面的语句我们创建一个数据库mydb

> use admin
switched to db admin
> db.addUser("root","")
WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
> show collections --当我们查看集合的时候提示没有权限
--28T16::50.808+ error: {
"$err" : "not authorized for query on admin.system.namespaces",
"code" :
} at src/mongo/shell/query.js:
> db.auth("root","") --进行用户验证后,发现能够使用后面的命令了 > show dbs
admin .078GB
local .078GB
mydb .078GB
test .078GB
> show collections
system.indexes
system.users
system.version
> db.system.users.find() --查询users集合发现已经有了一个root用户,且角色为root
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "MONGODB-CR" : "34e5772aa66b703a319641d42a47d696" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
>

以上语句我们在admin库下创建了一个root用户。

> use mydb     --切换到mydb库下
switched to db mydb
> db.addUser("livan","livan123")
WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead
Successfully added user: { "user" : "livan", "roles" : [ "dbOwner" ] }
> show collections
book
system.indexes
> use admin
switched to db admin
> db.system.users.find()
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "MONGODB-CR" : "34e5772aa66b703a319641d42a47d696" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "mydb.livan", "user" : "livan", "db" : "mydb", "credentials" : { "MONGODB-CR" : "231eafd8ebf83e43a61d31fc3b9be671" }, "roles" : [ { "role" : "dbOwner", "db" : "mydb" } ] }
>

以上语句我们切换到mydb下创建了livan用户,此用户对用的数据库为mydb,在admin库下查询system.users集合能够看到livan用户信息,且对应的角色为dbOwner。

D:\MongoDB2.\up>D:\MongoDB2.\bin\mongo.exe 127.0.0.1:
MongoDB shell version: 2.6.
connecting to: 127.0.0.1:/test
> use mydb
switched to db mydb
> db.auth("livan","livan123") > show dbs
--28T16::04.434+ listDatabases failed:{
"ok" : ,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" :
} at src/mongo/shell/mongo.js:
> use admin
switched to db admin
> show dbs
--28T16::11.915+ listDatabases failed:{
"ok" : ,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" :
} at src/mongo/shell/mongo.js:
> show collections
--28T16::34.197+ error: {
"$err" : "not authorized for query on admin.system.namespaces",
"code" :
} at src/mongo/shell/query.js:
> db.system.users.find()
error: { "$err" : "not authorized for query on admin.system.users", "code" : }
> use mydb
switched to db mydb
> show dbs
--28T16::03.305+ listDatabases failed:{
"ok" : ,
"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
"code" :
} at src/mongo/shell/mongo.js:
> show collections
book
system.indexes
>
> db.system.indexes.find()
{ "v" : , "key" : { "_id" : }, "name" : "_id_", "ns" : "mydb.book" }
> db.book.find()
{ "_id" : ObjectId("5721c7e579d5865b3c50facd"), "name" : "english" }
>

以上语句可以看到当使用livan用户进行验证时,是能够切换到admin库,但用不了show dbs,show collections等命令,更不能到查询system.users集合,当切换回mydb库时,
使用不了show dbs命令,但show collections命令能够使用,且能够正常访问mydb下的集合。

D:\MongoDB2.\up>D:\MongoDB2.\bin\mongo.exe 127.0.0.1:
MongoDB shell version: 2.6.
connecting to: 127.0.0.1:/test
> use admin
switched to db admin
> db.auth("root","") > show dbs
admin .078GB
local .078GB
mydb .078GB
test .078GB
> show collections
system.indexes
system.users
system.version
> db.system.users.find()
{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "MONGODB-CR" : "34e5772aa66b703a319641d42a47d696" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "mydb.livan", "user" : "livan", "db" : "mydb", "credentials" : { "MONGODB-CR" : "231eafd8ebf83e43a61d31fc3b9be671" }, "roles" : [ { "role" : "dbOwner", "db" : "mydb" } ] }
> use mydb
switched to db mydb
> show dbs
admin .078GB
local .078GB
mydb .078GB
test .078GB
> show collections
book
system.indexes
> db.book.find()
{ "_id" : ObjectId("5721c7e579d5865b3c50facd"), "name" : "english" }
> db.system.indexes()
--28T16::15.946+ TypeError: Property 'indexes' of object mydb.system is not a function
>

以上语句是使用root用户进行登录测试,root用户可以执行所有操作命令,且能够正常访问其他数据库集合,这是因为mongodb在admin库中认证的用户都为管理员用户,
非admin数据库的用户不能使用数据库命令,只能访问本数据库的集合。

5.其他创建用户命令

在上面的测试中发现使用db.addUser()创建用户是系统会给出一个警告,提示我们用createUser 创建用户,如下:

> db.addUser("livan","livan123")
WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead
Successfully added user: { "user" : "livan", "roles" : [ "dbOwner" ] }

对于db.createUser()的用法可参考 http://debugo.com/mongo-auth/?utm_source=tuicool&utm_medium=referral

db.createUser()用法:

db.createUser(user, writeConcern)
user 关于用户的身份认证和访问信息(JSON);
writeConcern 这个文档描述保证MongoDB提供写操作的成功报告。

user文档的形式:

{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]
}

user字段,用户的名字;
pwd字段,用户的密码;
cusomData字段,为任意内容,例如可以为用户全名介绍;
roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色; roles 字段,可以指定内置角色和用户定义的角色。

示例创建一个管理员,直接给几个所有数据库权限即可:

db.createUser({
user:"test",
pwd:"test.com",
roles:
[
{
role:"userAdminAnyDatabase",
db:"admin"
},
{
role:"readWriteAnyDatabase",
db:"admin"
},
{
role:"dbAdminAnyDatabase",
db:"admin"
}
]})

示例创建某个用户对数据库只赋予只读权限:

db.createUser({
user:"test",
pwd:"test.com",
roles:
[
{
role:"read",
db:"test"
}
]

以上创建的用户,我们可以通过 db.auth("username","password") 或者mongo -u test -p test.com --authenticationDatabase test 来验证。

6.mongodb的常用角色

MongoDB提供了很多内建角色,用户通用的数据库管理。内建角色的文档在这里http://docs.mongodb.org/manual/reference/built-in-roles/
MongoDB提供了数据库管理权限和数据库用户权限两种类型,其他的权限只能作用于admin数据库上。具体如下:

(1).数据库用户角色

针对每一个数据库进行控制。

read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.

(2).数据库管理角色

每一个数据库包含了下面的数据库管理角色。
dbOwner:该数据库的所有者,具有该数据库的全部权限。
dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin
userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。

(3).集群管理权限

admin数据库包含了下面的角色,用户管理整个系统,而非单个数据库。这些权限包含了复制集和共享集群的管理函数。
clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。
clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能)
clusterMonitor:仅仅监控集群和复制集。
hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。
备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。

(4).所有数据库角色

admin数据库提供了一个mongod实例中所有数据库的权限角色:
readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。
readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。
dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。

(5). 超级管理员权限

root: dbadmin到admin数据库、useradmin到admin数据库以及UserAdminAnyDatabase。但它不具有备份恢复、直接操作system.*集合的权限,但是拥有root权限的超级用户可以自己给自己赋予这些权限。

本文最后部分来源于http://debugo.com/mongo-auth/

mongodb的用户管理及安全认证的更多相关文章

  1. MongoDB的用户管理(6)

    注意: A)在mongodb中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据. 即 use admin , -->相当于进入超级用户管理模式. B)mongo ...

  2. MongoDB快速入门学习笔记7 MongoDB的用户管理操作

    1.修改启动MongoDB时要求用户验证加参数 --auth 即可.现在我们把MongoDB服务删除,再重新添加服务 mongod --dbpath "D:\work\MongoDB\dat ...

  3. MongoDB的用户管理命令

    1.给TD数据库添加用户使用  use TD 然后执行 db.addUser("名称","密码"); 即可添加: 2.启用用户使用 db.auth(" ...

  4. MongoDB基础之七 用户管理

    MongoDB的用户管理 注意:A)在mongodb中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据.即 use admin , -->相当于进入超级用户管理 ...

  5. MongoDB 学习笔记(六):备份与用户管理

    一.启动项 1.在启动数据库服务时可以在命令行输入mongod命令,然后直接带一些参数,比如“mongod --dbpath D:\Installations\MongoDB-2.4.6\MongoD ...

  6. mongodb3 ubuntu离线安装(非apt-get)及用户管理

    目前mongodb已经出到3.x,相对于2.x改动较大,本着学新不学旧的原则来捣鼓nosql数据库.最初想着apt-get安装但是软件源上都是2.x的,遂下载好后传到服务器安装. 1.下载 不得不说国 ...

  7. mongodb之用户/认证/角色/权限管理

    前言 用户权限管理很重要,只给需要的权限,防止应用系统漏洞导致脱库 认证和授权 Authentication 认证识别,解决我是谁 Authorization 操作授权,我能做什么 认证机制 MONG ...

  8. mongodb添加用户和认证

    Mongodb默认启动是不带认证,也没有账号,只要能连接上服务就可以对数据库进行各种操作,这样可不行.现在,我们得一步步开启使用用户和认证. 第一步,我们得定位到mongodb的安装目录.我本机的是C ...

  9. 【mongoDB运维篇①】用户管理

    3.0版本以前 在mongodb3.0版本以前中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据库.即 use admin , 相当于进入超级用户管理模式,mongo ...

随机推荐

  1. 简单的sql server连接

    private string constring="data source=112.74.73.122;initial catalog=qzyData;user id=sa;password ...

  2. tp框架实现ajax

    不墨迹,直接进主题. tp框架实现ajax 首先,我们先做一个testajax.html用来显示页面(只是一个简单的下拉列表^_^) <!DOCTYPE html PUBLIC "-/ ...

  3. android 去掉actionbar 的虚线

    if(Build.VERSION.SDK_INT>=21){ getSupportActionBar().setElevation(0); }

  4. html内的空格占位

    写html的时候有时因为字数不够会根据字段长度添加多个空格,但是在html中添加空格是没有用的,所以使用空格的代替符号有:   不断行的空白(1个字符宽度)   半个空白(1个字符宽度)   一个空白 ...

  5. Windows下用tree命令生成目录树

    有时候我们想为某个目录制作一个文档结构图,在Windows上,我们知道是使用tree命令. 但是,默认情况下tree只显示子目录名,而不显示子目录里的文件名,需要加上/F参数才能显示完整的文件名.   ...

  6. 【leetcode】Intersection of Two Linked Lists

    题目简述: Write a program to find the node at which the intersection of two singly linked lists begins. ...

  7. SqlLite 基本操作

    1.数据类型 ●  SQLite将数据划分为以下⼏几种存储类型: ●  integer : 整型值 ●  real : 浮点值 ●  text : ⽂文本字符串 ●  blob : ⼆二进制数据(⽐比 ...

  8. Spring MVC注解入门

    注解式开发初步 常用的两个注解: @Controller:是SpringMVC中最常用的注解,它可以帮助定义当前类为一个Spring管理的bean,同时指定该类是一个控制器,可以用来接受请求.标识当前 ...

  9. asp.net中获取本机的相关信息!(CPU、内存、硬盘序列号等)

    // 注意:首先要在项目bin目录中添加引用 System.Management using System;using System.Collections.Generic;using System. ...

  10. Xcode显示出错

    warning: control reaches end of non-void function 表示有返回值的函数没有return.