赞
踩
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数据库中可用。超级账号,超级权限。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。