mongodb默认是不认证的,默认没有账号,只要能连接上服务就可以对数据库进行各种操作,mongodb认为安全最好的方法就是在一个可信的环境中运行它,保证之后可信的机器才能访问它。因此需要在登录的时候进行用户认证

创建一个数据库新用户用db.createUser()方法,如果用户存在则返回一个用户重复错误。语法: 
db.createUser(user, writeConcern) 
user这个文档创建关于用户的身份认证和访问信息; 
writeConcern这个文档描述保证MongoDB提供写操作的成功报告。

· user文档,定义了用户的以下形式: 
{ user: “”, 
pwd: “”, 
customData: { }, 
roles: [ 
{ role: “”, db: “” } | “”, 
… 

}

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

角色有如下几种:

1. 数据库用户角色:read、readWrite;

2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;

3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;

4. 备份恢复角色:backup、restore;

5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase

6. 超级用户角色:root

// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)

7. 内部角色:__system

PS:关于每个角色所拥有的操作权限可以点击上面的内置角色链接查看详

在添加用户的时候以下三点需要注意:

·  1) 一定要切换到对应的数据库去创建用户, 否则在进行认证的时候, 会提示找不到用户

·  2) 一定要到对应的数据库上去认证用户, 否则会认证授权失败

·  3) 不是所有人都能操作admin数据库, 分配给用户权限的时候,一定要谨慎

添加一个所有权限的用户

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

Successfully added user: { "user" : "root", "roles" : [ "root" ]

添加一个只读权限的用户

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

Successfully added user: {

"user" : "test",

"roles" : [

{

"role" : "read",

"db" : "admin"

}

]

}

>

查看用户能发现所有的用户信息。注意,只有在admin数据库下才能查看到所有用户的信息

> db.system.users.find()

{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "BPOHThbxXgAF9XTuqzHirg==", "storedKey" : "/bTtbcsHQqKeD8OpNcGOgSy1tvk=", "serverKey" : "rmkh2z/FXPBc+UbEX4vMugApwlU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

{ "_id" : "admin.test", "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8t74rwlbNhj56CDX89HuCw==", "storedKey" : "Pbu0g4IA4f9LsXfmeDm0zTXzrY4=", "serverKey" : "YItP35I5Wul1s6E2yAPsLQdVmZE=" } }, "roles" : [ { "role" : "read", "db" : "admin" } ] }

添加用户后通过mongod --auth重新启动服务器。

这个时候如果我们不使用用户名和密码的话,访问数据库会出现如下错误:提示没有权限去执行命令。

> show dbs

2018-01-01T20:50:42.735+0800 E QUERY    [thread1] Error: listDatabases failed:{

"ok" : 0,

"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",

"code" : 13,

"codeName" : "Unauthorized"

} :

使用用户名和密码登录有两种方式:

第一种方式:客户端连接时,指定用户名,密码,db名称。和mysql类似

root@zhf-maple:/var/lib/mongodb# mongo -u "root" -p "root" --authenticationDatabase "admin"

这个时候查看数据库就能成功访问了

> show dbs

admin  0.000GB

local  0.000GB

maple  0.000GB

第二种方式:客户端连接后再进行验证

> use admin

switched to db admin

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

1

返回1代表验证成功

但是采用test用户进行用户查询的时候提示如下的错误

> db.system.users.find()

Error: error: {

"ok" : 0,

"errmsg" : "not authorized on admin to execute command { find: \"system.users\", filter: {} }",

"code" : 13,

"codeName" : "Unauthorized"

}

原因在于我们之前创建test用户的时候,给予的权限只是read。如果给予userAdminAnyDatabase的权限,则可以访问和修改所有的用户信息

db.updateUser("test",{roles:[{role:"userAdminAnyDatabase",db:"admin"}]})

> db.system.users.find()

