天天看點

【Mongodb】使用者和認證 權限總結

   開啟MongoDB服務時不添加任何參數時,預設是沒有權限驗證的,登入的使用者可以對資料庫任意操作而且可以遠端通路資料庫!

   在剛安裝完畢的時候MongoDB都預設有一個admin資料庫,此時admin資料庫是空的,沒有記錄權限相關的資訊!當admin.system.users一個使用者都沒有時,即使mongod啟動時添加了--auth參數,如果沒有在admin資料庫中添加使用者,此時不進行任何認證還是可以做任何操作(不管是否是以--auth 參數啟動),直到在admin.system.users中添加了一個使用者。

需要注意的是:<b>admin.system.users中将會儲存比在其它資料庫中設定的使用者權限更大的使用者資訊,擁有超級權限,也就是說在admin中建立的使用者可以對mongodb中的其他資料庫資料進行操作。</b>

<b></b>

1 mongodb系統中,資料庫是由超級使用者來建立的,一個資料庫可以包含多個使用者,一個使用者隻能在一個資料庫下,不同資料庫中的使用者可以同名!

2 當admin.system.users一個使用者都沒有時,即使mongod啟動時添加了--auth參數,如果沒有在admin資料庫中添加使用者,此時不進行任何認證還是可以做任何操作(不管是否是以--auth 參數啟動),直到在admin.system.users中添加了一個使用者。

3 特定資料庫比如DB1下的使用者User1,不能夠通路其他資料庫DB2,但是可以通路本資料庫下其他使用者建立的資料!

4 不同資料庫中同名的使用者不能夠登入其他資料庫!比如DB1,DB2都有user1,以user1登入DB1後,不能夠登入到DB2進行資料庫操作!

5 在admin資料庫建立的使用者具有超級權限,可以對mongodb系統内的任何資料庫的資料對象進行操作!

下面通過實驗的方式程序驗證(可能不全面,歡迎大家指正):

1 第一次安裝monogdb時,admin資料庫中沒有任何使用者,此時不管是否以--auth方式啟動資料庫,其他資料庫(比如test資料庫)中的使用者都可以對另外的資料庫(比如db1資料庫)中的資料進行操作~!

a)以預設的方式啟動mongodb

[mongodb@rac3 bin]$ ./mongod  --dbpath=/opt/mongodata/data --port=27000

在另一個視窗進入mongodb shell,預設是直接進入test 資料庫的,并且此時使用者擁有超級權限,可以操作任何資料庫對象!

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000

MongoDB shell version: 2.0.1

connecting to: 127.0.0.1:27000/test

&gt; show dbs

local   (empty)

#檢視admin 資料庫中的使用者資訊,因為是剛建立的資料庫是以user 為空~!

&gt; use admin

switched to db admin

&gt; db.system.users.find() ;

#建立test資料庫,并建立對象yql,插入資料!

&gt; use test

switched to db test

&gt;

&gt; db.yql.insert({id:2,val:"yangql is learing monogdb master slave!"});

#建立db1資料庫,并建立對象db1_test,插入資料!

&gt; use db1

switched to db db1

&gt; db.db1_test.insert({id:1,val:"this data is in db1 !"});

&gt; db.db1_test.insert({id:2,val:"this data is in db1 !"});

&gt; db.db1_test.insert({id:3,val:"this data is in db1 !"});

#建立db2資料庫,并建立對象db2_test,插入資料!

&gt; use db2

switched to db db2

&gt; db.db2_test.insert({id:1,val:"this data is in db2!"});

&gt; db.db2_test.insert({id:2,val:"this data is in db2!"});

&gt; db.db2_test.insert({id:3,val:"this data is in db2!"});

&gt; db.db2_test.find();

{ "_id" : ObjectId("4f2bbcdf2a801e73e6493f31"), "id" : 1, "val" : "this data is in db2!" }

{ "_id" : ObjectId("4f2bbce52a801e73e6493f32"), "id" : 2, "val" : "this data is in db2!" }

