資料和安全之訪問授權與鑑權方式
訪問授權(Authorization)
最靈活的保護你應用資料安全的方式是通過訪問控制列表(Access Control List),通常簡稱為「ACL 機制」。ACL 背後的機制是將每個操作授權給一部分 使用者(User)或者 角色(Role),只允許這些使用者或角色執行這些操作。例如,一個使用者必須擁有讀許可權(或者屬於一個擁有讀許可權的角色)才可以獲取一個物件的資料,同時,一個使用者需要擁有寫許可權(或者屬於一個擁有寫許可權的角色)才可以更改或者刪除一個物件。
+
ACL 工作的前提是使用者(User)和角色(Role)。使用者(類名_User
)是 LeanCloud 內建的賬戶系統,自動支援使用者註冊、登入、驗證等操作,詳細內容請參考_Role
)是一種有名稱的物件,包含了使用者和其他角色(也就是說角色也有層次關係),將許可權授予一個角色代表該角色所包含的其他角色也會得到相應的許可權。
ACL一般分為對CLass、Object級別的授權,就不再細細展開
角色
當你的 app 的規模和使用者基數成長時,你可能發現你需要比 ACL 模型(針對每個使用者)更加粗粒度的訪問控制你的資料的方法。為了適應這種需求,需提供支援一種基於角色的許可權控制方式。角色系統提供一種邏輯方法讓你通過許可權的方式來訪問你的資料,角色是一種有名稱的物件,包含了使用者和其他角色。任何授予一個角色的許可權隱含著授予它包含著的其他的角色相應的許可權。
+
例如,在你的 app 中管理著一些內容,你可能有一些類似於「主持人」的角色可以修改和刪除其他使用者建立的新的內容,你可能還有一些「管理員」有著與「主持人」相同的許可權,但是還可以修改 app 的其他全域性性設定。通過給予使用者這些角色,你可以保證新的使用者可以做主持人或者管理員,不需要手動地授予每個資源的許可權給各個使用者。
+
我們提供一個特殊的角色(Role)類來表示這些使用者組,為了設定許可權用。角色有一些和其他物件不太一樣的特殊欄位。
+
欄位 | 說明 |
---|---|
name | 角色的名字,這個值是必須的,而且只允許被設定一次,只要這個角色被建立了的話。角色的名字必須由字母、空格、減號或者下劃線這些字元構成。這個名字可以用來標明角色而不需要它的 objectId。 |
users | 一個指向一系列使用者的關係,這些使用者會繼承角色的許可權。 |
roles | 一個指向一系列子角色的關係,這些子關係會繼承父角色所有的許可權。 |
通常來說,為了保持這些角色安全,你的移動 app 不應該為角色的建立和管理負責。作為替代,角色應該是通過一個不同的網頁上的介面來管理,或者手工被管理員所管理。
更安全的鑑權方式
一種新的 API 鑑權方式,即在 HTTP header 中使用 X-LC-Sign 來代替 X-LC-Key,以降低 App Key 的洩露風險。例如:
curl -X PUT \
-H "X-LC-Id: FFnN2hso42Wego3pWq4X5qlu" \
-H "X-LC-Sign: d5bcbb897e19b2f6633c716dfdfaf9be,1453014943466" \
-H "Content-Type: application/json" \
-d '{"content": "在 HTTP header 中使用 X-LC-Sign 來更新一篇部落格的內容"}' \
https://m6wlxaf8.api.lncld.net/1.1/classes/Post/<objectId>
X-LC-Sign 的值是由 sign,timestamp[,master]
組成的字串:
+
取值 | 約束 | 描述 |
---|---|---|
sign | 必須 | 將 timestamp 加上 App Key 或 Master Key 組成的字串,再對它做 MD5 簽名後的結果。 |
timestamp | 必須 | 客戶端產生本次請求的 unix 時間戳(UTC),精確到毫秒。 |
master | 可選 | 字串 "master" ,當使用 master key 簽名請求的時候,必須加上這個字尾明確說明是使用 master key。 |
舉例來說,假設應用的資訊如下:
+
App Id | FFnN2hso42Wego3pWq4X5qlu |
App Key | UtOCzqb67d3sN12Kts4URwy8 |
Master Key | DyJegPlemooo4X1tg94gQkw1 |
請求時間 | 2016-01-17 15:15:43.466 |
timestamp | 1453014943466 |
使用 App Key 來計算 sign:
md5( timestamp + App Key )
= md5(1453014943466UtOCzqb67d3sN12Kts4URwy8
)
= d5bcbb897e19b2f6633c716dfdfaf9be+
-H "X-LC-Sign: d5bcbb897e19b2f6633c716dfdfaf9be,1453014943466" \
使用 Master Key 來計算 sign:
+
md5( timestamp + Master Key )
= md5(1453014943466DyJegPlemooo4X1tg94gQkw1
)
= e074720658078c898aa0d4b1b82bdf4b+
-H "X-LC-Sign: e074720658078c898aa0d4b1b82bdf4b,1453014943466,master" \
+
(最後加上 master 來告訴伺服器這個簽名是使用 master key 生成的。)
+
使用 master key 將繞過所有許可權校驗,應該確保只在可控環境中使用,比如自行開發的管理平臺,並且要完全避免洩露。因此,以上兩種計算 sign 的方法可以根據實際情況來選擇一種使用。