mvnforum權(quán)限系統(tǒng)分析
?? mvnforum是一個開源的論壇軟件.網(wǎng)址如下:
http://sourceforge.net/projects/mvnforum/
?? 本文主要研究它的權(quán)限部分,以作為使用借鑒.
?? 這里有篇中文的文檔,以作參考:
? http://www.cn-java.com/target/news.php?news_id=3298
權(quán)限部分的UML圖如下:
??
數(shù)據(jù)流程:
1,系統(tǒng)從OnlineUserManager這個入口進入.這個部件有個Map用來存儲當前的非過期用戶。OnlineUserManager會先根據(jù)當前時間和最后一個用戶的請求時間做對比,檢查是否有刷新過期用戶的必要,如果超過所設(shè)置的時間,那么先更新Map。然后OnlineUserManager根據(jù)提供的用戶的 sessionid和username在這個Map中查找。如果找到,則刷新該用戶的最后一次訪問時間;否則,OnlineUserManager調(diào)用OnlineUserFactory部件創(chuàng)建該OnlineUser,并把這個OnlineUser存入Map之中。
判對用戶是否過期的原理是:從OnlineUser的OnlineUserAction中取出最后一次的訪問時間和當前時間做對比.
2,OnlineUserFactory負責創(chuàng)建OnlineUser并為該OnlineUser提供完整的權(quán)限信息.OnlineUser包括3大部分信息,一部分是用戶的基本信息,一部分是用戶的權(quán)限信息,一部分是用戶的在線信息.在線信息由OnlineUserManager負責管理,其他2部分信息由OnlineUserFactory從持久層獲得.
獲得權(quán)限信息并把它設(shè)置到OnlineUser部件上,提供給OnlineUserManager管理.
3.CNMPermissionFactory類似我們常說的service.主要負責和持久層通信,最終返回一個CNMPermission部件供OnlineUserFactory合成OnlineUser部件.在下面的章節(jié)里,筆者會對他細化討論.
權(quán)限結(jié)構(gòu):
用來實現(xiàn)用戶權(quán)限的主要的是CNMPermission接口和他是2個子類AbstractPermission和CNMPermissionImpl.CNMPermission接口負責定義權(quán)限有關(guān)的常量和對外API.AbstractPermission設(shè)置了保存權(quán)限信息的變量并實現(xiàn)了CNMPermission接口中定義的抽象方法,因此,筆者把這個抽象類叫做鑒權(quán)類.CNMPermissionImpl 則負責對AbstractPermission使用的變量進行設(shè)值,因此,筆者稱之為賦權(quán)類.
先看看AbstractPermission的結(jié)構(gòu)。這里涉及到這么幾個概念:全局權(quán)限,特定權(quán)限,單個權(quán)限,組合權(quán)限。
全局權(quán)限用true/false來設(shè)置。
特定權(quán)限是指某一個動作所作用的不同的對象。比如:某用戶只能將寫操作作用于1,2,4這3個論壇板塊之上。表示為這個特定權(quán)限內(nèi)部的ArrayList容器中只有1,2,4三個編號。
單個權(quán)限是指單個動作。比如讀操作。
組合權(quán)限是為了方便設(shè)置提供的對單個權(quán)限的組合。比如對某用戶一次設(shè)置某板塊的“讀”和“發(fā)布”2種權(quán)限。
前2種權(quán)限是一個緯度的劃分,后2個是另一個緯度的劃分。
如何鑒權(quán)?
鑒權(quán)的接口都會在CNMPermission中定義。對全局權(quán)限,直接返回對應的標志位的值,對于特定權(quán)限,則先判斷是否特定權(quán)限全開,否,則然后判斷其ArrayList中是否包含對應的對象編號。
如何賦權(quán)?
這里要承接到上述數(shù)據(jù)流程的第三步。由CNMPermissionFactory根據(jù)一定先后循序(其實無關(guān)順序,因為采用的為真覆蓋原則,即持久層返回的權(quán)限都是真值,后面的真值對前面的真值可覆蓋)從持久層獲得所有的全局權(quán)限和特定權(quán)限。mvnforum只有用戶和角色2種概念(當然也可以擴展),因此它的順序是:用戶全局全縣-〉用戶特定權(quán)限-〉角色全局全縣-〉角色特定權(quán)限。當然無論哪一部都是對同一個CNMPermission進行操作。
無論在設(shè)置全局權(quán)限還是特定權(quán)限的時候都可能會遇到所定義的組合權(quán)限。具體的組合權(quán)限拆分是由CNMPermissionImpl來做的.
相關(guān)的表結(jié)構(gòu):
?? member表,存貯用戶基本信息。
?? membergroup ,存儲用戶和組(角色)的對應關(guān)系。
?? groups表,存儲組/角色的基本信息
?? grouppermission,存儲組/角色的全局權(quán)限,字段為groupid permissionid
?? groupforum,存儲組/角色 的論壇權(quán)限, 字段為groupid ,forum,permissionid
?? memberpermission 存貯用戶的全局權(quán)限,字段為 memberid permissionid
?? memberforum 存貯用戶的論壇權(quán)限,字段為memberid ,forum,permissionid
? 修改于2006/12/16? 晚8時
posted on 2006-09-19 10:07 binge 閱讀(1553) 評論(0) 編輯 收藏 所屬分類: OPEN SOURCE