开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库!
   在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息!当admin.system.users一个用户都没有时,即使mongod启动时添加了--auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以--auth 参数启动),直到在admin.system.users中添加了一个用户。
需要注意的是:admin.system.users中将会保存比在其它数据库中设置的用户权限更大的用户信息,拥有超级权限,也就是说在admin中创建的用户可以对mongodb中的其他数据库数据进行操作。
1 mongodb系统中,数据库是由超级用户来创建的,一个数据库可以包含多个用户,一个用户只能在一个数据库下,不同数据库中的用户可以同名!
2 当admin.system.users一个用户都没有时,即使mongod启动时添加了--auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以--auth 参数启动),直到在admin.system.users中添加了一个用户。
3 特定数据库比如DB1下的用户User1,不能够访问其他数据库DB2,但是可以访问本数据库下其他用户创建的数据!
4 不同数据库中同名的用户不能够登录其他数据库!比如DB1,DB2都有user1,以user1登录DB1后,不能够登录到DB2进行数据库操作!
5 在admin数据库创建的用户具有超级权限,可以对mongodb系统内的任何数据库的数据对象进行操作!

6 给第二点做补充,在admin.system.users一个用户都没有时,即使mongod启动时添加了--auth参数,且在其他库例如DB1中添加了User1,此时连到DB1也不会做认证的。

下面通过实验的方式进程验证(可能不全面,欢迎大家指正):
1 第一次安装monogdb时,admin数据库中没有任何用户,此时不管是否以--auth方式启动数据库,其他数据库(比如test数据库)中的用户都可以对另外的数据库(比如db1数据库)中的数据进行操作~!
a)以默认的方式启动mongodb
[mongodb@rac3 bin]$ ./mongod  --dbpath=/opt/mongodata/data --port=27000
在另一个窗口进入mongodb shell,默认是直接进入test 数据库的,并且此时用户拥有超级权限,可以操作任何数据库对象!
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27000/test
> show dbs
local   (empty)
#查看admin 数据库中的用户信息,因为是刚建立的数据库所以user 为空~!
> use admin
switched to db admin
> db.system.users.find() ;
#创建test数据库,并创建对象yql,插入数据!
> use test
switched to db test
>
> db.yql.insert({id:2,val:"yangql is learing monogdb master slave!"});
#创建db1数据库,并创建对象db1_test,插入数据!
> use db1
switched to db db1
>
> db.db1_test.insert({id:1,val:"this data is in db1 !"});
> db.db1_test.insert({id:2,val:"this data is in db1 !"});
> db.db1_test.insert({id:3,val:"this data is in db1 !"});
#创建db2数据库,并创建对象db2_test,插入数据!
> use db2
switched to db db2
>
> db.db2_test.insert({id:1,val:"this data is in db2!"});
> db.db2_test.insert({id:2,val:"this data is in db2!"});
> db.db2_test.insert({id:3,val:"this data is in db2!"});
> db.db2_test.find();
{ "_id" : ObjectId("4f2bbcdf2a801e73e6493f31"), "id" : 1, "val" : "this data is in db2!" }
{ "_id" : ObjectId("4f2bbce52a801e73e6493f32"), "id" : 2, "val" : "this data is in db2!" }
{ "_id" : ObjectId("4f2bbce92a801e73e6493f33"), "id" : 3, "val" : "this data is in db2!" }
>
> show dbs
admin   (empty)
db1     0.203125GB
db2     0.203125GB
local   (empty)
test    0.203125GB
#在test 数据库中创建用户yql,密码为yql
> use test
switched to db test
>
> db.addUser("yql","yql")
{ "n" : 0, "connectionId" : 1, "err" : null, "ok" : 1 }
{
        "user" : "yql",
        "readOnly" : false,
        "pwd" : "868ed7035435f33b60ebeba2f363ad91",
        "_id" : ObjectId("4f2bbed556f179b1ccc295d1")
}

> db.auth("yql","yql") #验证函数,验证数据库中是否存在对应的用户
1
>
> db.system.users.find();
{ "_id" : ObjectId("4f2bbed556f179b1ccc295d1"), "user" : "yql", "readOnly" : false, "pwd" : "868ed7035435f33b60ebeba2f363ad91" }
>
> exit
bye

