拾貝殼

          走過的路
          隨筆 - 39, 文章 - 1, 評論 - 14, 引用 - 0
          數(shù)據(jù)加載中……

          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

          主站蜘蛛池模板: 蕲春县| 孝义市| 涪陵区| 沽源县| 繁峙县| 葫芦岛市| 新民市| 宾川县| 高要市| 贵州省| 乌拉特中旗| 仪征市| 布拖县| 辛集市| 称多县| 宜兰市| 陆丰市| 寿宁县| 双柏县| 潼关县| 保定市| 香港 | 健康| 台东县| 汉中市| 文化| 鄂州市| 敦化市| 老河口市| 平度市| 苏尼特右旗| 刚察县| 福清市| 鄂托克前旗| 曲松县| 南投县| 剑川县| 车险| 卢龙县| 峨山| 江西省|