mongodb 安裝和

來源:互聯網
上載者:User
MongoDB設定存取權限、設定使用者

MongoDB已經使用很長一段時間了,基於MongoDB的資料存放區也一直沒有使用到許可權訪問(MongoDB預設設定為無許可權訪問限制),今天特地花了一點時間研究了一下,研究成果如下:

註:研究成果基於Windows平台

MongoDB在本機安裝部署好後

1. 輸入命令:show dbs,你會發現它內建有兩個資料庫,一個名為admin,一個名為local。local好像沒啥用,如果哪位在使用過程中發現了這個local表的用途,希望能夠留言提醒,那我們就專心來說說admin表

2. 輸入命令:use admin,你會發現該DB下包含了一個system.user表,呵呵,沒錯,這個表就等同於MsSql中的使用者表,用來存放超級管理員的,那我們就往它裡面添加一個超級管理員試試看

3. 輸入命令:db.addUser('sa','sa'),這裡我添加一個超級管理使用者,username為sa,password也為sa,即然我們添加了超級管理員,那咱們就來測試下,看看咱們再次串連MongoDB需不需要提示輸入使用者名稱、密碼,我們先退出來(ctrl+c)

4. 輸入命令:use admin

5. 輸入命令:show collections,查看該庫下所有的表,你會發現,MongoDB並沒有提示你輸入使用者名稱、密碼,那就奇怪了,這是怎麼回事呢。在文章最開始提到了,

MongoDB預設設定為無許可權訪問限制,即然這樣,那我們就先把它設定成為需要許可權訪問限制,咱們再看看效果,怎麼設定呢。

6. 在註冊表中,找到MongoDB的節點,在它的ImgPath中,我們修改一下,加入 -auth,如下所示:

"D:\Program Files\mongodb\bin\mongod" -dbpath  e:\work\data\mongodb\db  -logpath  e:\work\data\mongodb\log -auth -service

7. 輸入命令:use admin

8. 輸入命令:show collections,呵呵,我們發現無法查看該庫下的表了,提示:"$err" : "unauthorized db:admin lock type:-1 client:127.0.0.1",很明顯,提示沒有許可權,看來關鍵就在於這裡,我們在啟動MongoDB時,需要加上-auth參數,這樣我們設定的許可權才會生效,好,接下來我們使用剛剛之前設定的使用者名稱、密碼來訪問

9. 輸入命令:db.auth('sa','sa'),輸出一個結果值為1,說明這個使用者匹配上了,如果使用者名稱、密碼不對,會輸入0

10. 輸入命令:show collections,呵呵,結果出來了,到這裡,使用權限設定還只講到一多半,接著往下講,我們先退出來(ctrl+c)

11. 輸入命令:mongo TestDB,我們嘗試串連一個新的庫(無論這個庫是否存在,如果不存在,往該庫中添加資料,會預設建立該庫),然後,我們想看看該庫中的表

12. 輸入命令:show collections,好傢夥,沒許可權,我們輸入上面建立的使用者名稱、密碼

13. 輸入命令:db.auth('sa','sa'),輸入結果0,使用者不存在,這下有人可能就不明白了,剛剛前面才建立,怎麼會不存在呢。原因在於:當我們單獨訪問MongoDB的資料庫時,需要許可權訪問的情況下,使用者名稱密碼並非超級管理員,而是該庫的system.user表中的使用者,注意,我這裡說的是單獨訪問的情況,什麼是不單獨訪問的情況呢。接下來再講,現在咋辦,沒許可權,那我們就嘗試給庫的system.user表中添加使用者

14. 輸入命令:db.addUser('test','111111'),哇靠,仍然提示沒有許可權,這可咋辦,新的資料庫使用超級管理員也無法訪問,建立使用者也沒有許可權,呵呵,別急,即然設定了超級管理使用者,那它就一定有許可權訪問所有的庫

15. 輸入命令:use admin

16. 輸入命令:db.auth('sa','sa')

17. 輸入命令:use TestDB

18. 輸入命令:show collections,哈哈,一路暢通無阻,我們發現可以利用超級管理使用者訪問其它庫了,呵呵,這個就是不單獨訪問的情況,不難發現,我們是先進入admin庫,再轉到其它庫來的,admin相當於是一個最進階別官員所在地區,如果你是個地產商,想在地方弄個大工程做做,你想不經過那些進階官員就做,這是行不通的,你需要先去到他們那裡,送點禮,再順著下到地方,工程你就可以拿到手了,此言論僅為個人觀點,不代表部落格園;即然工程拿到手了,就要開始建了,那我們不至於每加塊磚、添個瓦都得去和那幫進階官員打招呼吧,所以我們得讓這個工程合法化,咱們得把相關的手續和證件弄齊全,不至於是違建

19. 輸入命令:db.addUser('test','111111'),我們給TestDB庫添加一個使用者,以後每次訪問該庫,我都使用剛剛建立的這個使用者,我們先退出(ctrl+c)

