MongoDB 3.X 用户权限控制

摘要:

      MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法。

环境、测试:

      在安装MongoDB之后,先关闭auth认证,进入查看数据库,只有一个local库,admin库是不存在的:

root@zhoujinyi:/usr/local/mongo4# mongo --port=27020 MongoDB shell version: 3.0.4 connecting to: 127.0.0.1:27020/test 2015-06-29T09:31:08.673-0400 I CONTROL [initandlisten] > show dbs; local 0.078GB

现在需要创建一个帐号,该账号需要有grant权限,即:账号管理的授权权限。注意一点,帐号是跟着库走的,所以在指定库里授权,必须也在指定库里验证(auth)。

复制代码
复制代码
> use admin
switched to db admin
> db.createUser( ... { ... user: "dba", ... pwd: "dba", ... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] ... } ... ) Successfully added user: { "user" : "dba", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
复制代码
复制代码

上面加粗的就是执行的命令:

user:用户名

pwd:密码

roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。role里的角色可以选:

复制代码
复制代码
  Built-In Roles(内置角色):1. 数据库用户角色:read、readWrite;2. 数据库管理角色:dbAdmin、dbOwner、userAdmin; 3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 4. 备份恢复角色:backup、restore5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 6. 超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) 7. 内部角色:__system
复制代码
复制代码

具体角色: 

复制代码
复制代码
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
复制代码
复制代码

刚建立了 userAdminAnyDatabase 角色,用来管理用户,可以通过这个角色来创建、删除用户。验证:需要开启auth参数。

复制代码
复制代码
root@zhoujinyi:/usr/local/mongo4# mongo --port=27020 MongoDB shell version: 3.0.4 connecting to: 127.0.0.1:27020/test > show dbs; ####没有验证,导致没权限。 2015-06-29T10:02:16.634-0400 E QUERY Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }", "code" : 13 } at Error (<anonymous>) at Mongo.getDBs (src/mongo/shell/mongo.js:47:15) at shellHelper.show (src/mongo/shell/utils.js:630:33) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47 > use admin #验证,因为在admin下面添加的帐号,所以要到admin下面验证。 switched to db admin > db.auth('dba','dba') 1 > show dbs; admin 0.078GB local 0.078GB > use test #在test库里创建帐号 switched to db test > db.createUser( ... { ... user: "zjyr", ... pwd: "zjyr", ... roles: [ ... { role: "read", db: "test" } #只读帐号 ... ] ... } ... ) Successfully added user: { "user" : "zjyr", "roles" : [ { "role" : "read", "db" : "test" } ] } > db.createUser( ... { ... user: "zjy", ... pwd: "zjy", ... roles: [ ... { role: "readWrite", db: "test" } #读写帐号 ... ] ... } ... ) Successfully added user: { "user" : "zjy", "roles" : [ { "role" : "readWrite",  #读写账号 "db" : "test" } ] } > show users; #查看当前库下的用户 { "_id" : "test.zjyr", "user" : "zjyr", "db" : "test", "roles" : [ { "role" : "read", "db" : "test" } ] } { "_id" : "test.zjy", "user" : "zjy", "db" : "test", "roles" : [ { "role" : "readWrite", "db" : "test" } ] }
复制代码
复制代码

上面创建了2个帐号,现在验证下:验证前提需要一个集合

