最近遇到很多问MONGODB用户认证授权方面的问题,现在特记录下来,与大家共享。

一、概念理解

1、用户概念

Mongodb的用户是由 用户名+所属库名组成

例如:

登录mongo  testdb1 ,创建用户testuser

登录mongo  testdb2 ,创建用户testuser

那上面创建的用户分别是:testuser@testdb1,testuser@testdb2

也就是说在哪个库下面创建用户,这个用户就是哪个库的

2、角色概念

Mongodb的授权采用了角色授权的方法,每个角色包括一组权限。

Mongodb已经定义好了的角色叫内建角色,我们也可以自定义角色。

这儿主要介绍内建角色,Mongodb内建角色包括下面几类:

读写权限:                read/readWrite 读写库的权限

数据库管理角色:    dbAdmin  某数据库管理权限

userAdmin  某数据库用户的管理权限,包括创建用户,授权的管理

dbOwner     某数据库的所有者,拥有该库的所有权限,包括readWrite,dbAdmin和userAdmin权限

集群权限   :

备份和恢复角色:    bakcup  restore

所有数据库角色:    readAnyDatabase

readWriteAnyDatabase

dbAdminAnyDatabase

userAdminAnyDatabase

超级用户角色:        root

内部角色        :        __system  不建议使用

二、搭建认证环境和认证登录

1、找到mongodb配置文件,设置noauth=true

重启Mongodb后,登录admin账号,创建一个超级权限用户

use admin

db.createUser({user:'root',pwd:'root',roles:[{ "role" : "root", "db" : "admin" }]});

2、关闭mongodb

3、启用认证参数

要保证权限认证生效,需要在mongodb配置文件中加入auth=true,同时取消掉noauth=true

4、启动Mongodb

5、认证登录

> use admin
switched to db admin
> db.auth('root','root')

1
> use hong
switched to db hong
> show collections;
liujing
system.users
> db.liujing.find();
{ "_id" : ObjectId("56f255b77fa46acddeb4507b"), "name" : "liujing" }

三、用户授权详解

1、创建用户并授权

语法:db.createUser({user:"UserName",pwd:"Password",roles:[{role:"RoleName",db:"Target_DBName"}]})

首先选择在哪个库创建用户,如test:use test;

创建用户有3项需要提供:用户名,密码,角色列表

例如我要在test下面创建用testuser,密码为testpwd,角色列表包括test库的readWrite角色和userAdmin角色:

db.createUser({user:"testuser",pwd:"testpwd",roles:[{role:"readWrite",db:"test"},{role:"userAdmin",db:"test"}]})

2、修改密码

首先进入目标库:use test

db.changeUserPassword('testuser','testPWD');

3、添加角色

首先进入目标库:use test

db.grantRolesToUser(  "testuser",  [    { role: "read",db:"admin"}  ] )

4、回收角色权限

首先进入目标库:use test

db.revokeRolesFromUser("testuser",[    { role: "read",db:"admin"}  ] )

5、删除用户

首先进入目标库:use test

db.dropUser("testuser")
 
 
 
四、注意事项
 
1、MongodbVOE版本太低,可能导致远程连接mongodb认证失败,建议升级版本或者更换其它GUI工具
2、远程连接Mongodb一定要把mongodb服务器的防火墙打开,否则连接不上
 
 

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、restore;
5. 所有数据库角色: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

