PHPGACL應用許可權控制
許可權控制的設計一直是系統開發和架構結構中經常討論的問題,如何設計一個簡單而又行之有效卻又可以提供高精度的許可權控制粒度是我們一直探討的問題。最近在翻看Joomla中的ACL部分發現了這個架構phpGACL
在我個人開發的過程中也是經常面臨這個問題,簡單的粗粒度的控制,複雜的細粒度的控制,一旦許可權設計的非常細會導致我面臨各種高複雜的結構和代碼的編寫。phpGACL提供了一個非常有效對許可權的控制,即可以提供非常豐富的許可權控制,而開發設計上也很簡單。下面先介紹一下phpGACL架構。
?
本文翻譯自phpGACL使用手冊
phpGACL是一組函數他允許任何(使用者,遠程主機)對象對另外一些(頁面,資料庫)對象應用許可權控制。phpGACL提供成熟的許可權控制與簡單的管理,而且速度也是相當快的。更重要的一點,他是完全開源的,你可以從下面地址獲得http://phpgacl.sourceforge.net/
運行他首先必須要有一個關係型資料庫來儲存許可權控制資料,phpGACL是通過ADODB庫來串連資料庫的所以他可以方便的串連mysql,postgresql,oracle等等。在Joomla中的ACL系統是經過一些輕量級的改裝後的,主要是在資料庫層joomla放棄使用ADODB而採用了joomla中的資料庫抽象類別來儲存資料庫
理解許可權控制
最好的解釋許可權控制的方法就是使用一些具體的執行個體而不是講述枯燥的概念。Han是Millennium Falcon號飛船的船長,Chewie是他的二副,飛船上同時搭載著一些乘客包括:Luke, Obi-wan, R2D2 ,C3PO.Han需要對飛船上的每一個艙室定義一個存取權限包括:駕駛艙,動力艙,休息艙以及武器艙。
船長Han說”我和Chewie有權進入所有地方,但經過了一次非比尋常的超光速推進器修複之後我禁止Chewie再靠近動力艙,而乘客全部被限制在休息艙內”。從現在開始我們討論的許可權體系實際上是一個布爾數學體系,對于飛船上的每個人進入各個艙室的許可權僅包括允許與拒絕,不存在任何第三種情況。
我們現在將上述情況描述為一個許可權矩陣,他對應描述了誰有權進入哪裡這個問題。具體如描述(0代表允許,X代表拒絕)。
列代表船長Han需要設定許可權控制的艙室,而行則代表需要訪問艙室的人員。抽象點說“艙室”就是需要控制許可權的事物,這裡我們稱為”許可權控制對象”Access?Control Objects(ACO);“人員”就是需要許可權去訪問的事物,這裡我們稱為”許可權需求對象”Access Request Objects(ARO)。人員需要許可權進入艙室在我們的術語裡就是AROs需要許可權去訪問ACOs。這裡還有第三類對象稱為附件權限物件Access eXtention Object (AXO),這個將在後面討論,他共用一些屬性並共同組成權限物件。
使用許可權矩陣來系統管理權限是比較簡單的,但也存在一些缺點。
1、他可以做到精細如果需要的話可以提供對每個人的管理
2、許可權變的一目瞭然,誰有權進入那裡,只要我們找到人員與艙室的交叉點也就找到了答案。
3、他很難去管理大型的許可權體系,6個乘客4個艙室是一個非常小的許可權體系,但如果有上千位乘客以及數百個艙室,應用矩陣來管理將何等麻煩,需要大量的精確而冗長的判斷。許可權矩陣很難適合這樣的體系管理
4、統計上的麻煩,上面那個圖如果統計誰可以進入動力艙是比較清楚的,但如果圖變成下面這個樣子估計就比較麻煩了
使用phpGACL來定義許可權
對於大型許可權系統的許可權管理來說許可權矩陣是很不合適的,這樣我們就需要去尋找一個更合適的系統來完成這項工作,繼承矩陣的優點同時也要捨去他的缺點。phpGACL就是一個非常好的解決方案。
phpGACL並非自底而上的描述許可權相反他採用了一個自頂而下的順序來描述許可權,他是一個富有彈性的系統,允許使用者使用大量的組來系統管理權限,很容易知道誰有許可權去哪裡。在phpGACL裡使用一個ARO樹來定義組和ARO對象。他與檔案夾、檔案的樹型關係一樣。這裡組就象檔案夾,而ARO對象就是檔案。
現在給Han的飛船上的乘客也就是ARO設計一個ARO樹,首先為飛船上的人員設計一個分類,這裡Han 和Chewie是開船的,而剩下的人都是乘客
MillenniumFalconPassengersGroup
C─rew???????????????????????????Group
│─Han???????????????????????? ARO
│─Chewie??????????????????? ARO
─Passengers??????????????? Group
─Obi-wan???????????????????? ARO
─Luke?????????????????????????? ARO
─R2D2????????????????????????? ARO
─C3PO????????????????????????? ARO
這個樹其實並不關聯任何的許可權只是對ARO對象做一個分類。我們應用許可權實際是只是將ACO對象也就是艙室指派給ARO樹上的Group或者ARO對象。Han說“預設情況下任何人不允許進入任何房間,但是船員可以進入任何艙室,乘客只允許進入休息艙”
MillenniumFalconPassengers
─Crew????????????????????[ALLOW:ALL]
│─Han
Chewie│─
P─assengers????????? [ALLOW:Lounge]
─Obi-wan
─Luke
─R2D2
─C3PO
現在我們自上而下解釋這棵樹,首先預設的許可權永遠是拒絕,所以所有人包括船員初始情況是拒絕進入任何艙室,但Han又說“船員可以進入任何艙室”,這個就發生了許可權覆蓋預設的許可權被允許覆蓋了,所以最終船員有權進入任何艙室,而乘客只允許進入休息艙。這種方式來描述許可權比矩陣更加清楚,你可以清楚的明白誰可以去哪裡,並且為什麼他具備這樣的許可權也可以知道(Han和Chewie可以去飛船上的任意地方,因為他們同屬於一個船員的組)
總結一下
Access Control Objects (ACOs) 許可權控制對象,就是那些我們需要控制訪問的對象,比如網頁、資料庫或者艙室。
Access Request Objects (AROs)許可權需求對象,就是那些需要許可權去訪問的對象,比如人或者遠端電腦。
ARO?樹定義了ARO對象與GROUP的階層。組可以包含ARO對象也可以包含其他組 。
在ARO樹上預設情況永遠是拒絕訪問
許可權分配原則,使用一定的方法遍曆整個ARO樹,為每一個出現的ACO對象分配特定的許可權給ARO或者GROUP
本文簡單講述了phpGACL的許可權控制原理和基本概念,對於深入的GACL控制原理可以參考phpGACL手冊。