复制代码
复制代码
> db.abc.insert({"a":1,"b":2})              #插入失败,没有权限,userAdminAnyDatabase 权限只是针对用户管理的,对其他是没有权限的。
WriteResult({"writeError" : {"code" : 13, "errmsg" : "not authorized on test to execute command { insert: \"abc\", documents: [ { _id: ObjectId('55915185d629831d887ce2cb'), a: 1.0, b: 2.0 } ], ordered: true }" } }) > bye root@zhoujinyi:/usr/local/mongo4# mongo --port=27020 MongoDB shell version: 3.0.4 connecting to: 127.0.0.1:27020/test > use test switched to db test > db.auth('zjy','zjy')  #用创建的readWrite帐号进行写入 1 > db.abc.insert({"a":1,"b":2}) WriteResult({ "nInserted" : 1 }) > db.abc.insert({"a":11,"b":22}) WriteResult({ "nInserted" : 1 }) > db.abc.insert({"a":111,"b":222}) WriteResult({ "nInserted" : 1 }) > db.abc.find() { "_id" : ObjectId("559151a1b78649ebd8316853"), "a" : 1, "b" : 2 } { "_id" : ObjectId("559151cab78649ebd8316854"), "a" : 11, "b" : 22 } { "_id" : ObjectId("559151ceb78649ebd8316855"), "a" : 111, "b" : 222 } > db.auth('zjyr','zjyr')  #切换到只有read权限的帐号 1 > db.abc.insert({"a":1111,"b":2222}) #不能写入 WriteResult({ "writeError" : { "code" : 13, "errmsg" : "not authorized on test to execute command { insert: \"abc\", documents: [ { _id: ObjectId('559151ebb78649ebd8316856'), a: 1111.0, b: 2222.0 } ], ordered: true }" } }) > db.abc.find() #可以查看 { "_id" : ObjectId("559151a1b78649ebd8316853"), "a" : 1, "b" : 2 } { "_id" : ObjectId("559151cab78649ebd8316854"), "a" : 11, "b" : 22 } { "_id" : ObjectId("559151ceb78649ebd8316855"), "a" : 111, "b" : 222 }
复制代码
复制代码

有没有一个超级权限?不仅可以授权,而且也可以对集合进行任意操作?答案是肯定的,只是不建议使用。那就是role角色设置成root