{ "_id" : ObjectId("4f2bbce92a801e73e6493f33"), "id" : 3, "val" : "this data is in db2!" }

admin   (empty)

db1     0.203125GB

db2     0.203125GB

test    0.203125GB

#在test 資料庫中建立使用者yql,密碼為yql

&gt; db.addUser("yql","yql")

{ "n" : 0, "connectionId" : 1, "err" : null, "ok" : 1 }

{

        "user" : "yql",

        "readOnly" : false,

        "pwd" : "868ed7035435f33b60ebeba2f363ad91",

        "_id" : ObjectId("4f2bbed556f179b1ccc295d1")

}

&gt; db.auth("yql","yql") #驗證函數,驗證資料庫中是否存在對應的使用者

1

&gt; db.system.users.find();

{ "_id" : ObjectId("4f2bbed556f179b1ccc295d1"), "user" : "yql", "readOnly" : false, "pwd" : "868ed7035435f33b60ebeba2f363ad91" }

&gt; exit

bye

b)關閉mongod 服務,并以認證方式啟動資料庫

[mongodb@rac3 bin]$ ./mongod  --dbpath=/opt/mongodata/data --port=27000 --auth

再次登入,雖然在test中建立了使用者,但是沒有在admin 資料庫中建立使用者,是以以預設方式登入的使用者依然具有超級權限

&gt; db.db1_test.find();

{ "_id" : ObjectId("4f2bb3a42a801e73e6493f2b"), "id" : 1, "val" : "this data is in db1 !" }

{ "_id" : ObjectId("4f2bb3ae2a801e73e6493f2c"), "id" : 2, "val" : "this data is in db1 !" }

{ "_id" : ObjectId("4f2bb3b32a801e73e6493f2d"), "id" : 3, "val" : "this data is in db1 !" }

使用特定使用者登入資料庫,也可以通路其他的資料庫。下面的例子說明,test的使用者可以通路db1的資料

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000 -uyql -pyql

2 在admin.system.users中添加使用者之後,mongodb的認證,授權服務生效! 

#在admin 資料庫中建立使用者!supper 密碼為sup

&gt; db.addUser("supper", "sup")  

{ "n" : 0, "connectionId" : 4, "err" : null, "ok" : 1 }

        "user" : "supper",

        "pwd" : "51a481f72b8b8218df9fee50b3737c44",

        "_id" : ObjectId("4f2bc0d357a309043c6947a4")

&gt; db.auth("supper","sup")

[mongodb@rac3 bin]$

預設方式登入,即以無認證使用者登入,查詢的時候會顯示無權限!

