MongoDB升級到2.6.x版本後,用戶無法登錄的解決方案

  今天沒事跑去MongoDB的官方網站逛了下,發現有新的版本,於是就決定將開發環境下的mongodb-2.4.7直接升級到最新版本2.6.5版本。升級倒是異常快速,但使用客戶端登錄的時候就傻眼了,賬號、密碼都正確,就是死活登錄不了。我用的是MongoVUE 1.6.9,報錯如下:

再看看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)

  項目做多了,創建的數據庫也多了,還得爲每個數據庫要創建一個數據庫連接,極爲不方便:

  

  於是萌生一個想法,想創建一個類似於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("<username>", [{ role: "<role-name>", db: "<db-name>"}])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章