{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "BPOHThbxXgAF9XTuqzHirg==", "storedKey" : "/bTtbcsHQqKeD8OpNcGOgSy1tvk=", "serverKey" : "rmkh2z/FXPBc+UbEX4vMugApwlU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

{ "_id" : "admin.test", "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8t74rwlbNhj56CDX89HuCw==", "storedKey" : "Pbu0g4IA4f9LsXfmeDm0zTXzrY4=", "serverKey" : "YItP35I5Wul1s6E2yAPsLQdVmZE=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }

如果要删除用户的话采用dropUser就可以了

> db.dropUser("test")

true

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

1

> db.system.users.find()

{ "_id" : "admin.root", "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "BPOHThbxXgAF9XTuqzHirg==", "storedKey" : "/bTtbcsHQqKeD8OpNcGOgSy1tvk=", "serverKey" : "rmkh2z/FXPBc+UbEX4vMugApwlU=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

我们再来看下对于普通数据库的操作。首先在maple数据库下创建一个用户test只有read的权限

> use maple

switched to db maple

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

Successfully added user: {

"user" : "test",

"roles" : [

{

"role" : "read",

"db" : "maple"

}

]

}

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

1

创建完成后推出重新登录,并在maple集合中插入文档。提示失败,原因是not authorized on maple to execute command.这是由于test用户的权限只是read,没有写的权限

> use maple

switched to db maple

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

1

> db.maple.insert({"name":"abc"})

WriteResult({

"writeError" : {

"code" : 13,

"errmsg" : "not authorized on maple to execute command { insert: \"maple\", documents: [ { _id: ObjectId('5a4a3bbc7e7e6dd2b17893d9'), name: \"abc\" } ], ordered: true }"

}

})

更改用户的权限为readWrite。则可以成功的插入文档

> db.updateUser("test",{roles:[{role:"readWrite",db:"maple"}]})

> show collections

fixedcollection

maple

student_infor

> db.maple.insert({"name","123"})

2018-01-01T21:49:57.536+0800 E QUERY    [thread1] SyntaxError: missing : after property id @(shell):1:23

> db.maple.insert({"name":"123"})

WriteResult({ "nInserted" : 1 })

mongodb学习之:安全和认证的更多相关文章

  1. MongoDB学习之--安全和认证

    MongoDB学习之--安全和认证 本文主要介绍两部分内容,Mongodb的安全检查配置以及安全认证操作: 虽然确保系统安全是系统管理员的重要工作,但是作为程序员了解其机制也是大有好处的,毕竟不是每个 ...

  2. MongoDB学习总结(五) —— 安全认证

    作为数据库软件,我们要确保数据的安全,不是谁都可以访问的,所以mongodb也像其他的数据库软件一样可以采用用户验证的方法, mongodb 3.0之前的版本提供了addUser方法向不同的数据库添加 ...

  3. MongoDB学习总结(四) —— 索引的基本用法

    说到索引,大家肯定都在关系型数据库或多或少接触过,它的主要目的是加速查询的速度.MongoDB作为一种数据库,当然也提供了索引的操作. 我们先插入1万条测试数据. 首先,我们先来看看不加索引查找nam ...

  4. MongoDB学习总结(二)

    前言:学习札记! MongoDB学习总结(二) 1.  安装.初识 之前写过一篇MongoDB的快速上手文章,里边详细的讲了如何安装.启动MongoDB,这里就不再累述安装过程,简单介绍一下Mongo ...

  5. MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁

    权限                                                                                             绑定内网I ...

  6. MongoDB学习笔记:快速入门

    MongoDB学习笔记:快速入门   一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...

  7. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  8. MongoDB学习笔记—Linux下搭建MongoDB环境

    1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...

  9. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

  10. MongoDB学习记录

    一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...

随机推荐

  1. C++拷贝(复制)构造函数详解

    原文:http://blog.csdn.net/lwbeyond/article/details/6202256/[侵删] 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单 ...

  2. JSONP简单示例

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  3. IOS 使用DSYM文件定位Bug 的具体位置

    在项目的开发中,我们通常需要排查和修改测试中和发布后线上的一些bug,现在有一些第三方的bug分享和查找工具SDK,如腾讯的Bugly和听云等,包括苹果的开发工具xcode也自带 bug查找工具.那么 ...

  4. 洛谷——P1588 丢失的牛

    P1588 丢失的牛 题目描述 FJ丢失了他的一头牛,他决定追回他的牛.已知FJ和牛在一条直线上,初始位置分别为x和y,假定牛在原地不动.FJ的行走方式很特别:他每一次可以前进一步.后退一步或者直接走 ...

  5. Codechef FNCS Chef and Churu

    Disciption Chef has recently learnt Function and Addition. He is too exited to teach this to his fri ...

  6. 1004 Counting Leaves

    A family hierarchy is usually presented by a pedigree tree. Your job is to count those family member ...

  7. javascript 对象初探 (四)--- 内建对象之旅之Boolean

    var a = new Boolean() 我们要明白一点在这里的b是一个对象而不是一个基本数据类型的布尔值.如果想将b转化成基本数据类型的布尔值,我们可以调用她的valueof()方法(继承自Obj ...

  8. 【GitHub】删除GitHub上的文件

    想要删除已经提交上GitHub上的文件, 删除之后,如果这个文件夹下没有文件了,这个文件夹也会被删除! 并且在它的上层文件夹后面 有提示删除了这个文件的信息!!

  9. Examples osgparticleshader例子学习

    Examples osgparticleshader  粒子与shader的使用 参考文档 http://blog.csdn.net/csxiaoshui/article/details/234345 ...

  10. Oracle数据库有用函数

    有用函数 DECODE 语法例如以下: DECODE(value, if1, then1, if2,then2,if3,then3, . . . else )  Value 代表某个表的不论什么类型的 ...