摘要:在Web開發中,權限往往是一個極其復雜的問題,針對不同的應用,需要根據項目的實際情況和具體架構,在維護性、靈活性、完整性等多個方面比較、權衡。本文簡要介紹了在Struts和Hibernate框架下基于角色的權限管理(RBAC)思想,提出了自定義標簽和Struts標簽相結合的方式,提高了系統的靈活性和安全性,達到MVC很好的分離。
關鍵詞:權限控制;標簽;角色
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)25-1552-02
Design and Implementation of User Access Control in SSMBSS
LI Ning
(Software Engineering, Tongji University, Shanghai 201804, China)
Abstract: In Web developing, access control is a more comprehensive problem, you should measure in agility, integrality ,maintenance and so on, according to different applications using framework and project conditions in practice. The text introduce Role Based Access Control (RBAC) in Struts and Hibernate framework briefly, mentioned the way of associate with user-defined tags and Struts tags, so as to increase the system agility security and separate the MVC mode.
Key words: access control; tags; role
1 引言
隨著網絡技術的發展與普及,高性能的Browser/Web Server/DB Server體系結構已經逐漸成為開發信息系統的主流選擇。而在B/S系統中, 有效的權限管理機制是合法地使用系統信息、充分發揮系統作用的一個前提。B/S系統的權限控制一般體現在根據業務需求限定用戶訪問的頁面和可執行的操作。
用戶權限控制是實現系統安全的一個重要方面。權限往往是一個極其復雜的問題,但也可以簡單的理解為邏輯表達式“who對what進行how的操作”是否為真。針對不同的應用,需要根據項目的實際情況和具體架構,在維護性、靈活性、完整性等多個方案之間比較權衡,選擇符合的方案。
2 權限控制方法
目前訪問權限的控制方法,一般有下列三種。
2.1 自主型訪問控制方法
目前在我國大多數的信息系統中的訪問控制模塊基本是借助于自主型訪問控制方法中的訪問控制列表(ACLs)。
2.2 強制型訪問控制方法
用于多層次安全級別的軍事應用。
2.3 基于驕色的訪問控制方法
近來基于角色的權限控制(Role Based Access Control,RBAC)模型得到了越來越廣泛的認同。所謂RBAC(角色訪問控制)就是基于“用戶—角色—許可”的設計思想,可簡單的用圖1來表示:一個用戶可以擁有多個角色、一個角色可以擁有多個許可。由于訪問許可與角色關聯,角色再與用戶關聯,實現了用戶與訪問許可的邏輯分離,從而很方便擴展系統的權限管理模塊。
■
圖1 1RBAC基本思想
3 SSMBSS的權限控制方法
上海軟件度量基準體系(SSMBSS)是對上海市、全國甚至世界范圍內的軟件項目或產品開發過程中的各種數據進行收集、整合和分析以得到軟件行業的各種度量指標,從而更有效的為軟件企業的項目管理及政府部門的決策提供支持。
系統用戶權限的控制涉及到整個系統的控制安全。此系統是基于Struts和Hibernate框架設計與實現的。該系統分為多個模塊,并不是所有用戶都能訪問這些模塊。簡單來說該系統分為 游客、普通用戶、企業用戶、高級用戶、數據錄入員、系統管理員等。我們可以采用基于角色的訪問控制方法來控制系統模塊功能,綜合模塊讀寫訪問權限和用戶類型的控制方式。為了安全起見,一定的用戶角色權限只在此用戶的類型范圍內,使之不能隨意越權,從一定角度來保障系統的安全。本系統采用自定義標簽來完成權限管理,標簽類有一個doStartTag方法,當它返回SKIP_BODY時,表示忽略標簽體的內容;SKIP_PAGE表示忽略剩下的頁面,EVAL_PAGE表示繼續執行下面的頁面。如下為doStartTag具體實現的片斷:
public int doStartTag() throws JspException {
HttpSession session = pageContext.getSession();
if (session == 1) {
try {
pageContext.forward(FRONT_PAGE);
} catch (Exception e) {
throw new JspException(e.toString());}
return SKIP_PAGE;}
Sysuser sysuser = (Sysuser) session.getAttribute(BEAN_NAME);
if (sysuser != 1) {
if (sysuser.getSuUsrType().equals(\"普通用戶\")) {
if (normalPriv != 1 normalPriv.equals(\"true\"))
return EVAL_PAGE;
else {
try {
pageContext.forward(FRONT_PAGE);
} catch (Exception e) {
throw new JspException(e.toString());}
return SKIP_BODY;}}
……}
具體做法如下:當用戶登陸時,把從數據庫中讀出的SysUser類型放入session,用戶操作相應模塊時都要先讀模塊中的自定義標簽,看看是否合法。以ProjectMang-ement.jsp為例:在頁面上出現了
對用戶操作菜單可以利用Struts的logic標簽進行分類操作,進一步防止越權操作的可能性。代碼如下:
4 防止非法的訪問或者攻擊
4.1 SQL注入攻擊SQL注入通過網頁對網站數據庫進行修改
它能夠直接在數據庫中添加具有管理員權限的用戶,從而最終獲得系統管理員權限。J2EE環境下避免SQL注入主要有兩種方式:在數據庫訪問層對數據庫進行操作時,用parameter的形式傳遞參數:對用戶輸入的字符進行過濾,將一些敏感或者特殊的字符過濾掉。本系統采用Hibernate參數綁定機制來避免上述問題,其參數綁定機制依賴于JDBC API中Prepared Statement的預定義SQL語句功能。總的來說,參數綁定機制有以下兩點:
1) 非常安全,防止懷有惡意的用戶非法調用數據庫系統的存儲過程。
2) 能夠利用底層數據庫預編譯SQL語句的功能,提高查詢數據的性能。預編譯是指底層數據庫系統只需編譯SQL語句一次,把編譯出來的可執行代碼保存在緩存中,如果多次執行相同形式的SQL語句,不需要重新編譯,只要從緩存中獲得可執行代碼即可。
4.2 跳過登陸頁面直接訪問
如果非法用戶獲得了應用系統內部頁面的地址(除登錄頁面以外),就可以通過直接在IE的地址欄中輸入內部頁面地址,來直接進入系統,從而跳過了驗證用戶合法性驗證的登錄頁面。此系統采用上文所說的自定義標簽的方式,在每一個頁面的頂部進行權限驗證,如果不符合權限的級別要求會直接跳轉到首頁。系統主界面是一個大的框架,在運行過程中,系統的功能頁面都在右框架之中動態加載,系統的彈出頁面也都因為Struts的action跳轉將地址欄屏蔽,這樣有效地防止了用戶直接獲得并訪問系統內部頁面地址。
5 結束語
本文在介紹了RBAC 的基礎上,設計了一種通用的用戶權限動態控制模型,并利用Struts和Hibernate框架介紹了其實現過程。該方案已在筆者開發的上海市軟件度量系統中得到了實現,其按照模塊不同劃分不同的角色,對每個角色分配不同的許可,并為不同的用戶指派不同的角色,實現了用戶與訪問權限邏輯分離,有利于系統的擴展和管理維護。
參考文獻:
[1] 孫衛琴. 精通Struts:基于MVC的Java Web設計與開發[M]. 北京:電子工業出版社,2004.
[2] 孫衛琴. 精通Hibernate:Java 對象持久化技術詳解[M]. 北京:電子工業出版社,2005.
[3] Alur D, Crupi J, Malks D. Core J2EE Patterns:Best Practices and Design Strategies.Pearson Education Inc, 2001.
[4] 李安志, 崔蔚, 徐永紅. 基于角色的網頁訪問權限控制方案[J]. 電腦與信息技術,2004 (6):4-7.
[5] 高正憲, 李中學. Web環境下基于角色的訪問控制策略及實現[J]. 計算機工程,2004 ,30 (8):133-135.