20. 輸入命令:mongo TestDB

21. 輸入命令:show collections,提示沒有許可權

22. 輸入命令:db.auth('test','111111'),輸出結果1,使用者存在,驗證成功

23. 輸入命令:show collections,沒再提示我沒有許可權,恭喜您,成功了

好累啊。一口氣寫完,呵呵

註:當需要使用許可權才能訪問MongoDB時,如果需要查看MongoDB中所有的庫,我們只能通過超級管理員權限,輸入命令show dbs來查看了。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。。

1、導言

折騰mongodb幾個小時終於有結果了。呃。現在就簡單總結一下。

其實我的需求很簡單,就是在C++代碼中調用mongodb的庫函數,也就是要得到mongoclient.lib。本來想直接下載個,可在網上也沒找到,覺得重新編譯也不麻煩,於是就下了源碼編譯。可下錯了源碼,編了半天也編不出來,暈。

其實就是參考了網友們的文章,在這裡下載了源碼mongodb-src-r2.6.3.zip。編譯命令也很簡單,大家都說直接輸入:scons mongoclient.lib即可,可不斷彈出這樣的錯誤:

scons: *** Do not know how to make File target `mongoclient.lib' (C:\mongo-maste
r\mongoclient.lib). Stop.

結果不知道怎麼發現mongoclient.lib在新版本中不再是target了,已經移到了另一個源碼mongo-cxx-driver-legacy.zip中了,地址在這裡。不過,在mongo-src中,像mongo,mongod還是直接可以編譯成功的,貌似不需要boost庫


2、準備工作

2.1 下載安裝mongo-win32.msi

    為了節約時間,我就直接下載了相關exe檔案像mogo.exe,mogod.exe

2.2 依次安裝Python,scons,boost

    詳細資料可參考我給出的連結地址。我就強調一些我發現的:

    2.2.1 有人說mongoclient只連結boost靜態庫,我發現不是這樣,當指定--dynamic-windows,--sharedclient參數後,需要給出boost動態lib庫目錄,而非*-s.lib

    2.2.2 當未指定指定--dynamic-windows,--sharedclient參數時,貌似不用給出boost庫目錄,我也不太確定,反正我是沒給出像libboost_date_time-vc110-mt-s-1_53.lib等檔案的路徑


3、編譯mongoclient

從vs2012命令列中進入mongo-cxx-driver-legacy目錄,執行:

scons install-mongoclient --cpppath=boost標頭檔路徑

結果在build\install\lib直接產生libmongoclient-s.lib,128M

當然也可添入--dynamic-windows,--sharedclient,--dbg等參數,可產生對應的動態庫,包括調試版和發行版。詳細說明可看這裡。結果我的目錄裡有以下檔案:


說實話,我是真沒搞清楚這些檔案的區別,我已經淩亂了……


4、測試

我不得不說,這一步也走得真懸,竟有兩個重要步驟被我猜准了。。

本來代碼很簡單,就串連上mongod.exe進程開啟的伺服器就行,也不知道怎麼回事,網友們都沒有我說得那兩個步驟,莫非是新版本更新的問題,抑或我忽視了一些東西。

代碼如下:

[cpp] view plain copy print ? #include <iostream>   #include <cstdlib>   #include <winsock2.h>      #include "mongo\client\dbclient.h"      using namespace std;      void run()   {       mongo::DBClientConnection con;       con.connect("127.0.0.1:27017");   }      int main()   {       WSAData wsaData;       if(WSAStartup(MAKEWORD(1,1),&wsaData) != 0)       {           return -1;       }           try       {           run();           cout << "conn ok" << endl;       }       catch (const mongo::DBException &e)       {           cout << "caught " << e.what() << endl;       }       getchar();       return EXIT_SUCCESS;   }   在運行之前,不用說,肯定要添加boost和mongoclient的標頭檔和庫檔案。注意我添加的都是動態庫Lib路徑,應該是動態連結的,所以也需要將boost的dll路徑和mongoclient-gd.dll路徑添加進PATH中,且還要添加ws2_32.lib庫,至於boost庫和mongoclient庫可直接寫目錄而不用寫庫名,因為有自動連結機制。

下面就說我的兩個重大修改,只是相比於網友們的檔案:

1、在dbclient.h標頭檔之前添加winsock2.h,因為在vs2012中如果不加會報錯:"You must include the windows and windows sockets headers before dbclient.h"


2、在main函數開頭,我添加了WSAStartup的5行代碼,因為如果不添加,在某一個檔案中的getAddr調用會異常:"WSAStartup() failed"


不能說常規代碼錯了,只能說由於各種原因,在這種情況下需要這麼做才會編譯運行正常。

運行就簡單了,首先啟動mogod -dbpath d:\data,預設連接埠在27017,然後啟動上面的用戶端,輸出conn ok。Done !


5、參考網址


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.