之前整理的mongo基本语法都是在没有用户名密码验证的条件下测试的,因为mongo与mysql不同,它安装的时候默认是没有权限控制的额,也就是说任何人,只要知道了host和port都可以登陆数据库并操作。
如果想要设置用户,需要自己另行配置。
一开始按照网上的一些方法没有设置成功,主要是因为版本和权限设置的一些问题,所以这里我把记录下来,以便之后查找。
mongo中,每个数据库都可以有自己的管理员账号,只要在响应的数据库中使用如下语法即可添加一个用户:
db.createUser({user : "用户名" , pwd : "密码" , roles : [ { role : "角色" ,db : "数据库"} , ....]})
这样,该用户使用用户名密码就可以操作这一个数据库。但是,如果是在admin数据库中创建的用户,那么可以操作任何数据库,也就是也有最高权限。
*设置一个最高权限的用户的步骤
①首先在无需验证的情况下进入admin数据库:
>use admin
switched to db admin
>db.createUser({user:"root",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"__system",db:"admin"}]})
这里注意:
1、有的博客教程中说使用 db.addUser("root","123456") 这个函数,但是在3.6版本中已经不支持这个方法了,只能使用createUser函数
2、在设置roles的时候,一定要加上
__system (
有两个下划线) 这个角色。
②重新安装windows服务:
因为之前使用mongod安装windows服务的时候默认是不采用验证的,所以在设置了数据库用户之后需要重新安装一下
进入到mongo的bin目录下面
D:\MongoDB\Server\3.6\bin>mongod --auth --logpath "D:\MongoDB\Server\3.6\logs\mongo.log" --dbpath "D:\MongoDB\Server\3.6\data" --reinstall
这里logpath是日志文件目录,dbpath是数据文件的目录 --auth选项表示使用验证,如果想要不适用验证,只要不用 --auth 选项再重新安装一次服务就可以了。
另外,再重新安装服务之前最好 net stop MongoDB,否则可能出错
③开启MongoDB服务,进入数据库之后使用用户名密码验证:
D:\MongoDB\Server\3.6\bin>mongo.exe
MongoDB shell version v3.6.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.2
> use admin
switched to db admin
> show tables
2018-01-29T14:41:39.010+0800 E QUERY [thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listCollections: 1.0, filter: {}, $db: \"admin\" }",
"code" : 13,
"codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:941:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:953:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:964:16
shellHelper.show@src/mongo/shell/utils.js:806:9
shellHelper@src/mongo/shell/utils.js:703:15
@(shellhelp2):1:1
>
db.auth("root","123456")
1
> show tables
system.users
system.version
>
可以看到,未验证的时候执行 show dbs 命令会报错:not authorized on admin to execute command { listCollections: 1.0, filter: {}, $db: \"admin\" }
此时使用验证语句:
db.auth("root","123456") 返回1表示验证成功,然后就可以执行各种命令