mongoDB用户角色权限配置和相关使用规范

MongoDB默认是没有设置账户权限的,行业内大多数使用MongoDB的项目也没有设置访问权限。这就意味着只要知道MongoDB服务器的IP和端口,很容易查询和操作MongoDB数据库的内容。十分不安全。

下面给出设置管理权限的过程。

首先,我们用linux连接软件操作linux。

(1)查看mongodb的默认存储引擎

echo "db.serverStatus()"| mongo|grep wiredTiger

(2)进入mongodb

 mongo --host 127.0.0.1    #如果是默认127.0.0.1连接,可以直接输入 mongo 进行连接

这些警告可以暂时忽略,如果想处理掉,可以一个个修改配置解决掉。(好像设置mongo账户验证权限后就全部没了警告)

(3)查看所有库(当前假设是没有设定账户密码)

show dbs 

admin(管理员)和local(本地)是两个特殊的数据库,它们当中的用户可对任何数据库进行操作。这两个数据库中的用户可被看作是超级用户。经认证后,管理员用户可对任何数据库进行读写,同事能执行某些只有管理员才能执行的命令。

每个数据库都有自己的用户,创建用户的命令是db.createUser(),当你在某个数据库下创建一个用户时,该用户就属于你当前所在的数据库。

【创建管理员用户】

首先关于用户角色权限的说明请看本文章最下面。

use admin

db.createUser({user:"root",pwd:"123456",roles:["userAdminAnyDatabase"]})  #建议user命名为admin,root用于命名超级管理员

因为创建的用户只对当前库验证有效,所以默认在当前库下创建用户,创建到其他库可以下面这样写,改最后面的db值即可:

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

【注意:如果想在admin下创建可以操作其他库的角色,也方便管理的话,用"root"角色】

现在测试登录一下:

use admin

db.auth("root","123456")

#db.auth()方法返回1表示登录成功。

查看当前库的用户(因为前面已经use admin,所以已经选择了库):

show users