b)关闭mongod 服务,并以认证方式启动数据库
[mongodb@rac3 bin]$ ./mongod  --dbpath=/opt/mongodata/data --port=27000 --auth
 使用supper 用户登录!可以对mongodb系统内的所有数据库进行查询,DML操作!
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/admin  -usupper -psup
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27000/admin
>
> show dbs
admin   0.203125GB
db1     0.203125GB
db2     0.203125GB
local   (empty)
test    0.203125GB
>
> use db1
switched to db db1
> db.db1_test.find()
{ "_id" : ObjectId("4f2bb3a42a801e73e6493f2b"), "id" : 1, "val" : "this data is in db1 !" }
{ "_id" : ObjectId("4f2bb3ae2a801e73e6493f2c"), "id" : 2, "val" : "this data is in db1 !" }
{ "_id" : ObjectId("4f2bb3b32a801e73e6493f2d"), "id" : 3, "val" : "this data is in db1 !" }
> use db2
switched to db db2
> db.db2_test.find()
{ "_id" : ObjectId("4f2bbcdf2a801e73e6493f31"), "id" : 1, "val" : "this data is in db2!" }
{ "_id" : ObjectId("4f2bbce52a801e73e6493f32"), "id" : 2, "val" : "this data is in db2!" }
{ "_id" : ObjectId("4f2bbce92a801e73e6493f33"), "id" : 3, "val" : "this data is in db2!" }
>
> use test
switched to db test
>
> db.system.users.find();
{ "_id" : ObjectId("4f2bbed556f179b1ccc295d1"), "user" : "yql", "readOnly" : false, "pwd" : "868ed7035435f33b60ebeba2f363ad91" }
>
> db.yql.find();
{ "_id" : ObjectId("4f2bb3662a801e73e6493f2a"), "id" : 2, "val" : "yangql is learing monogdb master slave!" }
>
> db.yql.remove();###删除数据###
>
> db.yql.find();
>
> use db1
switched to db db1
>
> db.addUser("db1", "db1")  
{ "n" : 0, "connectionId" : 9, "err" : null, "ok" : 1 }
{
        "user" : "db1",
        "readOnly" : false,
        "pwd" : "08a3bfa3cdef4464c4738a7180465adf",
        "_id" : ObjectId("4f2bc2d7b85653a70aa4fc50")
}
> exit
bye
4 不同数据库中的用户可以同名,不同数据库中同名的用户依然不登录其他数据库!比如DB1,DB2都有user1,以user1登录DB1后,不能够登录到DB2进行数据库操作!
在不同数据库中创建相同的用户,进行测试!
测试场景:在test,db2数据库中创建用户db1,密码db1
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/admin  -usupper -ppwd2
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27000/admin

> use db2
switched to db db2

> db.addUser("db1", "db1")  
{ "n" : 0, "connectionId" : 17, "err" : null, "ok" : 1 }
{
        "user" : "db1",
        "readOnly" : false,
        "pwd" : "08a3bfa3cdef4464c4738a7180465adf",
        "_id" : ObjectId("4f2bccb3e39cb674302ce2dd")
}

> exit
bye
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000 -uyql -ppwd1
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27000/test

> db.addUser("db1", "db1")  
{ "n" : 0, "connectionId" : 19, "err" : null, "ok" : 1 }
{
        "user" : "db1",
        "readOnly" : false,
        "pwd" : "08a3bfa3cdef4464c4738a7180465adf",
        "_id" : ObjectId("4f2bcce9b5accbdac9e71a93")
}
> exit
bye
[mongodb@rac3 bin]$ 
使用用户db1登录db2数据库,然后尝试登录db1,并进行查询测试,报错显示未授权!
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/db2 -udb1 -pdb1
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27000/db2

> use db1
switched to db db1

> db.db1_test.find();
error: {
        "$err" : "unauthorized db:db1 lock type:-1 client:127.0.0.1",
        "code" : 10057
}

某个数据库中对应的用户只能对本数据库进行操作,而不能操作其他数据库,包括查询和创建其他数据库!
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/db1 -udb1 -pdb1       
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27000/db1


> use db3
switched to db db3

> db.db3_test.insert({id:1,val:"this data is in db3!"});
unauthorized
> db.db3_test.insert({id:2,val:"this data is in db3!"});
unauthorized
> db.db3_test.find();
error: {
        "$err" : "unauthorized db:db3 lock type:-1 client:127.0.0.1",
        "code" : 10057
}
> exit
bye

使用db.auth()可以对数据库中的用户进行验证,如果验证成功则返回1,否则返回0! db.auth() 只能针对登录用户所属的数据库的用户信息进行验证,不能验证其他数据库的用户信息,因为访问不了其他数据库(有点小白的解释)
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/db1 -udb1 -pdb1
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27000/db1
>
> db.auth("yql","pwd")
0
> db.auth("db1","db1")
1
>
> exit
bye
------------------------------EOF-----------------------------

