MongoDB升级到2.6.x版本后,用户无法登录的解决方案

  今天没事跑去MongoDB的官方网站逛了下,发现有新的版本,于是就决定将开发环境下的mongodb-2.4.7直接升级到最新版本2.6.5版本。升级倒是异常快速,但使用客户端登录的时候就傻眼了,账号、密码都正确,就是死活登录不了。我用的是MongoVUE 1.6.9,报错如下:

MongoDB升级到2.6.x版本后,用户无法登录的解决方案_第1张图片

再看看mongoDb的日志,的确是报异常了:

2014-11-07T21:06:44.749+0800 [initandlisten] connection accepted from 127.0.0.1:9374 #4 (1 connection now open)
2014-11-07T21:06:44.750+0800 [conn4]  authenticate db: kayo { authenticate: 1, user: "root", nonce: "xxx", key: "xxx" }
2014-11-07T21:06:44.750+0800 [conn4] Failed to authenticate root@kayo with mechanism MONGODB-CR: AuthenticationFailed UserNotFound Could not find user root@kayo
2014-11-07T21:06:44.751+0800 [conn4] end connection 127.0.0.1:9374 (0 connections now open)

  出现这个错误,在官方文档也找到了解释,原来在2.6版本做了很大的改进,其改进涉及到核心、存储、网络、查询和安全性等多方面,自然,其用户登录认证机制也发生了改变,db.system.users的schema也是是不同的,并且还增加了权限role的支持。

  好吧,那么就动手解决这个问题吧!因为数据库启用了--auth,所以必须先去掉--auth参数,把数据库重启一遍,创建一个mongDB的系统管理员账号,系统管理员账号创建好后,再加上--auth参数重启。创建mongDB系统管理员账号的操作如下:

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

加上--auth参数重启后,以刚才创建的admin用户登录:

> mongo
> use admin
> db.auth("admin", "123456")
1

查看账号admin的用户信息与权限:

db.runCommand(
	{
		usersInfo:"admin",
		showPrivileges:true
	}
)

接下来就是重点了,我的目标数据库是kayo,现在是该数据库无法登录,所以要为kayo数据库创建一个账号,并指定dbOwner权限,操作如下:

> use kayo
> db.createUser(
	{
		"user": "root",
		"pwd": "123456",
		"roles":[
			{
				"role": "dbOwner",
				"db": "kayo"
			}
		]
	}
)

关于mongoDB权限,可以查看官方文档:http://docs.mongodb.org/manual/reference/built-in-roles/

创建用户之后,就可以正常登录了。遇到问题,还是多看官方文档,有时候百度真的不管用

扩展MongoDB数据库超级管理员(2016-5-3 11:00:49)

  项目做多了,创建的数据库也多了,还得为每个数据库要创建一个数据库连接,极为不方便:

  MongoDB升级到2.6.x版本后,用户无法登录的解决方案_第2张图片

  于是萌生一个想法,想创建一个类似于MySQL数据库那样的root用户,可以管理读写所有的Mongo数据库。前面已经讲到过在admin数据库里创建了一个admin用户,但这个用户的权限是有限的,该用户仅限于“userAdminAnyDatabase”角色,下面就来熟悉下mongoDB内置的管理全部数据的角色。

  • readAnyDatabase:在admin数据库下建立,可以读取所有数据库的信息
  • readWriteAnyDatabase:在admin数据库下建立,可以读写所有数据库的信息
  • userAdminAnyDatabase:在admin数据库下建立,可以管理所有数据库的用户
  • dbAdminAnyDatabase:在admin数据库下建立,可以管理所有数据库的信息(类似于所有数据库的dbAdmin账户)

  要让admin用户能够读写所有数据库,则需要做如下授权:

> use admin
> db.grantRolesToUser("admin", [{ role: "readWriteAnyDatabase", db: "admin" }])

  取消授权的命令如下:

db.revokeRolesFromUser("", [{ role: "", db: ""}])

你可能感兴趣的:(MongoDB)