MongoDB初探系列之三:MongoDB使用者權限操作,mongodb初探
經過初探一的配置和初探二的基本瞭解,下面將在初探三中介紹一下MongoDB的使用者權限操作。
一點點簡介:
和其他所有資料庫一樣,許可權的管理都差不多一樣。mongodb儲存所有的使用者資訊在admin 資料庫的集合system.users中,儲存使用者名稱、密碼和資料庫資訊。mongodb預設不啟用授權認證,只要能串連到該伺服器,就可串連到mongod。若要啟用安全認證,需要更改設定檔參數auth。
1.查看當前MongoDB下面都已經存在了哪些資料庫
show dbs
顯示結果如下:
由於我本地已經存在了admin庫,因此可以直接學習下面的內容。如果各位小夥伴安裝好MongoDB後沒有
發現admin庫,那麼可以使用下面的命令來建立admin庫並建立一個admin使用者,後續我們會用到。
use admin db.createUser( { user: "admin", pwd: "admin", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
2、進入admin庫,我們來查看一下它都包含哪些東西
進入後我們發現他包含索引,使用者和版本號碼三個集合。
3、分別執行集合的find命令,來查看一下這三個集合裡面的資料。【註:這裡的集合相當於我們平時用的資料庫的表】
> db.system.users.find();{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "DDWOrIFkjoeF7mFGNOgsMA==", "storedKey" : "Q7JLL0AziNLBtngVJYglQ+lZRvE=", "serverKey" : "qRC3s0HCrmIw2My5s0zAmHQUzvM=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ]}> db.system.indexes.find();{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "admin.system.version" }{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "admin.system.users" }{ "v" : 1, "unique" : true, "key" : { "user" : 1, "db" : 1 }, "name" : "user_1_db_1", "ns" : "admin.system.users" }> db.system.version.find();{ "_id" : "authSchema", "currentVersion" : 5 }
4、現在啟用 auth
編輯我們在初探一中的寫的設定檔mongo.config,然後在最下面加入這麼一行。
auth=true
現在我們來重啟Mongod服務,此時我們會發現我們沒有許可權訪問了,如所示:
剛才在admin庫中建立了一個賬戶 admin ,先來串連admin庫(其他db則失敗):
> db.auth("admin","admin");Error: 18 Authentication failed.0> use admin;switched to db admin> db.auth("admin","admin");1
0:代表授權失敗 1:代表授權成功
為了驗證沒有授權不能查看對應的集合,我們將庫切換至test庫,然後執行show collections 命令,結果如下。
事實證明開啟了許可權認證以後,則必須擁有授權才能訪問對應庫的相應集合。
> use testswitched to db test> show collections;2015-07-19T15:51:59.069+0800 E QUERY Error: listCollections failed: { "ok" : 0, "errmsg" : "not authorized on test to execute command { listCollections: 1.0 }", "code" : 13} at Error (<anonymous>) at DB._getCollectionInfosCommand (src/mongo/shell/db.js:646:15) at DB.getCollectionInfos (src/mongo/shell/db.js:658:20) at DB.getCollectionNames (src/mongo/shell/db.js:669:17) at shellHelper.show (src/mongo/shell/utils.js:625:12) at shellHelper (src/mongo/shell/utils.js:524:36) at (shellhelp2):1:1 at src/mongo/shell/db.js:646
5、對於建立的相關使用者進行角色授權
角色授權分兩種,一種是直接在當前庫中建立使用者並授予相關許可權。如admin庫中建立admin使用者。另一種情況是
將在admin中建立的使用者授予操作其他庫的許可權,相關授權命令如下:
#授予角色:db.grantRolesToUser( "userName" , [ { role: "<role>", db: "<database>" } ]) #取消角色:db.grantRolesToUser( "userName" , [ { role: "<role>", db: "<database>" } ])
下面我們在admin庫中執行以下命令:
db.grantRolesToUser( "admin" , [ { role: "dbOwner", db: "test" } ]) ;
然後我們切換到test庫,我們驚奇的發現此時admin使用者也能執行show collections 命令了。
注意:
通過db.auth("admin","admin") 命令登陸,只能登陸包含這個使用者的庫。但是成功登陸之後,如果目前使用者擁有
訪問其他庫的許可權,可以直接切換到對應的庫,執行相關的資料操作命令。
因此,為了方便起見,還是建議每個庫在建立的時候,直接在當前庫中建立好使用的使用者,這樣就不用來回切換了。
6、建立自訂角色,並對角色進行授權
#建立角色並授權db.createRole({ role: "testRole", privileges: [{ resource: { db: "mydb", collection: "" }, actions: [ "find" ] }], roles: [] }) #添加Privileges給角色 db.grantPrivilegesToRole("testRole", [{ resource: { db: "mydb", collection: "" },actions: [ "update", "insert", "remove" ]} ])
#更改角色 roles,把roles值全部更新。同樣Privileges也可以更新替換db.updateRole("testRole",{ roles:[{ role: "readWrite",db: "mydb"}]},{ w:"majority" })
關於角色,參考官方文檔提取總結如下:
角色分類 |
角色 |
許可權及角色 (本文大小寫可能有些變化,使用時請參考官方文檔) |
Database User Roles |
read |
CollStats,dbHash,dbStats,find,killCursors,listIndexes,listCollections |
readWrite |
CollStats,ConvertToCapped,CreateCollection,DbHash,DbStats, DropCollection,CreateIndex,DropIndex,Emptycapped,Find, Insert,KillCursors,ListIndexes,ListCollections,Remove, RenameCollectionSameDB,update |
Database Administration Roles |
dbAdmin |
collStats,dbHash,dbStats,find,killCursors,listIndexes,listCollections, dropCollection 和 createCollection 在 system.profile |
dbOwner |
角色:readWrite, dbAdmin,userAdmin |
userAdmin |
ChangeCustomData,ChangePassword,CreateRole,CreateUser, DropRole,DropUser,GrantRole,RevokeRole,ViewRole,viewUser |
Cluster Administration Roles |
clusterAdmin |
角色:clusterManager, clusterMonitor, hostManager |
clusterManager |
AddShard,ApplicationMessage,CleanupOrphaned,FlushRouterConfig, ListShards,RemoveShard,ReplSetConfigure,ReplSetGetStatus, ReplSetStateChange,Resync, EnableSharding,MoveChunk,SplitChunk,splitVector |
clusterMonitor |
connPoolStats,cursorInfo,getCmdLineOpts,getLog,getParameter, getShardMap,hostInfo,inprog,listDatabases,listShards,netstat, replSetGetStatus,serverStatus,shardingState,top collStats,dbStats,getShardVersion |
hostManager |
applicationMessage,closeAllDatabases,connPoolSync,cpuProfiler, diagLogging,flushRouterConfig,fsync,invalidateUserCache,killop, logRotate,resync,setParameter,shutdown,touch,unlock |
Backup and Restoration Roles |
backup |
提供在admin資料庫mms.backup文檔中insert,update許可權 列出所有資料庫:listDatabases 列出所有集合索引:listIndexes 對以下提供查詢操作:find *非系統集合 *系統集合:system.indexes, system.namespaces, system.js *集合:admin.system.users 和 admin.system.roles |
restore |
非系統集合、system.js,admin.system.users 和 admin.system.roles 及2.6 版本的system.users提供以下許可權: collMod,createCollection,createIndex,dropCollection,insert 列出所有資料庫:listDatabases system.users :find,remove,update |
All-Database Roles |
readAnyDatabase |
提供所有資料庫中唯讀許可權:read 列出叢集所有資料庫:listDatabases |
readWriteAnyDatabase |
提供所有資料庫讀寫權限:readWrite 列出叢集所有資料庫:listDatabases |
userAdminAnyDatabase |
提供所有使用者資料管理許可權:userAdmin Cluster:authSchemaUpgrade,invalidateUserCache,listDatabases admin.system.users和admin.system.roles: collStats,dbHash,dbStats,find,killCursors,planCacheRead createIndex,dropIndex |
dbAdminAnyDatabase |
提供所有資料庫管理員許可權:dbAdmin 列出叢集所有資料庫:listDatabases |
Superuser Roles |
root |
角色:dbOwner,userAdmin,userAdminAnyDatabase readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase,clusterAdmin |
Internal Role |
__system |
叢集中對任何資料庫採取任何操作 |
OK ,至此簡單的許可權操作已經介紹完畢。初探四中將介紹一下MongoDB與JDBC的聯合使用。
著作權聲明:轉載請註明博文地址,尊重作者勞動成果。歡迎關注http://blog.csdn.net/zgs_shmily,一起成長。