隨手扎
【用Keycloak學習身份驗證與授權09】再談身份驗證與授權
再談身份驗證與授權
現在,讓我們再一次把視線放到「身份驗證」和「存取控制」這些名詞身上。 在入門篇的「淺談身份驗證與授權」已經相當程度的解釋過各個名詞。 不過今天將要更關注在身份驗證與存取控制的細節上。
對於一個應用來說,最重要的是它的 業務邏輯 。 除了業務邏輯本身,為完成所需的工作,會需要取得必要之資源。這可能是一份檔案, 鏡頭、麥克風資源等不同種形式。
在 取得資源 過程中,也會有另外一層業務邏輯,也可能本身就是另一隻程式服務,對所需取得的資源,進行 存取控制 。
最後,爲了判斷是否具有存取該項資源的權限,有可能有必要進行 身份驗證或授權 。
現在,我們將業務邏輯作爲應用服務、存取控制作爲存取控制服務、身份驗證作爲身份驗證/授權服務來看時序圖。
actor 使用者 as user
participant 業務邏輯 as business
participant "身份驗證/授權\n服務" as id
participant "存取控制\n服務" as ac
user -> business: 1. 使用應用服務
business -> ac: 2. 要求取得某項資源
ac -> ac: 3. 檢驗存取權限
ac -> id: 4. 要求確認身份/授權
id -> user: 5. 要求證明身份\n 或要求授權
user --> id: 6. 證明身份或授權
id -> id: 7. 檢驗身份或授權
id --> ac: 8. 返回身份或授權
ac -> ac: 9. 檢驗存取權限
ac --> business: 10. 返回資源
business -> business: 11. 處理業務邏輯
business -> user: 12. 完成業務邏輯
在上面例子,「身份驗證/授權服務」可能是身份伺服器和授權伺服器;「存取控制服務」可能是資源伺服器。 但也有不少做法是將身份和授權做在一起,資源存取控制直接由應用(業務邏輯)處理。更甚者,身份驗證於應用的不同邏輯層的狀況也不少見。
細看身份驗證與存取控制
接著,來更仔細的看看身份驗證與存取控制內部。這兩者都可以想象其內部有一個執行器(executor)。 這個執行器可以根據讀取的規則清單(rules list)來判斷是否通過身份驗證或允許存取資源。
這個執行器可能是執行帳號密碼檢驗,規則清單就是每個人的帳號密碼。 透過讀取規則清單找到身份識別的帳號,比對與規則清單內的密碼,以驗證身份。
身份驗證並不會只有帳號密碼這麼一種,所以可能會有多個執行器,每個執行器都有他的規則清單。 除了帳號密碼外,身份私鑰驗證、一次性密碼驗證都有可能。
除了可替換的驗證方式外,可以改成多增加一個政策輸入(Policy)。透過不同的政策,讀取不同規則清單,然後執行不同策略。
※ Note: 這裡的Policy可能與其他像似系統有很大的不同。有可能稱之爲執行模型(model)或策略(strategy)。不過姑且先稱之爲policy。儘管有時Policy直接代表者多個規則(rules),更像是規則清單(rules list)。但你可以想象成該清單上還有一段訊息(meta data),記載者如何理解這些規則。
然後存取控制和身份驗證很像。有非常多種存取控制的政策可以選擇。更甚者你可以將執行器單獨來看,並將執行器嵌入到業務應用之中。還記得稍微點到過的casbin嗎?在我看來他是一個非常巧妙的執行器。或許我們可以在翻外來多聊一點。