了解ACL運作方式
大部分強大又重要的東西都需要一些權限控制。 權限控制表是一種分級明確又好管理的權限控制方式。 權限控制表(或簡稱ACL)主要管理二種事物:需要使用服務的事物,和被控制的事物。 以ACL的角度看,需要使用服務的事物(通常是使用者)叫access request object,簡稱ARO。 而系統內被控制的事物(通常是action或資料)叫access control object,簡單ACO。 每一個對象被稱為一個物件(object),因為有時候這些對象並不是人-有時候可能是程式中另一部分的邏輯。 ACO可以是任何你想要控制的東西,從controller的action 到一項web service,甚至是你祖母的線上日記裡的一行文字。
用一句話來說明這三個簡稱:ACL是用來決定ARO是否可以使用ACO的規範。
為了讓你更加了解這個概念,讓我們舉個實用的例子。 一群魔戒中的勇者們共同使用一組電腦系統。隊長必須在努力衝次任務的同時,在成員間守住一定程度的秘密與安全性。 ARO包含下面幾位:
Gandalf Aragorn Bilbo Frodo Gollum Legolas Gimli Pippin Merry
這些是系統中會要求使用服務的使用者(ARO),他們要使用的東西就是ACO。 這裡可以注意到,ACL並不是一種使用者認証系統。 你應該早有另一套存放使用者資料,並在他們進入系統時確認身份的方法。 在確認道使用者身份之後,才是ACL 站出發揮功用的時機。好,話題回到我們的勇者們身上。
Gandalf下一步得做的事是列出系統要管理的物品列表(ACO)。看起來會像這樣:
Weapons The One Ring Salted Pork Diplomacy Ale
傳統的方法裡,系統會用矩陣的方式管理,矩陣中顯示使用者與各物品間的使用權限。 若將這些資料成列成表,看起來就像下面所示,'X'表示拒絕存取,'O'表示允許存取:
Weapons The One Ring Salted Pork Diplomacy Ale
Gandalf X X O O O
Aragorn O X O O O
Bilbo X X X X O
Frodo X O X X O
Gollum X X O X X
Legolas O X O O O
Gimli O X O X X
Pippin X X X O O
Merry X X X X O
這樣的設計,看起來很完善。既可以保守機密(只有Frodo可以拿到魔戒),又可以防止意外發生(哈比人碰不到肉乾)。 權限似忽設計的很好,也很容易看得懂,對吧?
對這麼一個小系統而言,矩陣的的設定方式也許已經足夠。 但面對會慢慢變大的系統或系統裡有一大堆資源(ACO)和使用者(ARO)時,就無法這麼輕易的建立這個表了,比如說要為每個單位分配使用上百個營地。 矩陣的另一個缺點是無法真的為使用者分組,或依不同的組別給與不同的權限。 例如,我們想在戰爭結束後解除哈比人對酒和肉乾的禁令: 若只能分別更改每個使用者的權限,不但要改的項目很多,出錯的機率也非常高;若有辦法直接更改'哈比人'這一組的權限,一切就簡單多了。
ACL 以樹狀結構進行設計,通常會有一棵ARO的樹和一棵ACO的樹。 把物件整理成樹狀圖,不但可以做細部的設定,還可以以巨觀的方式管理。 身為一個叡智的領導者,Gandalf選擇在新系統中使用ACL,把他的物件整理如下:
Fellowship of the Ring
Warriors
Aragorn
Legolas
Gimli
Wizards
Gandalf
Hobbits
Frodo
Bilbo
Merry
Pippin
Vistors
Gollum
將我們的團隊以這種方式整理之後,便可以對這棵樹的每個結點定義使用權限了。 預設的權限是所有東西都不能使用,接者向下層一項一項權限開放。 最後開放的一定是最在意的事物。所以,依據ARO樹,Gandalf把權限如此設計:
Fellowship of the Ring: [Deny: ALL]
Warriors [Allow: Weapons, Ale, Elven Rations, Salted Pork]
Aragorn
Legolas
Gimli
Wizards [Allow: Salted Pork, Diplomacy, Ale]
Gandalf
Hobbits [Allow: Ale]
Frodo
Bilbo
Merry
Pippin
Vistors [Allow: Salted Pork]
Gollum
若想透過ACL 看看Pippin是否可以拿到Ale,首先查出他在樹中的路徑是Fellowship->Hobbits->Pippin。 然後看看每個節結的權限,其中對Pippin最明確的設定就是我們想得知的答案。
-
Fellowship = DENY Ale,所以不允許(因為被設成所有東西都不允許)
-
Hobbits = ALLOW Ale,所以允許
-
Pippin = ?; 這裡沒有做任何特別的設定。
-
最終結論:允許使用ale。
我們還可以透過這棵樹對更底層做更細節的設定,變更上層的設定:
Fellowship of the Ring: [Deny: ALL]
Warriors [Allow: Weapons, Ale, Elven Rations, Salted Pork]
Aragorn [Allow: Diplomacy]
Legolas
Gimli
Wizards [Allow: Salted Pork, Diplomacy, Ale]
Gandalf
Hobbits [Allow: Ale]
Frodo [Allow: Ring]
Bilbo
Merry [Deny: Ale]
Pippin [Allow: Diplomacy]
Vistors [Allow: Salted Pork]
Gollum
你可以發現,Aragorn的權限雖然和所屬的Warrior組一樣,但仍可以單獨給他特別的權限。 再說明一次,我們把預設權限設成DENY,然後一層層向下,將想開放的設回ALLOW。 想看看Merry是否可以拿到Ale,先查一下Merry在這棵樹的路徑為:Fellowship->Hobbits->Merry, 然後查出每個節點所設與ale相關的權限:
-
Fellowship = DENY 因為設定為全部拒絕
-
Hobbits = ALLOW: ale, 所以允許
-
Merry = DENY ale, 所以拒絕
-
最終結論:不能使用ale。

