一. 開源產品
對開源的產品了解不多,所以也只能大概的談談,開源的產品中比較知名的有poweracl、acegi,poweracl從名字就可以看出其是基于ACL模型的,不怎么了解所以在此也不去評價了。
Acegi作為JAVA界知名的權限系統,從其文檔看來是能滿足上述的權限系統的所有需求,其reference文檔也對權限系統進行了系統的歸納,非常的不錯,建議去看看。
在Acegi中授權模型以及資源權限的校驗仍然是基于RBAC模型,在數據權限方面也就是在reference文檔中它稱為Domain Object Instance的部分,是基于ACL模型的實現,曾經翻閱它此部分的代碼,根據代碼表現它并不支持Domain Object Instance的權限的繼承,并且對于獲取的Domain Object Instance也是沒法采用分頁的方式獲取。
看了Acegi的代碼覺得其授權應該是比較高效的,但在校驗權限上效率恐怕也會比較的低,因為權限的繼承是在校驗權限通過遞規來實現的,雖然引入了緩存機制但仍然無法從根本上解決此問題,而且此緩存的維護也不是一件容易的事。
但Acegi的優點也不可忽略,作為權限系統有一個很容易產生的問題就是對原有系統產生非常大的侵入,并最終導致原有系統與此權限系統形成了非常強的耦合,Acegi在這點上則做的比較好,通過使用Filter、Interceptor以及AOP Weaver技術來盡量保證對原有系統最少的改動。
二. 個人觀點
權限系統作為各種系統中都需要的一個子系統,具有很廣的需求面,無論做什么系統,首要重要的仍然是需求,盡管權限系統在各個系統中都有需求,但仍然是不盡相同,所以首先要明確所面對的系統到底是一個什么樣的系統,對于權限有什么樣的需求,根據需求可以根據相應的實現方案來做出自己的設計。
權限系統主要由授權和校驗權限兩大部分組成,授權效率和校驗權限的效率通常會產生沖突,個人覺得首先要保證校驗權限的效率,畢竟系統需要校驗權限的地方會非常的多,但授權動作相對來講觸發的會比較的少。
從技術需求上來講,權限系統對外部系統而言最好做到黑盒的效果,為了減少對外部系統的侵入,在根據業務需求分析的基礎上形成權限系統的輸入和輸出需求,從通常的功能需求角度來大致的闡述:
1. 身份認證
在B/S結構的系統中通常通過增加Filter來達到實現身份認證的功能,這樣不會造成對原有系統的改動。
2. 授權模型
授權模型則需外部系統根據此模型建立相應的授權UI以及交互,當然,權限系統本身也可提供默認的實現方式。
3. 資源權限校驗
在資源權限的校驗上可通過Proxy或Before Interceptor的方式來做到對資源操作的權限控制。
4. 數據權限校驗
在很多時候需要區分好數據權限和業務邏輯,不要將業務邏輯形式的數據控制也借用數據權限來實現,數據權限的引入很容易對現有的系統模塊造成影響,在此塊的設計上要特別注意避免造成對原有系統模塊過多的侵入。
5. 權限校驗的體現
在權限校驗的體現上基本主要是表現在菜單、按鈕以及數據的顯示上,菜單、按鈕通常通過標簽的方式來控制,數據的顯示控制則需結合數據權限校驗部分來實現。
到現在為止也做了幾個權限系統了,目前仍然沒做出讓自己滿意的權限系統,此文作為拋磚引玉的文章,也希望大家能夠給出自己所做的解決方案。
三. 涉及的知識體系
根據上面的描述以及結合自己的經驗,形成搭建權限系統所需的知識體系:

圖表 6 權限系統知識體系