Oso(西班牙文的「熊」)是跨語言、跨框架的存取控制服務,它也有開源套件,本文主要介紹它的開源套件。
在進入 Oso 前,先簡單認識一下存取控制。
「存取控制」英文叫 access control,市場上有許多不同的存取控制模型,他們的縮寫大多是 xAC,是 xxx access control 的意思。
存取控制是多人系統必備的要素之一,例如常見的 WordPress,它內建了幾個預先定義好的角色:
如圖所見,每個角色的能執行的權限不同,而每個帳號必定要賦予一個角色,形成「帳號—角色」這樣的關係,每個角色能執行的項目不同,例如編輯、管理員才能刪除文章,但除了這種系統面的權限外,每篇文章也有自身的權限,例如A作者不能改B作者的文章。
像 WordPress 這樣,以角色為基礎的存取控制模型,我們稱為「RBAC(role-based access control)」。
RBAC 的概念是以角色為中心的,也就是批假單的權限是綁在店長這個角色身上,而不是綁在王小臻身上,王小臻之所以能批假單,是因為她被賦予了店長的角色。
除了 RBAC 外,視系統的應用場景和複雜度不同還有其他的 xAC,未來有遇到再說,畫面先交還給棚內的 Oso。
一般要做一個 RBAC 機制,有可能自幹,但秉持著不要重新發明輪子的原則,還是交給專業的來吧!
快速帶過 Oso 的特點:
Oso 好不好強不強不知道,先用一波感受一下。
下面是一個極簡的 Flask + Oso 專案:
這個專案與 Oso 文件中的示範專案大致相同,但略作修改:
進入 Poetry 虛擬環境後把這 Flask 跑起來:
FLASK_APP=app.server python -m flask run
就會看到下面的訊息:
* Serving Flask app 'app.server' (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000 (Press CTRL+C to quit)
瀏覽器打開 http://localhost:5000/repo/gmail 會看到正確的內容:
而打開 http://localhost:5000/repo/react 則會看到錯誤的內容:
為什麼會這樣呢?從 routing 開始找原因,打開 app/server.py 可以看到負責處理上面路由的函式 repo_show()
: