mongoDb用户管理

不起床是我最后的倔强

单实例情况

这里只针对3.x版本说明
官方文档

首先看文档

MongoDB provides support for authentication and authorization on a per-database level. Users exist in the context of a single logical database.

  • MongoDb提供的权限控制是数据库级别的,每个数据库都有属于自己的管理者帐号 。
  • 例如,有两个db A和B,在A中的用户UserA,在B中是不存在的。

数据库安装完成时,启动服务(第一次一般不加auth参数)。

./mongod
  • 初次登录只有local库
  • 默认登录的test库(其实test库不存在),并且admin库是不存在的(之前版本有)。
  • 此时登录,由于启动服务时没有加auth参数,所以是没有用户权限控制的。
  • 登录者现在是可以对数据库做任何操作的,就是说这个数据库连接对当前数据库有完整权限。
启用用户权限

admin库是存放数据库账号信息的

admin库说明
  • system.version存储authSchema的版本信息
  • system.users存储了数据库账号信息
  • system.roles存储了角色信息(如果用户有自定义角色)
  • system.users、system.roles2个集合的数据,MongoDB会cache在内存里,这样不用每次鉴权都从磁盘加载用户角色信息
if (supportsDocLocking() || enableCollectionLocking) {                 
   if (supportsDocLocking() || enableCollectionLocking) {
   // The check for the admin db is to ensure direct writes to auth collections
   // are serialized (see SERVER-16092).
     if (_id == resourceIdAdminDB && !isRead) {
        _mode = MODE_X;
     }
    _lockState->lock(_id, _mode); 
 }       

从代码中我们可以看出,MongoDB将将admin数据库上的意向写锁(MODE_IX)直接升级为写锁(MODE_X),也就是说admin数据库的写入操作的锁级别只能到DB级别,不支持多个collection并发写入,在写入时也不支持并发读取。如果用户在admin数据库里存储业务数据,则可能遭遇性能问题。

admin库操作

首先要理解:

  • admin库不可以直接管理其它数据库的权限,但是可以通过创建用户来间接管理。
  • mongodb是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
  • 切换到admin数据库,添加的账号才是管理员账号。
  • 用户只能在用户所在数据库登录(db.auth()),包括管理员账号。
  • 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证(登录)后才可以。

如果此时想启用用户权限:
切换到admin库(此时admin库不存在)

use admin //切换数据库
 db.createUser({
     user:"king",
     pwd:"king",
     roles:[{
         "role":"userAdminAnyDatabase","dbAdminAnyDatabase","db":"kingDb"
    }]
}) 
  • 这样管理员就创建完毕了。可以用这个用户创建维护其他数据库的用户。
  • 随着用户的创建,admin数据库此刻也成功创建了。

登出数据库,重启数据库

./mongod --auth //启动用户权限
use admin //切换数据库
db.auth("king","king") //其实就是数据库登录

还有要说明:

  • 要创建哪个数据库的object(包括用户),首先要切换到目标数据库
  • 在哪个库(admin)创建的用户就要在哪个库做验证(db.auth),验证通过后再切换其它库操作
use kingDb //切换数据库
 db.createUser({ //利用admin创建kingDb数据库的用户
     user:"kingAdmin",
     pwd:"king",
     roles:[{
         "role":"userAdminAnyDatabase","dbAdminAnyDatabase","db":"kingDb"
    }]
}) 
db.auth("kingAdmin","king") //用新建的用户登录 
角色说明

Built-In Roles(内置角色):

  • 数据库用户角色:
    • read:允许用户读取指定数据库
    • readWrite:允许用户读写指定数据库
  • 数据库管理角色:
    • dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
    • dbOwner:
    • userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
  • 集群管理角色:
    • clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
    • clusterManager:
    • clusterMonitor:
    • hostManager:
  • 备份恢复角色:
    • backup:
    • restore:
  • 所有数据库角色:
    • readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
    • readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
    • userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
    • dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
  • 超级用户角色:
    • root :只在admin数据库中可用。超级账号,超级权限
  • 这里还有几个角色间接或直接提供了系统超级用户的访问(
    • dbOwner :
    • userAdmin:
    • userAdminAnyDatabase:
  • 内部角色
    • __system:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值