AOP分離許可權關注 補遺

2021-09-30 02:27:41 字數 1948 閱讀 4580

昨天的blog中我描述了使用aop分離許可權關注的基本做法。回家仔細想了想,把思考的結果補充一下。

我們知道,在基本的rbac模型中有以下基本(介面)物件:domain, group, user, role, privilege, operation, resource以及對外的securitymanager。privilege通過operate resource而產生,role則對應若干個privilege。不同的domain, group, user擁有不同數量的role,其中user的role可以繼承自group,也可以繼承自domain;group的許可權可以繼承自domain。對外表現時,可以簡單地通過securitymananger.checkpermission(user,  privilege)的返回值true/false進行判斷。上面每個物件都是介面,securitymanager可以通過ioc反向注入,從而使得這種許可權模型的使用比較靈活。

在實際情況中,這種許可權系統中resource的定義方法與粒度最難以控制。不同的業務系統中可能有不同的定義方式。而且這種方式的交流非常不方便。以乙個普通的「科研專案管理」專案為例:系統中需要進行許可權控制的東西可能有:使用者資訊(增刪改查),專案資訊(增刪改查),日誌資訊(檢視,統計)等等。這種許可權的控制如果按照垂直程式設計的方式來寫,需要進行以下工作:

研究:需要控制的資源到底是什麼?使用者資訊?專案資訊?這些東西如何表現?這個問題在這種模型中很難考慮清楚。最終的結果往往是,使用沒有resource介面的許可權模型,形成乙份新的文件:許可權**以及對應說明表。每個程式設計人員在編寫相應的業務邏輯時,都需要參考這個表,並將程式中加上一串行的if --- else來判斷許可權。這種做法無疑是危險的。因為一旦許可權**發生變動, 這個業務方法馬上得重寫。稍微考慮不難知道,這種方法根本不可取:連基於uri的解決方案都不如。

可以看到,像使用者資訊、專案資訊等等,都是業務物件,這些業務物件對於人是可理解的,但將這些業務物件作為rbac中的資源是不合理的。因此我提出一種新的資源概念:將具體業務類、業務方法作為rbac模型中的資源。這樣才能夠真正脫離許可權與業務邏輯。具體做法是:將所有的業務方法名稱以及對應的角色名稱存入到xml檔案或者資料庫中,形成乙個resource庫:

method                   role

------------------------------------------

usermanager.*            usermanager

usermanager.update       usermanager

usermanager.update       user

loginfo.view             *

loginfo.statistics       logmanager

...                      ...

------------------------------------------

對於許可權的判斷,可以在rbac的具體實現中進行。這裡假定有乙個securitymanager.checkpermission(user, privilege)(這裡的privilege實際上就是能否執行特定業務方法)的方法。根據這個方法,製作乙個aspect:

public class permissioncheckadvice implements methodbeforeadvice } }

然後使用aop將這個advice應用到所有的業務方法(類或者方法可能在具有普遍意義的乙個package中,也可能具有一定正則意義),並截獲所有的permissiondeniedexception:

public class permissionthrowsadvice implements throwsadvice

aop分離許可權關注的文字到此截至,有些比較重要但是來不及完成的如securitymanager如何引入,上下文環境如何取得等等,可能需要各位自行完成了。這裡提出的是一種將method作為資源的概念,希望對做許可權系統的同仁有所幫助。

我的blog:

關注點分離

好的架構設計必須把變化點錯落有致地封裝到軟體系統的不同部分。要做到這一點,必須進行關注點分離。iuar jacobson 在 aosd 中文版 中寫道 好的架構必須使每個關注點相互分離,也就是說系統中的乙個部分發生了變化,不會影響其他部分。即使需要改變,也能夠清晰地識別出那些部分需要改變。如果需要擴...

許可權 如何用AOP實現資料許可權功能

針對不同使用者,在資料查詢時要在sql上拼上可以訪問的部門機構部分。這部分資料查詢許可權一般都是按一定配製或規則制定的。這裡看到一種比較好的方法可以實現資料許可權。其中tablealias為sql中表的別名。dataauth tablealias s public result list reque...

黑蘋果安裝及相關注意事項之八,補遺

好多天沒折騰黑蘋果了,我記得我的clover是3050,下過幾次,一直沒更新,看到又有乙個新的,3113,好吧,公升級吧。安裝完,重啟,完蛋,又不行了,v f,卡顯示卡,奇怪,降點版本,3079,一樣死,再裝回3050,一樣死翹翹,為毛?找來找去,發現居然少了fakesmc,好吧,找個最新版本,還是...