>[danger] **棄用提醒:**
> *由于看云對于免費用戶的限制愈發嚴苛,本文檔已經遷移至語雀。本文檔將不做維護。*
> **語雀地址**:[https://www.yuque.com/a632079/nodebb](https://www.yuque.com/a632079/nodebb)
*****
[TOC]
# MogoDB 基礎運維知識
## 3.0版本以前
在mongodb3.0版本以前中,有一個admin數據庫, 牽涉到服務器配置層面的操作,需要先切換到admin數據庫.即 use admin , 相當于進入超級用戶管理模式,mongo的用戶是以數據庫為單位來建立的, 每個數據庫有自己的管理員.我們在設置用戶時,需要先在admin數據庫下建立管理員---這個管理員登陸后,相當于超級管理員.
```
命令:db.addUser();
簡單參數: db.addUser(用戶名,密碼,是否只讀)
```
注意: 添加用戶后,我們再次退出并登陸,發現依然可以直接讀數據庫?
原因: mongodb服務器啟動時, 默認不是需要認證的.
要讓用戶生效, 需要啟動服務器時,就指定 `--auth` 選項.這樣, 操作時,就需要認證了.
```
# 添加用戶
> use admin
> db.addUser('admin','admin',false); # 3.0版本更改為createUser();
# 刪除用戶
> use test
> db.removeUser(用戶名); # 3.0版本更改為dropUser();
```
## 3.0版本以后
### 創建管理員
在3.0版本以后,mongodb默認是沒有admin這個數據庫的,并且創建管理員不再用 `addUser `,而用 `createUser`;
#### 語法說明
```
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> }, # 任意的數據,一般是用于描述用戶管理員的信息
roles: [
{ role: "<role>", db: "<database>" } | "<role>", # 如果是role就是直接指定了角色,并作用于當前的數據庫
...
] # roles是必傳項,但是可以指定空數組,為空就是不指定任何權限
}
```
Built-In Roles([內置角色](http://docs.mongodb.org/manual/reference/built-in-roles/#built-in-roles)):
* 數據庫用戶角色:read、readWrite;
* 數據庫管理角色:dbAdmin、dbOwner、userAdmin;
* 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
* 備份恢復角色:backup、restore;
* 所有數據庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
* 超級用戶角色:root
* 這里還有幾個角色間接或直接提供了系統超級用戶的訪問(dbOwner 、userAdmin、userAdminAnyDatabase)
* 內部角色:__system
PS:關于每個角色所擁有的操作權限可以點擊上面的內置角色鏈接查看詳情。
##### 官方Example
```
> use products # mongoDB的權限設置是以庫為單位的,必選要先選擇庫
> db.createUser(
{ "user" : "accountAdmin01",
"pwd": "cleartext password",
"customData" : { employeeId: 12345 },
"roles" : [ { role: "clusterAdmin", db: "admin" },
{ role: "readAnyDatabase", db: "admin" },
"readWrite"
] },
{ w: "majority" , wtimeout: 5000 } ) # readWrite 適用于products庫,clusterAdmin與readAnyDatabase角色適用于admin庫
```
writeConcern文檔([官方說明](http://docs.mongodb.org/manual/reference/write-concern/))
* w選項:允許的值分別是 1、0、大于1的值、"majority"、\<tag set>;
* j選項:確保mongod實例寫數據到磁盤上的journal(日志),這可以確保mongd以外關閉不會丟失數據。設置true啟用。
* wtimeout:指定一個時間限制,以毫秒為單位。wtimeout只適用于w值大于1。
```
> use shop;
> db.createUser({
user:'admin',
pwd:'zhouzhou123',
roles:['dbOwner']
})
```
> 只要新加了一個用戶,admin數據庫就會重新存在;
```
$ mongo --host xxx -u admin -p zhouzhou123 --authenticationDatabase shop # 用新創建的用戶登錄
```
在 Mongo 中的操作:
```
# 查看當前用戶在shop數據庫的權限
> use shop;
> db.runCommand(
{
usersInfo:"shopzhouzhou",
showPrivileges:true
}
)
# 查看用戶信息
> db.runCommand({usersInfo:"userName"})
# 創建一個不受訪問限制的超級用戶
> use admin
> db.createUser(
{
user:"superuser",
pwd:"pwd",
roles:["root"]
}
)
```
### 認證用戶
```
> use test
> db.auth(用戶名,密碼); #注意是以庫為單位,必須先選擇庫;
```
### 刪除用戶
```
# 刪除用戶
> use test
> db.dropUser('用戶名');
```
### 修改用戶密碼
```
> use test
> db.changeUserPassword(用戶名, 新密碼);
# 修改密碼和用戶信息
db.runCommand(
{
updateUser:"username",
pwd:"xxx",
customData:{title:"xxx"}
}
)
```
## 權限規則
參考: http://blog.csdn.net/kk185800961/article/details/45619863
> 以上內容摘自: [【mongoDB運維篇①】用戶管理](https://segmentfault.com/a/1190000004263255#articleHeader0)
# NodeBB 中所需要的 MongoDB 操作
## 對于現代版本的MongoDB (3.0之后)
進入 MongoDB
```
$ mongo
```
新建一個數據庫管理員吧(相當于Root):
```
> use admin
> db.createUser( { "user" : "替換成你想要的管理員賬戶", "pwd": "替換成你的管理員賬戶密碼", "customData" : { employeeId: 12345 }, "roles" : [ { role: "clusterAdmin", db: "admin" },{ role: "readAnyDatabase", db: "admin" },"readWrite" ] },{ w: "majority" , wtimeout: 5000 } );
```
添加一個名為 nodebb 的數據庫 并 新建一個用戶賦予給它讀寫此庫的權限:
```
> use nodebb
> db.createUser( { user: "nodebb", pwd: "替換成你的密碼", roles: [ "readWrite" ] } )
```
如果要在NodeBB的管理控制面板(高級→數據庫)中查看數據庫統計信息,請鍵入以下命令:
```
> db.grantRolesToUser("nodebb",[{ role: "clusterMonitor", db: "admin" }]);
```
如果不輸入命令,則會在嘗試查看數據庫統計信息時收到此錯誤消息:
```
Internal Error.
Oops! Looks like something went wrong!
/api/admin/advanced/database
not authorized on nodebb to execute command { serverStatus: 1 }
```
## 對于早期版本的MongoDB (3.0之前)
```
$ mongo
```
在 MongoDB 中輸入:
```
> use admin
> db.addUser("替換成你想要的管理員賬戶","替換成你的管理員賬戶密碼",false);
> use nodebb
> db.addUser( { user: "nodebb", pwd: "替換成你的密碼", roles: [ "readWrite" ] } );
```
## 使 MongoDB 啟用權限認證
修改 `/etc/mongodb.conf`
```
$ vim /etc/mongodb.conf
```
### 對于 2.6.x
取消注釋 : `auth = true`。
### 對于3.x
取消注釋 `security: `并在其下方添加: `authorization: enabled`(不要忘記在第二行之前放置兩個空格)。它應該是這樣的:
```
security:
authorization: enabled
```
### 重新啟動 Mongodb
```
$ service mongod restart
```
>[info] 編寫: PA Team & NodeBB Development
維護: a632079
審核: PA Team
最后更新: 2017.08.07
- 序
- 贊助
- 導言
- 安裝
- 通過操作系統
- Windows + Mongodb/Redis
- Ubuntu/Debian + Redis/Mongodb
- CentOS + Redis
- CentOS + Mongodb
- FreeBSD/OpenBSD + Redis
- Arch Linux + Redis
- OSX + Redis
- 通過云服務
- 通過主機面板安裝
- AppNode
- CPanel
- 寶塔
- 使用
- FAQ
- 高級
- 運行 NodeBB
- 配置 Config.json
- 配置 Nginx
- 配置 MongoDB
- 更新 NodeBB
- 設置 Widgets
- 安裝 Yarn
- 更新 MongoDB
- 數據庫備份與恢復
- 重置管理員密碼
- 讓 NodeBB 支持搜索
- 優化
- 優化配置,提升NodeBB處理能力
- Google字體庫 -> 360公共前端庫
- Google字體庫 -> 中科大鏡像
- 海外VPS提升NodeBB訪問速度
- 通過 NodeBB API 自動發帖
- 開發
- 準備
- 常用方法 & 變量
- 插件制作
- 使用工具包編寫一個插件
- 主題制作
- 使用工具包編寫一個主題
- 部件制作
- 國際化
- 鉤子(hook)使用說明