Q: 數據庫明明有值,雲函數查詢結果卻為空
A: 集合權限規則可能未修改:雲開發 -> 數據庫 -> 數據權限 -> 自定義規則
權限規則不匹配、數據庫讀請求數限額都會導致返回空數據

微信開發者文檔 -> 數據庫安全規則
數據庫安全規則
安全規則是一個讓開發者可以靈活地自定義前端數據庫讀寫權限的能力,通過配置安全規則,開發者可以精細化的控制集合中所有記錄的讀、寫權限,自動拒絕不符合安全規則的前端數據庫請求,保障數據安全。使用安全規則,你將獲得以下能力:
- 靈活自定義集合記錄的讀寫權限:獲得比基礎的四種基礎權限設置更靈活、強大的讀寫權限控制,讓讀寫權限控制不再強制依賴於
_openid字段和用戶openid - 防止越權訪問和越權更新:用戶只能獲取通過安全規則限制的用戶所能獲取的內容,越權獲取數據將被拒絕
- 限制新建數據的內容:讓新建數據必須符合規則,如可以要求權限標記字段必須為用戶
openid
同時隨着安全規則的開放,前端批量更新(where.update、where.remove)也隨之開放(基礎庫 2.9.4 起),開發者在進行批量更新時應搭配安全規則使用以保障數據安全。
簡介
安全規則要求前端發起的查詢條件必須是安全規則的子集,否則拒絕訪問。比如定義一個讀寫訪問規則是 auth.openid == doc._openid,則表示訪問時的查詢條件(doc)的 openid 必須等於當前用戶的 openid (由系統賦值的不可篡改的 auth.openid 給出),如果查詢條件沒有包含這項,則表示嘗試越權訪問 _openid 字段不等於自身的記錄,會被后台拒絕訪問。
與基礎權限配置的對比
除了安全規則外,雲開發數據庫提供了四種基礎權限配置,適用於簡單的前端訪問控制,只支持 4 種預設的規則(對集合中的每條數據記錄):
- 所有用戶可讀,僅創建者可寫
- 僅創建者可讀寫
- 所有用戶可讀
- 所有用戶不可讀寫
但基礎的設置給前端的訪問權限控制是有一定局限性、同時會帶來一些容易疑惑的、需要深入理解的系統默認行為:
- 訪問權限控制要求只能基於記錄的
_openid字段和用戶的openid,控制粒度較粗、相對不靈活 - 當權限為 "僅創建者可讀寫" 時,查詢時會默認給查詢條件加上一條
_openid必須等於用戶openid - 當權限為 "僅創建者可讀寫" 或 "所有用戶可讀,僅創建者可寫" 時,更新前會默認先帶上
_openid必須等於用戶openid的查詢條件,再將查詢到的結果進行更新,即使是用doc.update也是如此(因此我們會見到即使我們沒有對應_id的記錄的訪問權限,但是更新操作不會失敗,只會在返回的結果中說明updated更新的記錄數量為 0)。 - 創建記錄時,會自動給記錄加上
_openid字段,值等於用戶openid,並且不允許用戶在創建記錄時嘗試設置_openid - 更新記錄時,不允許修改
_openid
因此,我們建議開發者使用新推出的數據庫安全規則取代基礎權限配置,可以讓數據庫訪問的行為更加明確,同時取消需要深入理解的系統默認行為,讓數據庫權限控制更加簡單明確。
新的安全規則與舊的四種基礎權限配置的對應關系如下,我們在此先給出樣例,下方再給出具體的安全規則使用指南:
新自定義安全規則與舊權限配置的對應關系
所有用戶可讀,僅創建者可寫
{ "read": true, "write": "doc._openid == auth.openid" }
僅創建者可讀寫
{ "read": "doc._openid == auth.openid", "write": "doc._openid == auth.openid" }
所有用戶可讀
{ "read": true, "write": false }
所有用戶不可讀寫
{ "read": false, "write": false }
規則編寫
我們可以在控制台對各個集合分別配置安全規則,入口在集合權限配置頁,在基礎的四種權限配置外還提供了 “自定義規則” 的選項。
每個集合都有獨立的安全規則配置,配置的格式為 json,比如如下一個在某集合上的安全規則配置:
{ "read": "true", "write": "auth.openid === doc._openid" }
這配置其實就對應着已有的 "所有用戶可讀,僅創建者可寫" 這一權限配置。配置的 key 表示操作類型,value 是一個表達式,表示需要滿足什么條件才允許相應的操作類型。當表達式解析為 true 時即代表相應類型的操作符合安全規則。
操作類型
支持配置的操作類型如下:
| 操作類型 | 說明 | 默認值 |
|---|---|---|
| read | 讀 | false |
| write | 寫,可以細分為 create、update、delete | false |
| create | 新建 | 無 |
| update | 更新 | 無 |
| delete | 刪除 | 無 |
規則表達式
規則表達式是類 js 的表達式,支持部分表達式,內置全局變量、全局函數。
全局變量
| 變量 | 類型 | 說明 |
|---|---|---|
auth |
object | 用戶登錄信息,auth.openid 是用戶 openid |
doc |
object | 記錄內容,用於匹配記錄內容/查詢條件 |
now |
number | 當前時間的時間戳 |