复制代码
复制代码
> db.auth('dba','dba') 1 > db.createUser( ... { ... user: "zhoujinyi", ... pwd: "zhoujinyi", ... roles: [ ... { role: "root", db: "admin" } #超级root帐号 ... ] ... } ... ) Successfully added user: { "user" : "zhoujinyi", "roles" : [ { "role" : "root", "db" : "admin" } ] } > > show users; #查看当前库下的用户 { "_id" : "admin.dba", "user" : "dba", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } { "_id" : "admin.zhoujinyi", "user" : "zhoujinyi", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ] } > use admin switched to db admin > db.auth('zhoujinyi','zhoujinyi') 1 > use test switched to db test > db.abc.insert({"a":1,"b":2}) WriteResult({ "nInserted" : 1 }) > db.abc.insert({"a":1111,"b":2222})  #权限都有 WriteResult({ "nInserted" : 1 }) > db.abc.find() { "_id" : ObjectId("5591539bb78649ebd8316857"), "a" : 1, "b" : 2 } { "_id" : ObjectId("559153a0b78649ebd8316858"), "a" : 1111, "b" : 2222 } > db.abc.remove({}) WriteResult({ "nRemoved" : 2 })
复制代码
复制代码

因为帐号都是在当前需要授权的数据库下授权的,那要是不在当前数据库下会怎么样?

复制代码
复制代码
> db
admin
> db.createUser(
...  {
...    user: "dxy", ... pwd: "dxy", ... roles: [ ... { role: "readWrite", db: "test" }, #在当前库下创建其他库的帐号,在admin库下创建test、abc库的帐号 ... { role: "readWrite", db: "abc" } ... ] ... } ... ) Successfully added user: { "user" : "dxy", "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "readWrite", "db" : "abc" } ] } > > show users; { "_id" : "admin.dba", "user" : "dba", "db" : "admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } { "_id" : "admin.zhoujinyi", "user" : "zhoujinyi", "db" : "admin", "roles" : [ { "role" : "root", "db" : "admin" } ] } { "_id" : "admin.dxy", "user" : "dxy", "db" : "admin", "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "readWrite", "db" : "abc" } ] } > use test switched to db test > db.auth('dxy','dxy')  #在admin下创建的帐号,不能直接在其他库验证, Error: 18 Authentication failed. 0 > use admin switched to db admin  #只能在帐号创建库下认证,再去其他库进行操作。 > db.auth('dxy','dxy') 1 > use test switched to db test > db.abc.insert({"a":1111,"b":2222}) WriteResult({ "nInserted" : 1 }) > use abc switched to db abc > db.abc.insert({"a":1111,"b":2222}) WriteResult({ "nInserted" : 1 })
复制代码
复制代码

上面更加进一步说明数据库帐号是跟着数据库来走的,哪里创建哪里认证。

创建了这么多帐号,怎么查看所有帐号

复制代码
复制代码
>  use admin
switched to db admin
> db.auth('dba','dba') 1 > db.system.users.find().pretty() { "_id" : "admin.dba", "user" : "dba", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "KfDUzCOIUo7WVjFr64ZOcQ==", "storedKey" : "t4sPsKG2dXnZztVYj5EgdUzT9sc=", "serverKey" : "2vCGiq9NIc1zKqeEL6VvO4rP26A=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } { "_id" : "test.zjyr", "user" : "zjyr", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "h1gOW3J7wzJuTqgmmQgJKQ==", "storedKey" : "7lkoANdxM2py0qiDBzFaZYPp1cM=", "serverKey" : "Qyu6IRNyaKLUvqJ2CAa/tQYY36c=" } }, "roles" : [ { "role" : "read", "db" : "test" } ] } { "_id" : "test.zjy", "user" : "zjy", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "afwaKuTYPWwbDBduQ4Hm7g==", "storedKey" : "ebb2LYLn4hiOVlZqgrAKBdStfn8=", "serverKey" : "LG2qWwuuV+FNMmr9lWs+Rb3DIhQ=" } }, "roles" : [ { "role" : "readWrite", "db" : "test" } ] } { "_id" : "admin.zhoujinyi", "user" : "zhoujinyi", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "pE2cSOYtBOYevk8tqrwbSQ==", "storedKey" : "TwMxdnlB5Eiaqg4tNh9ByNuUp9A=", "serverKey" : "Mofr9ohVlFfR6/md4LMRkOhXouc=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] } { "_id" : "admin.dxy", "user" : "dxy", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "XD6smcWX4tdg/ZJPoLxxRg==", "storedKey" : "F4uiayykHDp/r9krAKZjdr+gqjM=", "serverKey" : "Kf51IU9J3RIrB8CFn5Z5hEKMSkw=" } }, "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "readWrite", "db" : "abc" } ] } > db.system.users.find().count() 5
复制代码
复制代码

备份还原使用那个角色的帐号?之前创建的帐号zjy:test库读写权限;zjyr:test库读权限

复制代码
复制代码
root@zhoujinyi:~# mongodump --port=27020 -uzjyr -pzjyr --db=test -o backup   #只要读权限就可以备份
2015-06-29T11:20:04.864-0400 writing test.abc to backup/test/abc.bson 2015-06-29T11:20:04.865-0400 writing test.abc metadata to backup/test/abc.metadata.json 2015-06-29T11:20:04.866-0400 done dumping test.abc 2015-06-29T11:20:04.867-0400 writing test.system.indexes to backup/test/system.indexes.bson root@zhoujinyi:~# mongorestore --port=27020 -uzjy -pzjy --db=test backup/test/ #读写权限可以进行还原 2015-06-29T11:20:26.607-0400 building a list of collections to restore from backup/test/ dir 2015-06-29T11:20:26.609-0400 reading metadata file from backup/test/abc.metadata.json 2015-06-29T11:20:26.609-0400 restoring test.abc from file backup/test/abc.bson 2015-06-29T11:20:26.611-0400 error: E11000 duplicate key error index: test.abc.$_id_ dup key: { : ObjectId('559154efb78649ebd831685a') } 2015-06-29T11:20:26.611-0400 restoring indexes for collection test.abc from metadata 2015-06-29T11:20:26.612-0400 finished restoring test.abc 2015-06-29T11:20:26.612-0400 done

https://www.cnblogs.com/shiyiwen/p/5552750.html

转载于:https://www.cnblogs.com/seasonzone/p/9359501.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle和sql server取第一条记录的区别以及rownum详解

我们知道学生可能有重名的情况&#xff0c;那么当重名的时候假设只需要取得重名结果集中的第一条记录。 sql server:select top(1) num,Name from M_Student where name xy Oracle:select num,Name from M_Student where name xy and rownum < 1 对于rownum在oracle的使用…

全国计算机等级考试题库二级C操作题100套(第20套)

第20套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;计算形参x所指数组中N个数的平均值&#xff08;规定所有数均为正数&#xff09;,将所指数组中小于平均值的数据移至数组的前部&#xff0c;大于等于平均值的数据移至x所指数组的后部&#xff0c;平均值作…

java enum 变量_java枚举使用详解

package com.ljq.test;/*** 枚举用法详解** author jiqinlin**/public class TestEnum {/*** 普通枚举** author jiqinlin**/public enum ColorEnum {red, green, yellow, blue;}/*** 枚举像普通的类一样可以添加属性和方法&#xff0c;可以为它添加静态和非静态的属性或方法**…

c#小游戏_C#小游戏—钢铁侠VS太空侵略者

身为漫威迷&#xff0c;最近又把《钢铁侠》和《复仇者联盟》系列又重温了一遍&#xff0c;真的是印证了那句话&#xff1a;“读书百遍&#xff0c;其意自现”。看电影一个道理&#xff0c;每看一遍&#xff0c;都有不懂的感受~ 不知道大伙是不是也有同样的感受&#xff0c;对于…

输入年份月份判断是平年还是闰年及这个月有多少天

import java.util.Scanner;public class year {public static void main(String[] args) {System.out.println("请输入年份");Scanner sc new Scanner(System.in);int s sc.nextInt();System.out.println("请输入月份");Scanner sc1 new Scanner(System…

VMware Workstation 虚拟机性能优化指南

我们经常使用虚拟机来体验各种新系统&#xff0c;做各类新鲜应用的测试&#xff0c;由于VMware Workstation虚拟机功能强大&#xff0c;又适用于最新的 Windows / linux /Sun等平台&#xff0c;而且操作方便&#xff0c;所以其普及率很高&#xff01;而 VMware Workstation 本身…

全国计算机等级考试题库二级C操作题100套(第21套)

第21套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;计算形参x所指数组中N个数的平均值&#xff08;规定所有数均为正数&#xff09;,将所指数组中大于平均值的数据移至数组的前部&#xff0c;小于等于平 均值的数据移至x所指数组的后部&#xff0c;平均值…

pytorch已经安装成功了为什么不能使用import_使用auto keras的过程

成功安装的总结&#xff1a;1、创建环境名为mykeras、python版本为3.6的独立环境conda create --name mykeras python3.62、用pip安装 torch0.4.1&#xff08;一定要指定版本&#xff0c;否者安装auto keras时报错&#xff09;# Python 3.6 pip install https://download.pytor…

mysql5.0 php_php怎么连接mysql5.0?

PHP与MySQL的连接有三种API接口&#xff0c;分别是&#xff1a;PHP的MySQL扩展 、PHP的mysqli扩展 、PHP数据对象(PDO) &#xff0c;下面针对以上三种连接方式做下总结&#xff0c;以备在不同场景下选出最优方案。PHP的MySQL扩展是设计开发允许php应用与MySQL数据库交互的早期扩…

Android----Google code android开源项目(四)

Google code android开源项目(四) 1. sparserss http://code.google.com/p/sparserss/ 一个简洁的android rss阅读器 2. desktopsms http://code.google.com/p/desktopsms/ 在电脑写短信 3. kraigsandroid http://code.google.com/p/kraigsandroid/ 创建者…

面试题之--实现取余

def quyu(shu,chushu):if shuchushu:print(余数是0)elif shu<chushu:print(余数是&#xff1a;%s%shu)elif chushu0:print(除数不能为0)else:for i in range(0,shu):if shu-i*chushu>chushu:i1elif shu-i*chushuchushu:print(余数是0)breakelif shu-i*chushu0:print(余数…

全国计算机等级考试题库二级C操作题100套(第22套)

第22套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;将自然数1&#xff5e;10以及它们的平方根写到名为myfile3.txt的文本文件中&#xff0c;然后再顺序读出显示在屏幕上。 请在程序的下划线处填入正确的内容并把下划线删除&#xff0c;使程序得出正确的结…

mysql可能锁的表命令_mysql 默许是表级锁一些不太常用命令

mysql 默认是表级锁一些不太常用命令1&#xff0c;mysql默认的是表级锁。如果是启用InnoDB存储引擎那么该数据库支持行级锁。2&#xff0c;查看数据库是否支持innodb的命令SHOW variables like "have_%";另一条命令SHOW ENGINES;更为准确。查看mysql数据库的详细信息…

python制作二级菜单_Python_简单三级菜单制作

一:制作要求 1.三级菜单  2.可依次选择进入各子菜单  3.所需新知识点:字典,列表 *本文通过三种方法完成,第一种:只使用循环,第二种:使用列表,第三种:使用字典 二:FlowChart流程图与上图对应,实现方式图解:while用来判断输入的数据和允许输入数据中的哪一项匹配,if来进行判断…

RSA使用简述

RSA协议我不再描述&#xff0c;大家可以看http://www.di-mgt.com.au/rsa_alg.html。 RSA的密钥对生成时间依赖于两个因素&#xff0c; 第一&#xff0c;密钥的长度 第二&#xff0c;素数的筛选质量 在整个密钥对生成过程中&#xff0c;RSA会随机选择两个大素数&#xff0c;事实…

64位进程和32位进程通信问题,接收端收不到 SendMessage发送的消息

最近在做一个项目的时候&#xff0c;采用了win32的SendMessage方法来发送数据&#xff0c;本来都没问题&#xff0c;后来增加了一个项目&#xff0c;必须采用的目标平台是x64的&#xff0c;没想到居然没办法通信了。 网上找了很久解决方案&#xff0c;整整尝试了一个周&#xf…

全国计算机等级考试题库二级C操作题100套(第23套)

第23套&#xff1a; 给定程序中&#xff0c;函数fun的功能是&#xff1a;找出NN矩阵中每列元素中的最大值&#xff0c;并按顺序依次存放于形参b所指的一维数组中。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。 注意&#xff1a;源程序存放在考生…

html5 js

2019独角兽企业重金招聘Python工程师标准>>> http://labs.hyperandroid.com/mathmayhem 转载于:https://my.oschina.net/u/201125/blog/100934

初入职场的工作感悟

已经很久没有静下心来好好的做一次自我总结&#xff0c;个人博客已经搁浅数月&#xff0c;微信公众号也寥寥数篇。甚至我的GitHub 也将近半年没有点亮技能树了。难得的空闲时间&#xff0c;抓紧反思一下。 一个注重仪式感的我&#xff0c;在提前转正的那天&#xff0c;仅仅是发…

python按键盘上哪个键运行_python根据键盘输入进行相应操作

上篇文章介绍了如何利用pyhook模块监听鼠标键盘的事件&#xff0c;接下来如果需要通过监听的事件内容&#xff0c;来做对应的操作&#xff0c;需要对event的内容进行相应的判断。 如果仅仅通过event.key来进行判断&#xff0c;可以写成str(evnet.key) F12等&#xff0c;如果需…