(提示:db.system.users.find().pretty()是显示mongo中所有的用户账号

【创建普通用户】

普通用户就是自己创建的数据库的增加的管理用户,只能操作单个数据库权限

首先保证你已经以管理员用户(admin数据库的用户)登录admin数据库。然后用use命令切换到目标数据库来新增普通用户。

use admin

db.auth("root","123456")

show dbs

use test              #test是我自己创建的数据库

db

#增加普通用户账号

#创建一个名为test的用户,密码设置为"123456,",如下:

db.createUser({user:"test",pwd:"123456,",roles:["readWrite"]})

#测试是否成功

db.auth("test","123456,")

普通用户就算认证db.auth()通过之后,也没有权限执行show dbs命令,只能用db命令查看当前数据库!

由于上面写的比较乱。最后,来个总结,建议创建哪些账号:

①创建个“账号管理员”,user: admin    rolos:userAdminAnyDatabase  (只能操作账号权限,不能操作数据)

②创建个“超级管理员”,user: root   rolos:root  (操作一切)

③ 在需要做操作的自定义库上创建自定义账户: user:任意名   rolos:dbOwner  (该库所有者,操作这个库的所有权限)

【开启mongodb连接认证功能】

配置文件在安装mongoDB程序的文件根目录下,为config.conf文件。

我的路径为:/www/server/mongodb/config.conf

找到下面这个内容:

security:
  authorization: enabled  //这个disabled改为enabled
  javascriptEnabled: false

重启mongodb服务,就开启了认证功能。

【使用账户密码操作mongodb】

这个时候我们测试连接mongo

可以看到直接show dbs报错,因为没有账户权限,需要验证权限。

然后我们用管理账户密码验证登录。

use admin    #必须先选择admin库

db.auth("root","123456")

show dbs

db.system.users.find().pretty()   #显示mongodb中所有库的用户,pretty()分行显示,可要可不要,加了看起来方便。

重新连接mongo,测试用普通用户权限登录。

mongo  #连接mongo

db  #显示自己创建的数据库

use test #选择目标数据库

db.auth("test","123456,")  #验证账户权限

这个时候我们再进行show dbs,就会出现权限错误

【操作mongodb数据】

实际项目中,使用php连接mongodb操作语句就不解释,这里说明用linux命令的操作方法。

(1)插入数据

设定是重新连接mongodb最初操作。

mongo  #连接mongo

db   #查看自定义数据库

use test     #选中目标数据库

db.auth("test","123456,")  #验证权限 

db  #确定数据库

db.ceshi.insert({name:"xiaoming",age:21,sex:"男"})     #插入一条数据,ceshi代表数据表名,如果不存在会自动创建

db.ceshi.insert({name:"xiaohong",age:30,sex:"女"})     #插入第二条

db.ceshi.insert({name:"xiaowang",age:40,sex:"男"})    #插入第三条

(2)查询数据

db.ceshi.find()

 db.ceshi.findOne()         #查询第一条数据

db.ceshi.findOne({age:30})  #查询年龄为30的第一条数据

如果要查询满足条件的所有数据,直接写为:

db.ceshi.find({age:30})  #去掉One就会显示满足条件的所有数据

db.ceshi.find({name:"xiaoming",age:{$gte:"18",$lte:"30"}}) #举个例子说明复杂条件查询

(3)修改数据

db.tableName.update({},{},false,true) 

参数1:条件,

参数2:替换,如果{$set:{y:100,x:10}}

参数3:不存在是否创建:true:是,false,不创建

参数4:是否更新全部符合条件数据:true:是,false:只更新第一条

db.ceshi.update({name:"xiaoming"},{$set:{age:"11"}},false,true)      #把年龄改为:11

db.ceshi.update({name:"xiaohong"},{$set:{age:"88",sex:"不男不女"}},false,true)     #把年龄改:88,性别改:不男不女

(4)删除数据

db.ceshi.remove({})   #删除列表中所有数据,集合和索引不会被删除

db.ceshi.remove({name:"xiaoming"})  #根据条件删除

db.ceshi.drop()  #删除表中所有数据

【删除用户账号】

删除普通用户须由(userAdminAnyDatabase或root)权限的用户来删除,需要db.auth验证权限后进行操作。

删除(userAdminAnyDatabase)须由超级管理员权限(root)来删除,需要db.auth验证超级管理员的角色后进行操作。

db.system.users.remove({user:"111"})    #删除单个用户

-----------------------------------------------------------------------------------

db.system.users.remove({})

#超级管理员权限删除所有用户,不建议使用,删除后无法访问,需要在mongo配置中关闭权限验证。然后再去添加管理员。

【角色权限说明】

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 :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces 

readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限。

dbOwner:该数据库的所有者,具有该数据库的全部权限。 

dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。 

userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。

clusterAdmin:提供了最大的集群管理功能。相当于clusterManager, clusterMonitor, and hostManager和dropDatabase的权限组合。 

clusterManager:提供了集群和复制集管理和监控操作。拥有该权限的用户可以操作config和local数据库(即分片和复制功能) 

clusterMonitor:仅仅监控集群和复制集。 

hostManager:提供了监控和管理服务器的权限,包括shutdown节点,logrotate, repairDatabase等。 备份恢复权限:admin数据库中包含了备份恢复数据的角色。包括backup、restore等等。

readAnyDatabase:具有read每一个数据库权限。但是不包括应用到集群中的数据库。

readWriteAnyDatabase:具有readWrite每一个数据库权限。但是不包括应用到集群中的数据库。
 
userAdminAnyDatabase:具有userAdmin每一个数据库权限,但是不包括应用到集群中的数据库。

dbAdminAnyDatabase:提供了dbAdmin每一个数据库权限,但是不包括应用到集群中的数据库。

root:只在admin数据库中可用。超级账号,超级权限。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值