【認證與授權 - Open Policy Agent】關於策略語言Rego

更新於 發佈於 閱讀時間約 6 分鐘

上一篇我們介紹了「【認證與授權】Open Policy Agent 授權策略」, 相信都已經初步了解了OPA(Open Policy Agent)主要在做什麼, OPA簡單來說就是一個授權的政策管理規範, 有點像我們的法律系統, 提供開發者在上面制定法條, 以約束授權對象可以進行什麼樣的操作, 讓各語言各自實作的授權政策有了統一的規範, 並獨立成一個模組區塊, 目的是讓越趨複雜的系統可以專注於功能, 而各類授權政策則獨立開發、測試, 讓職責分明, 問題追朔更加容易。

raw-image

既然OPA是一種授權的政策管理規範, 就像法律一般也一定會有法條的組成, 而在OPA的世界裡, 組成法條的就是Rego這個語言, 專門用於描述和評估政策規則, 提供了靈活的工具,開發人員可以使用這些工具來編寫、測試和調試政策規則, 這次就來介紹一下Rego這套語言究竟與我們傳統的程式語言有什麼不同吧!

簡介

Rego這個語言的發展主要受到Datalog的啟發, Datalog是一種數據查詢語言, 這種語言有很強的知識推理能力,本質上都是為了解一個邏輯問題, Datalog已經具有數十年歷史的查詢語言, 但Rego並非完全遵循Datalog的語法, 而是以支持JSON格式的方式, 更貼近於現代化的撰寫方式。

為什麼要使用Rego語法?

總而言之,Rego是OPA的政策語言,用於描述和評估政策規則,它提供了一種結構化和可讀性高的方式來定義政策,並與OPA引擎緊密集成,實現細粒度的存取控制和政策管理。

初步認識一下Rego

語法結構

  • 相同的規則檢查名稱, 其中一組符合就通過檢查。
  • 規則檢查區塊中的每一條表達式都是And的關係。
default 規則檢查名稱 = 預設值

規則檢查名稱 {
表達式
表達式
...
}

規則檢查名稱 {
...
}

預設規則的回傳值

以下會預設allow未滿足判斷條件時, allow會等於false。

default allow = false

allow {
x := 42
y := 41
x < y
}

// return false

但假設沒有預設值, 就會回傳undefined。

allow {
x := 42
y := 41
x < y
}

// return undefine

多條表達式之間都是And關係, 順序性影響不大

正常撰寫表達式如下:

t2 {
x := 42
y := 41
x > y
}
expression-1 AND expression-2 AND ... AND expression-N

替換順序, 結果仍然正確, 因此我們在寫決策時, 也可以先把期望的判斷寫好, 在補上需要的Data:

t2 {
x > y
x = 42
y = 41
}

否定語句使用 not 關鍵字

t {
greeting := "hello"
not greeting == "goodbye"
}

// reult true

Function結構

我們撰寫程式時, 常常需要把重複的功能獨立成Function, 而rego語法也提供了Function的功能結構如下:

<function_name>(<params>...) = <return_value_variable> { 
<expression-N>...
}
trim_and_split(s) = x {
t := trim(s, " ")
x := split(t, ".")
}

Else關鍵字

authorize = "allow" {
input.user == "superuser" # allow 'superuser' to perform any operation.
} else = "deny" {
input.path[0] == "admin" # disallow 'admin' operations...
input.source_network == "external" # from external networks.
} # ... more rules

結語

不論我們今天是否使用Rego這個語言, 重要的是其中的設計精髓, 以宣告式設計來表述一件工作或者事物, 讓我們專注於設計最終結果, 以終為始, 逐步填充過程。

喜歡撰寫文章的你,不妨來了解一下:

Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 — 為什麼要加入?

歡迎加入一起練習寫作,賺取知識!

