記得大二暑假時曾經參加過一個OA系統的開發,在安全方面系統採取對擁有不同操作權限的用戶進行分組,也就是權限組或者叫用戶組,管理員可以控制用戶該做什麼,不該做什麼,但當時我只是負責其中的考勤系統設計,對這個並沒有太多關注。
不過最近想了想,決定進行一點簡單的設計。
從關係上看:
l 每個權限組可以包含多個操作,每個操作可以被多個權限組包含,即多對多關係
l 每個權限組可以包含多個用戶,每個用戶可以屬於多個權限組,也是多對多關係
l 操作可以有父操作和子操作(這些不多說)
表與表之間的關係描述如下:
權限組N--1 中間表(權限組—操作)1--N 操作
權限組N--1 中間表(權限組—用戶)1--N 用戶
字段名字 |
字段介紹 |
類型 |
外鍵 |
|
操作表 operate |
||||
Id |
主鍵 |
Int |
無 |
|
Operate_name |
操作名字 |
Char(255) |
無 |
|
Operate_link |
操作鏈接 |
Char(255) |
無 |
|
operate_userGroup_id |
對應中間表id |
Int |
外鍵(中間表(權限組—操作)) |
|
權限組 userGroup |
||||
Id |
主鍵 |
Int |
無 |
|
userGroup _name |
權限組名字 |
Var(255) |
無 |
|
userGroup_operate_id |
對應中間表id |
Int |
外鍵(中間表(權限組—操作)) |
|
userGroup _user_id |
對應中間表id |
Int |
外鍵(中間表(權限組—用戶)) |
|
用戶 user |
||||
Id |
主鍵 |
Int |
無 |
|
user_name |
用戶名 |
Char(255) |
無 |
|
password |
密碼 |
Char(255) |
無 |
|
user _ userGroup _id |
對應中間表id |
Int |
外鍵(中間表(權限組—用戶)) |
|
中間表(權限組—操作) userGroup _operate |
||||
Id |
主鍵 |
Int |
無 |
|
userGroup _id |
權限組ID |
Int |
無 |
|
operate_id |
操作ID |
Int |
無 |
|
中間表(權限組—用戶) userGroup _user |
||||
Id |
主鍵 |
Int |
無 |
|
userGroup _id |
權限組ID |
Int |
無 |
|
user_id |
用戶ID |
Int |
無 |
|
添加一個超級管理員 (admin,admin),具備所有操作權限
l 管理員登錄,C操作
l 創建權限組,C操作
l 創建操作,C操作
l 創建用戶,C操作
l 向權限組添加操作,C操作
l 爲操作分配權限組,C操作
l 向權限組添加用戶,C操作
l 爲用戶分配權限組,C操作
l 當用戶進行一個操作時,會向目的地發出對應於該操作的編號ID,目的地接受到這個ID後,首先判斷該操作是否在表中存在,若存在就檢查該用戶所在權限組是否包含此操作,包含則執行此操作
l 此外,對操作,權限組,用戶以及用戶之間的關係也需要進行動態的管理,例如CRUD
測試
用戶登錄
執行某項操作
根據權限看是否執行成功
用戶權限驗證流程
在J2EE結構中,通常我們可以在控制器如Servlet或者Action來對所有用戶的權限進行統一的校驗(當然過濾器也是個不錯的選擇),來對用戶操作進行統一的處理,比如說在一個Jsp+Servlet+JavaBean的B/S系統中,通常我們是由Servlet作爲控制器的,那麼我們就可以設計一個BaseServlet,
對裏面的doPost(HttpServletRequest request,HttpServletResponse response)這樣設計
/**
* 這個doPost方法現在對權限進行校驗
*/
Public void doPost(HttpServletRequest request,HttpServletResponse response){
//獲取操作ID
Int operateId =new ParseRequest().parseInt(request,”operateId”,0);
//判斷該操作是否存在數據庫中
If(new OperateService().isExist(operateId)){
//如果該操作存在於數據庫中的話
//獲取用戶ID
Int userId=(UserInfo)request.getSession().get(“USERINFO”).getId();
//判斷該用戶是否具備進行該操作得權限
If(new UserService().is Valid(userId,operateId)){
//該用戶可以進行此項操作
//轉向執行方法
Execute(request,response);
}else{
//發生錯誤,用戶無權限進行此操作
}
}else{
//發生錯誤,該操作不存在
}
}
/**
* 這個方法將被該類地子類實現,用來接收參數,調用Bean來完成一些操作
*/
Public void execute(HttpServletRequest request,HttpServletResponse response){
}
現在我們再開發Servlet的時候,只需要繼承這個BaseServlet,然後複寫Public void execute(HttpServletRequest request,HttpServletResponse response)方法,這樣就可以對權限操作進行有效的控制了,當然,筆者這裏建議最好你要跳轉到的jsp頁也採用Servlet進行轉發。