mongodb学习之:安全和认证
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学习之:安全和认证的更多相关文章
- MongoDB学习之--安全和认证
MongoDB学习之--安全和认证 本文主要介绍两部分内容,Mongodb的安全检查配置以及安全认证操作: 虽然确保系统安全是系统管理员的重要工作,但是作为程序员了解其机制也是大有好处的,毕竟不是每个 ...
- MongoDB学习总结(五) —— 安全认证
作为数据库软件,我们要确保数据的安全,不是谁都可以访问的,所以mongodb也像其他的数据库软件一样可以采用用户验证的方法, mongodb 3.0之前的版本提供了addUser方法向不同的数据库添加 ...
- MongoDB学习总结(四) —— 索引的基本用法
说到索引,大家肯定都在关系型数据库或多或少接触过,它的主要目的是加速查询的速度.MongoDB作为一种数据库,当然也提供了索引的操作. 我们先插入1万条测试数据. 首先,我们先来看看不加索引查找nam ...
- MongoDB学习总结(二)
前言:学习札记! MongoDB学习总结(二) 1. 安装.初识 之前写过一篇MongoDB的快速上手文章,里边详细的讲了如何安装.启动MongoDB,这里就不再累述安装过程,简单介绍一下Mongo ...
- MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁
权限 绑定内网I ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- MongoDB学习笔记—Linux下搭建MongoDB环境
1.MongoDB简单说明 a MongoDB是由C++语言编写的一个基于分布式文件存储的开源数据库系统,它的目的在于为WEB应用提供可扩展的高性能数据存储解决方案. b MongoDB是一个介于关系 ...
- Mongodb学习笔记一(Mongodb环境配置)
Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...
- MongoDB学习记录
一.操作符 "$lt" :"<""$lte" :"<=""$gt" :"> ...
随机推荐
- Java 经典笔试题
这些题目对我的笔试帮助很大,有需要的朋友都可以来看看,在笔试中能遇到的题目基本上下面都会出现,虽然形式不同,当考察的基本的知识点还是相同的. 在分析中肯定有不足和谬误的地方还请大虾们能够给予及时的纠正 ...
- 进击JavaScript核心 --- (2)函数和预解析机制
一.函数 每个函数都是 Function类型的实例,也具有属性和方法.由于函数也是一个对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定 1.函数的定义方式 (1).函数声明 fun ...
- jvm类加载的过程
java类加载过程:加载-->验证-->准备-->解析-->初始化,之后类就可以被使用了.绝大部分情况下是按这 样的顺序来完成类的加载全过程的.但是是有例外的地方,解析也是可以 ...
- 华硕win7安装ubuntu14.04.02注意事项
一.win7下划出给ubuntu系统的分区 1.win7自带分磁盘的工具,只需要压缩步骤即可,不需要继续分盘符格式化等操作 win7下为绿色 安装时为free space 二.制作启动盘并安装注意事项 ...
- linux tomcat shutdown.sh 有时不能结束进程,使用如下指令进度重启
ps -ef | grep tomcat | grep -v grep | cut -c 9-15 | xargs kill -9 & ./startup.sh
- ie下li标签中span加float:right不换行问题解决方案
在IE6,IE7下使用标签时,在加入右浮动样式(float:right)后,会换行的bug解决方案:bug案例:新闻列表中,为使时间右对齐,加右浮动产生换行 <ul> <li> ...
- 邁向IT專家成功之路的三十則鐵律 鐵律十:IT人思維之道-跳脫框架
莊子的哲學思想歸本於老子,他認為人要解脫束縛必須做到不從任何的角度與任何的時間來看待事物,而是必須與天地同體,然而也唯有如此才能看清宇宙間萬事萬理的真諦.無論是莊子還是老子,他們畢竟是中國古代的聖賢, ...
- 【sublime text 3】sublime text 3 汉化
快捷键:Ctrl+Alt+P 输入快捷键Ctrl+Shift+P 在出现的文本框中输入Install Package(或直接输入“ip”)选中packageControl:Install Packag ...
- OpenSceneGraph FAQ 【转】
1.地球背面的一个点,计算它在屏幕上的坐标,能得到吗? 不是被挡住了吗? 答:计算一个空间点的屏幕坐标,使用osgAPEx::GetScreenPosition函数.当空间点处于相机视空间内(不管它是 ...
- G 全然背包
<span style="color:#3333ff;">/* /* _________________________________________________ ...