MONGODB用户、角色和权限管理的更多相关文章

  1. WordPress用户角色及其权限管理编辑插件:User Role Editor汉化版

    如果Wordpress默认的用户角色及权限不能满足您的需求,又觉得修改代码编辑用户权限太麻烦.那不妨试试User Role Editor,Wordpress用户角色及其权限管理编辑插件. User R ...

  2. MongoDB用户验证和权限管理

    官方参考页面: https://docs.mongodb.com/v3.6/tutorial/enable-authentication/ https://docs.mongodb.com/v3.6/ ...

  3. [转帖]PostgreSQL的用户、角色和权限管理

    PostgreSQL的用户.角色和权限管理 2018年05月18日 14:02:29 jerry-89 阅读数 6143 https://blog.csdn.net/eagle89/article/d ...

  4. MongoDB的账户与权限管理及在Python与Java中的登陆

    本文主要介绍了MongoDB的账户新建,权限管理(简单的),以及在Python,Java和默认客户端中的登陆. 默认的MongoDB是没有账户权限管理的,也就是说,不需要密码即可登陆,即可拥有读写的权 ...

  5. MongoDB的账户与权限管理及在Python与Java中的登录

    本文主要介绍了MongoDB的账户新建,权限管理(简单的),以及在Python,Java和默认客户端中的登陆. 默认的MongoDB是没有账户权限管理的,也就是说,不需要密码即可登陆,即可拥有读写的权 ...

  6. 【视频分享】Liger UI实战集智建筑project管理系统配商业代码(打印报表、角色式权限管理)

    QQ 2059055336 课程讲师:集思博智 课程分类:.net 适合人群:中级 课时数量:23课时 用到技术:Liger UI框架.AJAX.JSON数据格式的序列化与反序列化.角色的交叉权限管理 ...

  7. SpringSecurity 自定义用户 角色 资源权限控制

    SpringSecurity 自定义用户 角色 资源权限控制 package com.joyen.learning.security; import java.sql.ResultSet; impor ...

  8. devops-jenkins基于角色的权限管理RBAC

    一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理  1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...

  9. (大数据工程师学习路径)第一步 Linux 基础入门----用户及文件权限管理

    用户及文件权限管理 实验介绍 1.Linux 中创建.删除用户,及用户组等操作. 2.Linux 中的文件权限设置. 一.Linux 用户管理 Linux 是一个可以实现多用户登陆的操作系统,比如“李 ...

  10. 10.spring-boot基于角色的权限管理页面实现

    10.spring-boot基于角色的权限管理页面实现

随机推荐

  1. Linux服务器没有GUI的情况下使用matplotlib绘图

    最近看到关于 python3 中用matplotlib 不进行交互画图,而是直接将图保存到硬盘,主要的一个设置就是  matplotlib.use('agg') 注明: 其实不设置  matplotl ...

  2. hacking a friend's Linux buzzer driver in OK335xS

    /**************************************************************************** * hacking a friend's L ...

  3. 【codeforces】Bear and Three Balls(排序,去重)

    Bear and Three Balls Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I6 ...

  4. Sereja ans Anagrams 优先队列控制

    Sereja has two sequences a and b and number p. Sequence a consists of n integers a1, a2, ..., an. Si ...

  5. hdu1243 dp (类最长公共子序列)

    题意:射击演习中,已知敌人出现的种类顺序,以及自己的子弹种类顺序,当同种类的子弹打到同种类的敌人时会得到相应分数,问最多能得多少分. 这题的题意很好理解,而且模型也很常见,是带权值的类最长公共子序列问 ...

  6. django中的FBV和CBV

    django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...

  7. day13 python学习 迭代器,生成器

    1.可迭代:当我们打印 print(dir([1,2]))   在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...

  8. vulcanjs 核心架构概念

    基于包的架构 为了保证系统的灵活以及可扩展,vulcanjs 使用基于包的架构设计,每一个功能都是一个包,可以方便的添加,移除 扩展.而不是修改 vulcan 的设计哲学是进行系统扩展,而不是编辑修改 ...

  9. ory Oathkeeper Ecosystem

    ory Oathkeeper 生态包含的组件 ORY Hydra is an OAuth 2.0 and OpenID Connect provider. ORY Oathkeeper is an I ...

  10. svn 报错及解决

    报错: svn: E155015: One or more conflicts were produced while merging r68508:73308 into '[分支]' -- reso ...