關於web系統的權限限定問題,可能有很多的辦法,我在這裡說一下自己的一些小技巧,起到拋磚引玉的作用,忘各位指正:
系統中一個角色包含多個用戶,角色和用戶之間最好采用一對多,以免發生混亂;
自系統初起的時候,系統只有一個超級用戶(例如root),有兩個默認角色,即游客角色和注冊用戶角色;
超級用戶可以在後續管理中添加角色,默認角色不能刪除,其他角色的刪除中如果這個角色下有用戶,可以采取不允許刪除或刪除後這些用戶的角色自動轉為注冊用戶角色;
每個角色用戶訪問系統某些功能模塊的權利,某個角色是否可以訪問某個功能模塊可以由超級用戶修改,這裡也包括默認角色所對應的權限模塊;
角色與系統模塊之間是多對多的關系,即一個角色可以訪問多個模塊,一個模塊可能有多個角色訪問;
我們這裡主要談struts,一個模塊包含多個action,action和模塊是多對一的關系;
這樣用戶訪問某個action時會映射到系統的某個模塊,這是系統取出當前用戶所在的角色,看看這個角色是否有訪問此模塊的權限,即可以實現struts中的權限設定;
這一過程主要包含以下幾塊:
1.系統的各個模塊在系統開發完畢後就會形成,這些模塊信息保存在持久媒體中;
2.struts-config.xml中,每個action的配置中都有一個role屬性,這個屬性中填寫一個模塊的名稱,這樣就建立起了action與模塊的多對一關系;
3.用戶、角色、模塊之間的映射關系通過數據庫表間的映射,這裡就不再多說;
4.擴展struts中的requestProcessor類(注意如果使用tiles框架,需要繼承另外一個tiles專用的類),復寫其中的processorRole方法(其他方法也很有用,例如preprocess方法,可以設置提交的字符串都為UTF-8,也可以用戶寫一些系統的訪問日志等等),在這個方法中可以取出當前action的模塊名稱和當前用戶的角色,這樣就可以實現對於用戶的權限限定了。
這樣就可以實現權限限定了,這個方法的優點是即便是從某些地方找到下載或者訪問某些重要功能的鏈接仍然可以攔截,缺點是每次訪問都需要判定,但做好適當的緩存即可,如何做緩存因各系統而異;如果有特殊需要還可以限定ip,甚至一個session對應一個id,如果換了ip則session立即銷毀,防止用戶轉貼了sessionid所假冒的用戶。
今天比較暈,很少寫這麼長的文章,大家先湊合看,有什麼問題歡迎指出,我會盡快修正。