1. 程式人生 > >MongoDB身份驗證--命令列模式

MongoDB身份驗證--命令列模式

摘要
MongoDB3.x與之前的版本有很大區別,這裡簡單介紹一下使用者身份驗證相關內容。

1. 瞭解3.x版本新增使用者的函式
函式:

db.createUser(user,writeConcern);

引數:
user這個文件關於使用者身份認證和訪問的相關資訊;
writeConcern這個文件描述mongoDB提供寫操作的相關資訊。

user 文件提供的格式:
{ user: “”,
pwd: “”,
customData: { },
roles: [
{ role: “”, db: “” } | “”,

]

user 文件欄位介紹:
user:使用者名稱
pwd:密碼
roles:指定使用者的角色,可以用一個空陣列給新使用者設定空角色;
在roles欄位,可以指定內建角色和使用者定義的角色。

role裡的角色可以選:

Built-In Roles(內建角色):
1. 資料庫使用者角色:read、readWrite;
2. 資料庫管理角色:dbAdmin、dbOwner、userAdmin;
3. 叢集管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 備份恢復角色:backup、restore;
5. 所有資料庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超級使用者角色:root
// 這裡還有幾個角色間接或直接提供了系統超級使用者的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 內部角色:__system

角色釋義:

Read:允許使用者讀取指定資料庫
readWrite:允許使用者讀寫指定資料庫
dbAdmin:允許使用者在指定資料庫中執行管理函式,如索引建立、刪除,檢視統計或訪問system.profile
userAdmin:允許使用者向system.users集合寫入,可以找指定資料庫裡建立、刪除和管理使用者
clusterAdmin:只在admin資料庫中可用,賦予使用者所有分片和複製集相關函式的管理許可權。
readAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀許可權
readWriteAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的讀寫許可權
userAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的userAdmin許可權
dbAdminAnyDatabase:只在admin資料庫中可用,賦予使用者所有資料庫的dbAdmin許可權。
root:只在admin資料庫中可用。超級賬號,超級許可權

2.新增使用者

在安裝MongoDB完成後,啟動未啟用安全檢查的MongoDB服務,進入檢視資料庫,只有一個local庫,admin庫是不存在的。
現在建立一個擁有授權許可權的帳號,su,這裡注意一下在哪個庫下建立的使用者必須要在那個庫下去驗證(auth)。
MongoDB shell version: 3.2.3
connecting to: test
> use admin
switched to db admin
> db.createUser({user:"su",pwd:"su", roles: [{ role: "userAdminAnyDatabase", db: "admin" }]});
Successfully added user: {
        "user" : "su",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}

上面建立一個擁有 userAdminAnyDatabase 角色,用來管理使用者的使用者,可以通過這個角色來建立、刪除使用者。驗證時需要重新啟動MongoDB服務,加上–auth引數。

>mongod --auth                                                                ## 重啟MongoDB服務

重新登入:

MongoDB shell version: 3.2.3
connecting to: test
> show dbs;                                                                   ## 這裡因為沒有驗證,導致訪問失敗
2016-04-27T14:34:44.573+0800 E QUERY    [thread1] Error: listDatabases failed:{
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
        "code" : 13
} :
_get[email protected]/mongo/shell/utils.js:23:13
[email protected]/mongo/shell/mongo.js:53:1
[email protected]/mongo/shell/utils.js:700:19
[email protected]/mongo/shell/utils.js:594:15
@(shellhelp2):1:1

>

因為在admin建立的使用者,在test下驗證所以失敗了

MongoDB shell version: 3.2.3
connecting to: test
> db.auth("su","su");                                                          ## 並不是在test中建立的使用者
Error: Authentication failed.
0
> use admin                                                                    ## 切換到admin
switched to db admin
> db.auth("su","su");
1                                                                              ## 驗證成功
>
>
> use test                                                                     ## 在test下建立使用者
switched to db test
> db.createUser({user:"mengximengxi",pwd:"mengximengxi", roles: ["read"]});    ## 只讀
Successfully added user: { "user" : "mengximengxi", "roles" : [ "read" ] }     ## 預設為當前的資料庫
> db.createUser({user:"mxmx",pwd:"mxmx", roles: ["readWrite"]});               ## 讀寫
Successfully added user: { "user" : "mxmx", "roles" : [ "readWrite" ] }

3.驗證

> use admin
switched to db admin
> db.auth("su","su");
1
> db.test.find();                                                    ## 檢視失敗,userAdminAnyDatabase 只是針對使用者的管理許可權,並沒有對資料的操作許可權
Error: error: {
        "ok" : 0,
        "errmsg" : "not authorized on admin to execute command { find: \"test\", filter: {} }",
        "code" : 13
}
> db.auth("mengximengxi","mengximengxi");
1
> db.test.insert({name:"zhaoxiaoliu"});                                  ## 只讀的,不能進行寫入操作
WriteResult({
        "writeError" : {
                "code" : 13,
                "errmsg" : "not authorized on test to execute command { insert: \"test\", documents: [ { _id: ObjectId('5720636a26c1f39ce9a7a9bd'), name: \"zhao
xiaoliu\" } ], ordered: true }"
        }
})

> db.auth("mxmx","mxmx");                                                ## 可以進行寫操作
1
> db.test.insert({name:"zhaoxiaoliu"});
WriteResult({ "nInserted" : 1 })
>

只有擁有root許可權才既有授權許可權,又有對集合操作的許可權。

> db.createUser({user:"root",pwd:"root", roles: [{role:"root",db:"admin"}]});      ## 建立擁有超級許可權的使用者
Successfully added user: {
        "user" : "root",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}
> db.test.insert({name:"tianxiaoqi"});                                             ## 寫
WriteResult({ "nInserted" : 1 })> db.createUser({user:"test_user",pwd:"mxmx", roles: ["readWrite"]}); 
Successfully added user: { "user" : "test_user", "roles" : [ "readWrite" ] }       ## 新增使用者

4.注意

1.可以在當前資料庫下去建立其他資料庫的使用者帳號,但是該帳號只能在當前資料庫下才能驗證通過,然後才能去操作對應的資料庫;
2.安全檢查未開啟的情況下,在其他的資料庫建立對應的使用者也是可以的。

相關推薦

MongoDB身份驗證--命令模式

摘要 MongoDB3.x與之前的版本有很大區別,這裡簡單介紹一下使用者身份驗證相關內容。 1. 瞭解3.x版本新增使用者的函式 函式: db.createUser(user,writeConcern); 引數: user這個文件關於使用者身

php命令模式相關引數說明

composer使用記憶體超出,使用php -d可以臨時設定php.ini中變數。感覺挺有意思,到伺服器上找了具體的引數和說明。 供大家參考 Usage: php [options] [-f] <file> [--] [args...] php [opt

Python 基礎學習之命令模式與互動模式的區別

命令列模式:即在win10搜尋框中,直接跳出來的頁面。在此模式下,可以通過執行程式碼"python .py"執行.py檔案。需要注意的是,在此模式下,如果要執行的程式碼檔案不在當前目錄,需要使用cd進行切換,假設我的py檔案在E:\python\demo,那麼需要執行的程式碼指令是“cd /

[uboot] (第六章)uboot流程——命令模式以及命令處理介紹

轉自https://blog.csdn.net/ooonebook/article/details/53164198   以下例子都以project X專案tiny210(s5pv210平臺,armv7架構)為例 [uboot] uboot流程系列: [project

2018年10月4日命令模式和python互動模式的區別以及如何關注CSDN好友

命令列模式和Python互動模式: 命令列模式就是win的shell終端,它的提示符類似C:\>,可以直接python xxx.py執行python檔案,py檔案中如果沒有Input等語句用於暫停,或者print語句輸出結果的話會直接把檔案執行完,看不到執行結果。而互動模式下每一行就是一個

Linux系統遠端連線伺服器命令模式

對於很多新手來說,如何用Windows遠端Linux作業系統,是個前進的大問題。如果這個問題前進不了,其他更別說了。 Linux或Max OS X系統電腦,登入步驟為 1.開啟ssh客戶端 2.使用者名稱:root 3.伺服器: 輸入伺服器的IP 埠預設為22 4.輸入伺服器密碼

設計模式 命令模式

class TeaMilk: def __init__(self): pass def prepare(self): pass class Recevier: def __init__(self): pass def pr

命令模式Command

完整設計模式目錄見:https://blog.csdn.net/u013523089/article/details/82852049 命令列模式:將指令抽象成物件,執行這個命令時,對應命令的執行發放可以執行有哪個人來實際工作 比如:現有程式碼組,需求組,現在有個bug來要加一段程式

[樹莓派]刪除桌面,只保留命令模式

https://raspberrypi.stackexchange.com/questions/4745/how-to-uninstall-x-server-and-desktop-manager-when-running-as-headless-server sudo apt-ge

Smplayer命令模式下的用法

用法: smplayer [-minigui] [-defaultgui] [-mpcgui] [-config-path 目錄] [-send-action 動作名稱] [-actions 動作列表] [-close-at-end] [-no-close-at-end] [-fullscreen]

去掉ubuntu命令模式提示聲

  安裝ubuntu18.04後,用xshell連線後,按Tab鍵總是有提示聲很煩。 修改/etc/inputrc 去掉 #set bell-style none 的 # ,儲存,重啟。 這個方法終端中的提示聲可以去掉。 修改成下面的配置 vi、vim裡的

Linux在命令模式下執行命令

Linux系統登入環境 在Linux預設的登入的模式中,主要分為兩種,一種是純文字介面的登入環境,另一種則是圖形介面的登入環境。 ●Linux預設提供6個終端介面來讓使用者登入,切換的方式為:[Ctrl]+[Alt]+[F1]~[F6]。系統會按[F1]~[

Linux(CentOS 7)命令模式安裝VMware Tools 詳解

本篇文章主要介紹瞭如何在Linux(CentOS 7)命令列模式安裝VMware Tools,具有一定的參考價值,感興趣的小夥伴們可以參考一下。 本例中為在Linux(以CentOS 7為例)安裝VMware Tools。 1.首先啟動CentOS 7,在

ubuntu16.04 啟動命令模式

轉自:https://blog.csdn.net/jun2016425/article/details/53100963  步驟如下: sudo vi /etc/default/grub 註釋掉 GRUB_CMDLINE_LINUX_DEFAULT=”quiet

ubuntu16.04桌面版開機進入命令模式

       我們大部分個人的linux系統計算機都是使用圖形介面模式的操作,有些時候我們也可以在純命令列模式下進行操作,這裡給大家介紹一個在開機啟動的時候進入命令列的兩種方法。 原料:ubuntu 16.04LTS系統 工具: 電腦 注意事項:         我們

ubuntu16.04命令模式下自動列印^@解決辦法

        筆記本型號為神舟Z7-KP7GT,顯示卡為GTX1060,在更換ubuntu系統驅動時進入命令列模式後,系統會一直自動列印^@字元到控制檯,個人猜想應該是筆記本鍵盤的驅動與ubuntu系統自帶的驅動有所衝突,但無法關閉圖形介面導致無法更換驅動。經百度後,發現可

Git的安裝和簡單使用(命令模式+圖形化模式

  剛開始用git的小白適用,參考連結:http://www.cnblogs.com/qijunjun/p/7137207.html  實際專案開發中,我們經常會用一些版本控制器來託管自己的程式碼,今天就來總結下Git的相關用法,廢話不多說,直接開寫。   目的:通過Git管理GitHub上託管的專

使用命令模式啟動VMWare虛擬機器

轉自:http://blog.csdn.net/deepnight2005/article/details/8842968 工作中使用到在centos中安裝vmware Workstation部署虛擬機器,以前都是使用圖形介面啟動虛擬機器,由此要調整VNC的解析度大小

Linux下Mongodb安裝,命令操作和sql語句

--logappend --port=27017 --fork 5. 引數解釋: --dbpath 資料庫路徑(資料檔案)--logpath 日誌檔案路徑--master 指定為主機器--slave 指定為從機器--source 指定主機器的IP地址--pologSize 指定日誌檔案大小不超過64M.因為

mysql命令模式匯入sql檔案

連線mysql mysql -u root -p 檢視所有資料庫 show databases; 選擇資料庫 use 資料庫名; 匯入sql檔案 source sql檔案路徑;