error: {

        <b>"$err" : "unauthorized db:test lock type:-1 client:127.0.0.1",</b>

        "code" : 10057

&gt; show dbs 

Fri Feb  3 19:12:30 uncaught exception: listDatabases failed:{ "errmsg" : "need to login", "ok" : 0 }

在admin資料庫建立使用者後,使用認證方式登入,可進行對應資料庫的查詢操作且僅僅能夠查詢對應的資料庫中的資訊!不能夠查詢其他mongodb系統的其他資料庫資訊!

&gt; db.yql.find();

{ "_id" : ObjectId("4f2bb3662a801e73e6493f2a"), "id" : 2, "val" : "yangql is learing monogdb master slave!" }

&gt;查詢系統資料庫資訊時,報如下錯誤!

&gt; show dbs; 

Fri Feb  3 19:15:56 uncaught exception: listDatabases failed:{ "errmsg" : "need to login", "ok" : 0 }

#登入db1

#查詢的時候,會報錯,非授權使用者!

        "$err" : "unauthorized db:db1 lock type:-1 client:127.0.0.1",

&gt; db.db2_test.find()

        "$err" : "unauthorized db:db2 lock type:-1 client:127.0.0.1",

使用db1的使用者可以查詢db1的資料,但是不能檢視其他的資料庫的資料!

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/db1 -udb1 -pdb1

connecting to: 127.0.0.1:27000/db1

&gt; db.db1_test.find()

{ "_id" : ObjectId("4f2bc2d7b85653a70aa4fc50"), "user" : "db1", "readOnly" : false, "pwd" : "08a3bfa3cdef4464c4738a7180465adf" }

&gt; db.auth("db1","db1")

Fri Feb  3 19:21:08 uncaught exception: listDatabases failed:{ "errmsg" : "need to login", "ok" : 0 }

&gt; show collections

Fri Feb  3 19:21:24 uncaught exception: error: {

db1_test

system.indexes

system.users

<b>特定資料庫比如DB1下的使用者User1,是可以通路本資料庫下其他使用者建立的資料</b>

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/db2 -udb1 -pdb1

connecting to: 127.0.0.1:27000/db2

&gt; 

&gt; db.user_db1.insert({id:1,val:"this data is created by db1 in db2!"});

&gt; db.user_db1.insert({id:2,val:"this data is created by db1 in db2!"});

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/db2 -udb2 -pdb2

&gt; db.user_db1.find();

{ "_id" : ObjectId("4f2bd237c19753688c950aaf"), "id" : 1, "val" : "this data is created by db1 in db2!" }

{ "_id" : ObjectId("4f2bd23bc19753688c950ab0"), "id" : 2, "val" : "this data is created by db1 in db2!" }

&gt;  

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000 -usupper -psup

Fri Feb  3 19:16:55 uncaught exception: login failed

exception: login failed

3 使用supper 使用者登入!可以對mongodb系統内的所有資料庫進行查詢,DML操作!

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/admin  -usupper -psup

connecting to: 127.0.0.1:27000/admin

admin   0.203125GB

&gt; db.yql.remove();###删除資料###

&gt; db.addUser("db1", "db1")  

{ "n" : 0, "connectionId" : 9, "err" : null, "ok" : 1 }

        "user" : "db1",

        "pwd" : "08a3bfa3cdef4464c4738a7180465adf",

        "_id" : ObjectId("4f2bc2d7b85653a70aa4fc50")

4 不同資料庫中的使用者可以同名,不同資料庫中同名的使用者依然不登入其他資料庫!比如DB1,DB2都有user1,以user1登入DB1後,不能夠登入到DB2進行資料庫操作!

在不同資料庫中建立相同的使用者,進行測試!

測試場景:在test,db2資料庫中建立使用者db1,密碼db1

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/admin  -usupper -ppwd2

{ "n" : 0, "connectionId" : 17, "err" : null, "ok" : 1 }

        "_id" : ObjectId("4f2bccb3e39cb674302ce2dd")

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000 -uyql -ppwd1

{ "n" : 0, "connectionId" : 19, "err" : null, "ok" : 1 }

        "_id" : ObjectId("4f2bcce9b5accbdac9e71a93")

[mongodb@rac3 bin]$ 

使用使用者db1登入db2資料庫,然後嘗試登入db1,并進行查詢測試,報錯顯示未授權!

某個資料庫中對應的使用者隻能對本資料庫進行操作,而不能操作其他資料庫,包括查詢和建立其他資料庫!

[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27000/db1 -udb1 -pdb1       

&gt; use db3

switched to db db3

&gt; db.db3_test.insert({id:1,val:"this data is in db3!"});

unauthorized

&gt; db.db3_test.insert({id:2,val:"this data is in db3!"});

&gt; db.db3_test.find();

        "$err" : "unauthorized db:db3 lock type:-1 client:127.0.0.1",

<b>使用db.auth()可以對資料庫中的使用者進行驗證,如果驗證成功則傳回1,否則傳回0!</b>

<b>db.auth()</b><b> 隻能針對登入使用者所屬的資料庫的使用者資訊進行驗證,不能驗證其他資料庫的使用者資訊,因為通路不了其他資料庫(有點小白的解釋)</b>

&gt; db.auth("yql","pwd")

------------------------------EOF-----------------------------