2024-04-09|閱讀時間 ‧ 約 0 分鐘

存取控制與 Oso

    raw-image

    Oso(西班牙文的「熊」)是跨語言、跨框架的存取控制服務,它也有開源套件,本文主要介紹它的開源套件。

    在進入 Oso 前,先簡單認識一下存取控制。

    存取控制

    「存取控制」英文叫 access control,市場上有許多不同的存取控制模型,他們的縮寫大多是 xAC,是 xxx access control 的意思。

    存取控制是多人系統必備的要素之一,例如常見的 WordPress,它內建了幾個預先定義好的角色:

    WordPress 角色

    如圖所見,每個角色的能執行的權限不同,而每個帳號必定要賦予一個角色,形成「帳號—角色」這樣的關係,每個角色能執行的項目不同,例如編輯、管理員才能刪除文章,但除了這種系統面的權限外,每篇文章也有自身的權限,例如A作者不能改B作者的文章。

    像 WordPress 這樣,以角色為基礎的存取控制模型,我們稱為「RBAC(role-based access control)」。

    RBAC 的概念是以角色為中心的,也就是批假單的權限是綁在店長這個角色身上,而不是綁在王小臻身上,王小臻之所以能批假單,是因為她被賦予了店長的角色。

    除了 RBAC 外,視系統的應用場景和複雜度不同還有其他的 xAC,未來有遇到再說,畫面先交還給棚內的 Oso。

    Oso 簡介

    一般要做一個 RBAC 機制,有可能自幹,但秉持著不要重新發明輪子的原則,還是交給專業的來吧!

    快速帶過 Oso 的特點:

    • 跨平台,Python、Rust、Node.js、Ruby、Go、Java,這算跨很大了吧。
    • Oso 開發了一種專門用於制定安全政策的語言 Polar,加上 Oso 本身又是跨平台的,因此 Oso 這層存取控制可以與系統語言、框架本身作一定程度的分離,避免炒出義大利麵。
    • 角色與權限應用的對象可以細至「資源」,可以做到像 WP 那樣A不能改B的文章。
    • 背後有商業化服務,不用擔心哪天作者跑路或被腰斬。(請不要舉冨樫當反例謝謝)

    Oso 與 Flask

    Oso 好不好強不強不知道,先用一波感受一下。

    下面是一個極簡的 Flask + Oso 專案:

    Oso 專案

    這個專案與 Oso 文件中的示範專案大致相同,但略作修改:

    • 用 Poetry 取代 requirements.txt
    • 相容於 Python 3.7 以上版本

    進入 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 會看到正確的內容:

    Gmail repo

    而打開 http://localhost:5000/repo/react 則會看到錯誤的內容:

    React repo

    為什麼會這樣呢?從 routing 開始找原因,打開 app/server.py 可以看到負責處理上面路由的函式 repo_show()


    付費訂閱
    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.