mongoo 3.0 权限配置 mongo
程序员文章站
2022-05-09 11:39:55
...
这两天在做mongo权限配置的事情,在做之前根本没想到mongo权限是那么的复杂,且中间还掺杂这版本之间的不同,导致我花了前天、昨天(到今天凌晨)整整两天才把这件事解决。
首先,我花了一天的时间了解了mongo的权限问题,当觉得了解的差不多时,在昨天开始着手新建用户的事。我在生产环境上使用之前创建的userAdminAnyDatabase角色创建了一个用户,
并只给用户配置了只读权限,当在shell(就是mongo自带的shell)中配置好之后,我在shell中验证是该用户的账号密码,结果是通过的,但当我将账号用在robomonogo上登录时,却怎么也无法登陆。很奇怪,是吧?当时真的很恼火,心中怒骂这mongo是什么玩意。抱怨归抱怨,问题还是要解决的。我就一次一次尝试在robomono上登陆,不行,不行,还是不行,就在这是突然我看到了我的secureCRT上打印的mongo日志显示Failed to authenticate desktopRead@admin with mechanism MONGODB-CR,这让我想起了mongo的验证机制有几种方式,MONGODB-CR是其中一种,莫非是验证机制不对?我立马使用shell调用了相关命令:use admin;db.system.users.find()屏幕上显示的是desktopRead使用的是SCRAM-SHA-1验证机制,哇,问题找到了。这可把我高兴坏了。问题原因就是创建的用户是基于SCRAM-SHA-1验证机制的(这是3.0的默认验证机制),但robomongo使用的是MONGODB-CR验证机制,当然无法验证通过了。
于是我想到了两种办法来解决这个问题:1、升级robomongo,让其使用SCRAM-SHA-1验证机制,毕竟最新的mongo默认就是这个,这个是我比较偏好的解决方案 2、在创建用户时指定是MONGODB-CR验证机制,这样就无需升级robomongo了。基于这两种方案我开始了继续探索。
首先我是从第一种方案来开始探索的:robomongo升级。然后我从网上寻找最新的robomongo,另我失望的是,我现在使用的就是最新版(mongo3.0是今年才出来的,robomongo没来得及针对新版mongo做开发)。我在想,不升级robomongo是小事,大不了我用其他支持SCRAM-SHA-1验证机制的工具,但令我担忧的事是,现在项目中用到的用户是基于MONGODB-CR的,不知道mongo驱动是否支持SCRAM-SHA-1。于是我又开始继续探索,由于我们的项目用的是grails(一种web 开发框架,是在spring、hibernate做了一次封装),orm用的是mongodb gorm,查看其配置文件,根本没有有关配置验证机制的字段。但他可以通过connectionString(这是mongo driver的写法)来配置连接,且connectString可以传递参数authMechanism。哈哈,似乎找到了解决办法,立马尝试一下,如我配置了connectionString=“mongodb://desktopRead:123456@localhost:27017/test?authMechanism=SCRAM-SHA-1&authSource=test”.遗憾的是,启动项目报错,不支持SCRAM-SHA-1验证机制,查看了mongo driver版本,是2.12.3,而authMechanism是在2.4开始支持。于是我想升级mongodb gorm,但目前项目中用到的已是最新的,那可不可以单独升级mongo driver呢?貌似这条路最终能否凑效,单独更换mongo driver是唯一的出路,但我没尝试,因为我怕单独升级mongo driver会出很多问题,为保险起见,我决定放弃这种方案,开始探索第二种,但后面的经历也是痛苦的,好在最后解决。
针对第二种方案,则需要创建用户时指定是MONGODB-CR验证机制。但创建用户的命令或函数没有地方可以传用户验证机制的。怎么办?或许在启动mongo时可以传递这个参数,果然有个参数--setParameter authenticationMechanisms=?是可以传递验证机制的。比如我用mongod --setParameter authenticationMechanisms=MONGODB-CR --auth启动服务,但创建的用户还是SCRAM-SHA-1的。启动不行,那客户端是否可以呢?于是又查阅了文档,mongo命令是可以传--authenticationMechanism arg,但这个也无法凑效。然后我用baidu搜索,进入到这个链接https://jira.mongodb.org/browse/SERVER-17459。看完了之后,我喜出望外,总于给我找到了解决办法:降低authmechanism 。使用的命令是:var schema = db.system.version.findOne({"_id" : "authSchema”}) ;schema.currentVersion = 3 ;db.system.version.save(schema) ,这次创建的用户是基于MONGODB-CR的。问题终于解决了,这让我对baidu稍微有了感激之情,之前是非常鄙视他的,搜索出的答案要么是广告多,要么是答非所问。
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
后续:之后我开始配置权限,配置了只读权限,使用robomongo登陆,验证是否不能更新,但令我错愕的是,居然更新成功了,“妈蛋,这mongo是什么玩意,权限控制也太垃圾了吧!”。至此,已是晚上十一点多了,虽然搞定了用户验证问题,但却止于权限控制上,“看似今天没法解决了”,我心想着。所以我决定起来走走,打打台球(我当时还在公司)。打了两局都输了,很懊恼,就不打了。回到座位上,看着那个快要解决而又没解决的问题,更懊恼。但回到座位后,脑子似乎清醒了很多,突然想到了,我没使用验证模式开启mongo。我做了最后尝试,使用验证模式开启,使用只读用户登陆,无法做更新操作。“哈哈哈,终于成功了”。