留言
avatar-img
留言分享你的想法!
avatar-img
阿Han的沙龍
135會員
301內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2023/06/30
什麼是零知識證明(Zero-knowledge proof) 是一種密碼學的概念,用於在不揭示具體信息的情況下,證明某個主張的正確性。它允許一方(稱為證明者)向另一方(稱為驗證者)證明某個陳述的真實性,而無需透露任何關於陳述的具體細節..., 這根本文字天書啊,底下讓我們用白話文來說一下唄! 「我必
Thumbnail
2023/06/30
什麼是零知識證明(Zero-knowledge proof) 是一種密碼學的概念,用於在不揭示具體信息的情況下,證明某個主張的正確性。它允許一方(稱為證明者)向另一方(稱為驗證者)證明某個陳述的真實性,而無需透露任何關於陳述的具體細節..., 這根本文字天書啊,底下讓我們用白話文來說一下唄! 「我必
Thumbnail
2023/06/06
上一篇我們有介紹什麼是OPA以及一些基本概念「【資訊軟體知識】Open Policy Agent 授權策略」,接下來我們就來介紹如何架設並以API的方式進行授權檢查。 這種方式的好處是可以跨語言, 不侷限於Go, 透過標準RESTFUL API的方式來與OPA Server相互溝通。 使用Docke
Thumbnail
2023/06/06
上一篇我們有介紹什麼是OPA以及一些基本概念「【資訊軟體知識】Open Policy Agent 授權策略」,接下來我們就來介紹如何架設並以API的方式進行授權檢查。 這種方式的好處是可以跨語言, 不侷限於Go, 透過標準RESTFUL API的方式來與OPA Server相互溝通。 使用Docke
Thumbnail
2023/05/27
使用網銀時我們常常會聽到OTP、OTP, 究竟OTP是什麼呢? 全名為「One Time Password」, 一次性密碼, 顧名思義就是密碼僅能一次性的使用, 在過去我們也都很清楚單純的帳號密碼登入已經不是一個非常安全的選項的, 萬一牽涉到重要的金錢交易時, 如果安全環節沒有兼顧, 將導致個人財產
Thumbnail
2023/05/27
使用網銀時我們常常會聽到OTP、OTP, 究竟OTP是什麼呢? 全名為「One Time Password」, 一次性密碼, 顧名思義就是密碼僅能一次性的使用, 在過去我們也都很清楚單純的帳號密碼登入已經不是一個非常安全的選項的, 萬一牽涉到重要的金錢交易時, 如果安全環節沒有兼顧, 將導致個人財產
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
支援Go所有的類型儲存,且可以用原生SQL敘述與跨資料庫查詢。 映射關係 table->struct record->object field->attribute 安裝 go get github.com/astaxie/beego/orm​ go get github.com
Thumbnail
※ OPP第一大核心-封裝 封裝的精神在於將「方法」、「屬性」和「邏輯」包裝在類別裡面,透過類別的實例來實現。這樣外部物件不需要了解內部的實現細節,只需要知道如何使用該類別提供的接口即可。換句話說,封裝是將內部細節隱藏起來,只暴露必要的部分給使用者。 封裝的核心概念是,使用者如果想要接觸資料,只
Thumbnail
※ OPP第一大核心-封裝 封裝的精神在於將「方法」、「屬性」和「邏輯」包裝在類別裡面,透過類別的實例來實現。這樣外部物件不需要了解內部的實現細節,只需要知道如何使用該類別提供的接口即可。換句話說,封裝是將內部細節隱藏起來,只暴露必要的部分給使用者。 封裝的核心概念是,使用者如果想要接觸資料,只
Thumbnail
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
Thumbnail
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
Thumbnail
Odoo是一個開放源碼的ERP軟體,主要用於整合所有的商業流程,以提升企業的運作效率。來自比利時的Odoo,全球已有超過1200萬用戶採用。
Thumbnail
Odoo是一個開放源碼的ERP軟體,主要用於整合所有的商業流程,以提升企業的運作效率。來自比利時的Odoo,全球已有超過1200萬用戶採用。
Thumbnail
這篇開箱另一套權限檢查工具 Vakt,相較於 Oso,Vakt 的規則直接以 Python 語法構成,不用再學 Oso 的特規語法,可以作為 Oso 的替代品。
Thumbnail
這篇開箱另一套權限檢查工具 Vakt,相較於 Oso,Vakt 的規則直接以 Python 語法構成,不用再學 Oso 的特規語法,可以作為 Oso 的替代品。
Thumbnail
本篇介紹跨平台存取控制系統 Oso 以及它的規則語言 Polar,用他們替專案建立 RBAC 以及資源級的存取控制。
Thumbnail
本篇介紹跨平台存取控制系統 Oso 以及它的規則語言 Polar,用他們替專案建立 RBAC 以及資源級的存取控制。
Thumbnail
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
👨‍💻 簡介 在處理string時,正則表達式是一個非常有用的工具。Go語言的regexp package 可以使用正則表達式,用來執行如檢查string是否匹配某個模式、提取匹配的subString等操作。
Thumbnail
上一篇我們介紹了「【認證與授權】Open Policy Agent 授權策略」, 相信都已經初步了解了OPA(Open Policy Agent)主要在做什麼, OPA簡單來說就是一個授權的政策管理規範, 有點像我們的法律系統, 提供開發者在上面制定法條, 以約束授權對象可以進行什麼樣的操作, 讓各
Thumbnail
上一篇我們介紹了「【認證與授權】Open Policy Agent 授權策略」, 相信都已經初步了解了OPA(Open Policy Agent)主要在做什麼, OPA簡單來說就是一個授權的政策管理規範, 有點像我們的法律系統, 提供開發者在上面制定法條, 以約束授權對象可以進行什麼樣的操作, 讓各
Thumbnail
上一篇我們有介紹什麼是OPA以及一些基本概念「【資訊軟體知識】Open Policy Agent 授權策略」,接下來我們就來介紹如何架設並以API的方式進行授權檢查。 這種方式的好處是可以跨語言, 不侷限於Go, 透過標準RESTFUL API的方式來與OPA Server相互溝通。 使用Docke
Thumbnail
上一篇我們有介紹什麼是OPA以及一些基本概念「【資訊軟體知識】Open Policy Agent 授權策略」,接下來我們就來介紹如何架設並以API的方式進行授權檢查。 這種方式的好處是可以跨語言, 不侷限於Go, 透過標準RESTFUL API的方式來與OPA Server相互溝通。 使用Docke
Thumbnail
相信身為軟體工程師的朋友們應該常常聽到宣告式及命令式兩種不同的名詞吧! 剛接觸時,對於這兩個名詞根本就是覺得文字天書,怎麼也看不懂,但隨著經驗的累積, 也逐漸有了一些領悟,也希望透過簡單說明的方式讓大家理解共同學習。 這種方式是我們早期所使用的設計模式,先把需要的素材準備好,然後一步一腳印的打造出處
Thumbnail
相信身為軟體工程師的朋友們應該常常聽到宣告式及命令式兩種不同的名詞吧! 剛接觸時,對於這兩個名詞根本就是覺得文字天書,怎麼也看不懂,但隨著經驗的累積, 也逐漸有了一些領悟,也希望透過簡單說明的方式讓大家理解共同學習。 這種方式是我們早期所使用的設計模式,先把需要的素材準備好,然後一步一腳印的打造出處
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News