【Mongodb】用户和认证 权限总结的更多相关文章

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

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

  2. mongodb用户创建及权限控制

    转载 2017年03月30日 12:36:15 2169 摘要: MongoDB 3.0 安全权限访问控制,在添加用户上面3.0版本和之前的版本有很大的区别,这里就说明下3.0的添加用户的方法. 环境 ...

  3. 【MongoDB】开启认证权限

    1. mongodb.conf : 添加 auth=true 2. use admin (3.0+ 使用 createUser ;<3.0版本  http://www.cnblogs.com/g ...

  4. emqtt 试用(五)emq 的用户密码认证

    MQTT 认证设置 EMQ 消息服务器认证由一系列认证插件(Plugin)提供,系统支持按用户名密码.ClientID 或匿名认证. 系统默认开启匿名认证(anonymous),通过加载认证插件可开启 ...

  5. EMQ -- 用户密码认证

    emq 的用户密码认证 MQTT 认证设置 EMQ 消息服务器认证由一系列认证插件(Plugin)提供,系统支持按用户名密码.ClientID 或匿名认证. 系统默认开启匿名认证(anonymous) ...

  6. emqtt emq 的用户密码认证

    MQTT 认证设置 EMQ 消息服务器认证由一系列认证插件(Plugin)提供,系统支持按用户名密码.ClientID 或匿名认证. 系统默认开启匿名认证(anonymous),通过加载认证插件可开启 ...

  7. MongoDB用户权限认证

    关于用户的认证及权限 用户是跟着库创建的,在哪个库创建的什么权限的什么用户,只对此库有相应权限(除超级管理员以外). 官网文档:https://docs.mongodb.com/master/refe ...

  8. mongodb添加用户和认证

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

  9. macos下mongoDB 3.4.5 添加用户、设置权限

    macos下mongoDB 3.4.5 添加用户.设置权限   在项目中需要根据项目运行环境访问,以不同的身份访问各自的db,所以研究了一下MongoDB的 需求: 给MongoDB添加两个用户分别用 ...

随机推荐

  1. mongo 操作小结

    这里总结一下mongo常用操作语句,分享给大家和我自己~ 打印系统,数据库,集合的信息 db.stats()                                    打印数据库状态 db ...

  2. mac键盘图表大全

    Mac键盘图标与对应快捷按键 ⌘——Command () ⌃ ——Control ⌥——Option (alt) ⇧——Shift ⇪——Caps Lock fn——功能键就是fn *.m*.h切换 ...

  3. PowerDesigner使用教程【转】

    PowerDesigner使用教程 —— 概念数据模型   一.概念数据模型概述    概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对这 ...

  4. Vmware10 Centos7 共享文件夹设置方法

    先安装包依赖: yum -y install kernel-devel-$(uname -r) yum -y install net-tools perl gcc gcc-c++ 安装vm tool ...

  5. Qt入门——使用QT+VS2008开发windows应用程序

    1.文件->新建->项目 Qt4 Projects 右边已安装模板当中选择At Application. 确定 2.选择需要使用的QT库 下一步 3. “class name”:指定类的名 ...

  6. on SDN

    sdn (software defined network ) emulex 网络 新型网络创新架构 网络虚拟化的一种实现方式 核心技术:OpenFlow 分离网络设备的控制层面和数据层面 目的:实现 ...

  7. Mxnet学习资源

    MxNet 学习笔记(1):MxNet中的NDArray http://mxnet.incubator.apache.org/api/python/symbol/symbol.html api文档 M ...

  8. Tornado + Celery + RabbitMQ

    声明:代码是从项目中截取的, 为进行测试 使用Celery任务队列,Celery 只是一个任务队列,需要一个broker媒介,将耗时的任务传递给Celery任务队列执行,执行完毕将结果通过broker ...

  9. C# 初学

    突然对C#充满了兴趣,于是兴致勃勃的折腾起来. 下面是折腾的过程: IDE,我选择了vs2017,不过这货的安装选项略多,对于新手来说各种坑.无论如何,选择”.NET桌面开发”即可,其他的全部留空. ...

  10. 第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解

    第三百五十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy信号详解 信号一般使用信号分发器dispatcher.connect(),来设置信号,和信号触发函数,当捕获到信号时执行 ...