之前寫過一篇〈存取控制與 Oso〉,一段時間下來也沒什麼不好,就是始終不適應 Oso 那獨家的權限規則語法 Polar,最近又偶然發現了 Vakt,看起來它有可能成為 Oso 的替代品,就讓我來開箱一下吧。

Vakt 意思是挪威語的 guard。

與 Oso 一樣 Vakt 也是權限檢查套件,對於現代化應用,常見的權限模式有 RBAC,以「角色」基礎的權限管理模式,例如班長能批假單,如此以角色為中心做權限規則制定,不以一個個帳號去制定,畢竟角色應該是有限的,而帳號很有可能是無限的。

另一種典型的權限模式為 ABAC,它是更細化的權限管理模式,沿用上面的案例,不僅班長必須是班長,ABAC 還限制只有 A 班班長能批 A 班假單,B 班班長能批 B 班假單,化為程式碼大概長這樣:

if account_s.role == 'TEAM-LEADER':
    if account_s.team_id == application_form.account.team_id:
        return True

類似的案例還有很多,像是作者 A 的貼文不能給 B 修改,但是網站編輯能修改所有作者的文,並且發佈權也在編輯手上。

像這樣零零碎碎的規則,想用 if 硬幹到底很有可能出錯,更好的方式是拿 Vakt 這類專門的規則引擎來替我們運算到底是 pass 還是 out。

繼續閱讀