自从接手这个项目以来,真的被坑惨了。测试服的mongodb经常被删,原因是没有设置账户密码,相应的端口也没有限。只要知道连接地址谁都可以删库。这要归功于mongodb的默认机制。就这样竟然度过了两年多,我一来就特么删库。
以mongo3.4.24为例,首先在mongo.conf中开启认证。还没创建用户密码的可以创建用户了再开启。
security:
authorization: enabled
登录,创建用户并授权,登录用admin库的用户
普通登录:bin/mongo 127.0.0.1:27017 认证登录: bin/mongo 127.0.0.1:27017 -u user -p password --authenticationDatabase admin
查询和删除用户命令
use admin
db.system.users.find();
db.system.users.remove({});
创建admin的用户,注意admin这个库要给root权限,否则开启权限验证登录一些操作会显示没有权限
use admin db.createUser({ user: "root", pwd: "password", roles:[{role:"root",db: "admin"}]}); db.auth("root","admin");
特别注意:mongodb和spring-mongodb默认的认证机制不同,会导致项目中mongo连接不上!
1、mongodb的认证机制有2种:SCRAM-SHA-1和MONGODB-CR。3.0之后版本默认为:SCRAM-SHA-1;
2、spring-mongodb默认为:MONGODB-CR,并不支持设置认证方式;
db.system.version.findOne({"_id":"authSchema"}); db.system.version.insert({"_id":"authSchema","currentVersion":3}) db.system.version.update({"_id":"authSchema"},{$set:{"currentVersion":3}})
创建其他数据库的用户,mongo的每个库的用户是独立的。你有多少个库就要创建多少个用户,即使用户名一样也要。
use addressbook db.createUser({user:"user",pwd:"password",roles:[{role:"readWrite", db:"addressbook"},{role:"dbAdmin",db:"addressbook"},{role:"dbOwner",db:"addressbook"}]}); db.auth("zaixiudb","password"); use imRoom db.createUser({user:"user",pwd:"password",roles:[{role:"readWrite", db:"imRoom"},{role:"dbAdmin",db:"imRoom"},{role:"dbOwner",db:"imRoom"}]}); db.auth("zaixiudb","password");
* 这里要特别注意权限从小到大,如下刚开始从网上copy了这句创建用户。
db.createUser({user:"user",pwd:"password",roles:[{role:"read", db:"addressbook"},{role:"readWrite", db:"addressbook"},{role:"dbAdmin",db:"addressbook"},{role:"dbOwner",db:"addressbook"}]});
spring boot老是连接不上,报权限错误Command failed with error 13 (Unauthorized): 'not authorized on imapi to execute command
mongo compass却可以连接上,原因是springboot项目中有写入操作。因此去掉read权限,readWrite权限生效。
开启conf中的认证模式,重启启动mongodb生效。
springboot中的配置
mongoconfig.uri=mongodb://user:password@127.0.0.1:28018 mongoconfig.dbName=imapi mongoconfig.mapPackage=cn.xyz.mianshi.vo mongoconfig.roomDbName=imRoom mongoconfig.username=user mongoconfig.password=password mongoconfig.connectTimeout=20000 mongoconfig.socketTimeout=20000 mongoconfig.maxWaitTime=20000