摘要:本文介紹了Struts的一些特點,闡述了三種常用的訪問控制的方法,說明了基于Struts權限管理系統的基本原理和實現的技術。
關鍵詞:Struts;權限;角色;用戶;資源
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)10-20ppp-0c
The Research and Implementation of STRUTS-based Privilege Management System
JIANG Shuang-lin
(Suzhou Art Design Technology Insitute, Suzhou 215000, China)
Abstract: This paper introduces some characteristics of Struts, and illustrates three methods to access control.The STRUTS-basedprivilege management system's basic principle and technology of implementation are proposed.
Key words: Struts;Permission;Role;User;Resource
1 引言
進入到21世紀,隨著網絡的迅速發展,對電子商務,電子政務和各種網絡應用系統有越來越高的要求,不僅能更充分地共享資源,同時更要求保護系統資源不受侵犯,更需要為適當的訪問者提供更合理的服務,要求系統必須要能夠控制:哪些訪問者能夠訪問系統的信息,訪問者訪問的是“什么信息”,訪問者對他所訪問的數據擁有什么樣的“權限”,這就涉及到網絡安全的重要內容:訪問控制。訪問控制是網絡安全防范和保護的主要核心策略,它的主要任務是保證網絡資源不被非法使用和訪問。本文首先介紹了訪問控制的一些方法,然后是Struts的介紹,最后闡述本系統的設計與實現等。
2 訪問控制

訪問控制技術是由美國國防部(Department of Defense, DoD)資助的研究和開發成果演變而來的。這一研究導致兩種基本類型訪問控制的產生:自主訪問控制(Discretionary Access Control, DAC)和強制訪問控制(Mandatory Access Control, MAC)。最近幾年,基于角色的訪問控制(Role Based Access Control,簡稱RBAC)也正得到廣泛的研究。
基于角色的訪問控制是指在應用環境中,通過對合法的訪問者進行角色認證來確定訪問者在系統中對哪類信息有什么樣的訪問權限。系統只問用戶是什么角色,而不管用戶是誰。角色可以理解成為其工作涉及相同行為和責任范圍內的一組人,一個訪問者可以扮演多個角色,一個角色也可以包含多個訪問者。角色訪問控制具有以下優點:便于授權管理、便于賦予最小特權、便于根據工作需要分級、責任獨立、便于文件分級管理、便于大規模實現。角色訪問是一種有效而靈活的安全措施,系統管理模式明確,節約管理開銷,當前流行的數據管理系統都采用了角色策略來管理權限。
3 Struts
Struts最早是作為Apache Jakarta項目的組成部分問世運作。項目的創立者希望通過對該項目的研究,改進和提高JSP、Servlet、標簽庫以及面向對象的技術水準。 Struts的優點主要集中體現在兩個方面:Taglib和頁面導航。Taglib是Struts的標記庫,靈活運用,能大大提高開發效率。關于頁面導航,將是今后的一個發展方向。事實上,這樣做,使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。
3.1 Struts實現MVC的機制[1]
下圖顯示了Struts實現的MVC框架。

3.1.1 模型(MODEL)
模型表示程序的狀態和業務邏輯,通常由JavaBean或EJB來實現。
3.1.2 視圖(VIEW)
視圖是通過一組JSP程序實現的。這些JSP程序中不包含業務邏輯,也不包括模型的信息。模型的信息是通過控制器傳遞的。在Struts中ActionForm 也被看成是視圖的一部分。
3.1.3 控制器(CONTROLLER)
控制器部分由ActionServlet和Action來實現。ActionServlet也就是Struts框架用來和Web容器交互的接口。該類是Struts框架的核心組件。ActionServlet繼承了HttpServlet類。它在MVC模型中扮演中央控制器的角色。ActionServlet主要負責接受HTTP請求信息,根據struts-config.xml文件的配置信息選擇合適Action來處理請求。并傳遞請求過程中的數據,這些數據是通過ActionForm傳遞的。Action本身也并不包含業務邏輯的處理代碼,它只是負責調用業務的處理代碼,調用這些代碼的方法在execute()方法中。該方法在調用業務處理以后會返回一個ActionForward對象來選擇對應的視圖。一般而言我們的Action必須直接或間接的繼承該類。然后重寫excecute()方法以完成我們自己的處理消息。
3.1.4 Struts的配置文件struts-config.xml
該文件實質是一個控制器和視圖的黏合劑,控制器之所以能夠選擇對應的視圖,以及視圖能夠通過對應的控制器查詢到模型中的數據都是依賴該文件。該文件是一個XML文件,在該配置文件中每Action都對應一個
4 系統設計原理系統設計原理
本系統主要是受基于角色的訪問控制(RBAC)原理啟發來進行設計。系統的核心體現在如下的E-R中。

用戶(User)[2]:權限的主體。按照RBAC理論,User擁有的權限只能通過賦予其Role,獲取Role的權限,User不直接接受權限,這樣和現實的職能部門相吻合,授權管理更有效、方便。
用戶組(UserGroup):權限的主體。和User類似,UserGroup 不直接接受權限。UserGroup是User的集合。UserGroup可以實現繼承,在創建UserGroup時指定其上級組。當某一User屬于某一UserGroup時,其就擁有該UserGroup的所有權限。這樣規則簡單,管理容易,更便于系統大規模的權限管理。從上面E-R圖可以看出,在邏輯結構上,User和UserGroup是多對多的關系,一個User可以屬于不同的UserGroup,一個UserGroup可以擁有不同的User。用戶組之間可以可以有上下級關系,對于用戶組可以通過設置parent_id(上級組id),將上級關聯起來,上、下級組之間是一對多的關系
角色(Role)[3]:擁有一定數量權限的抽象概念。在RBAC模型中Role是User、UserGroup和Permission的紐帶,從上面E-R圖可以看出,Role和User是多對多的關系,一個Role可以賦給多個User(例如一個部門的員工可能是同一種角色),一個User也可以擁有多個Role(例如身兼數職)。同樣一個Role可以賦給多個UserGroup,一個Usergroup也可以擁有多個Role。一個Role可以擁有多個Permission,一個Permission也可以分屬于多個Role中。角色的創建使用,分離了User、Usergroup和Permission,從程序設計上講結構更加清晰,從使用者來講更符合現實情形,管理權限更加有效,尤其是大型權限管理。
操作(Operation):操作。例如對于頁面資源有訪問、不可訪問類型;對于按鈕資源有可用、不可用等。
權限(Permission):描述對一種資源的訪問能力。對受保護的資源操作的訪問許可(Access Permission),是綁定在特定的資源實例上的。對應地,訪問策略(Access Strategy)和資源類別相關,不同的資源類別可能采用不同的訪問模式(Access Mode)。例如,頁面具有能打開、不能打開的訪問模式,按鈕具有可用、不可用的訪問模式,文本編輯框具有可編輯、不可編輯的訪問模式。單純的權限沒有任何意義。權限表中的權限類型和資源類型表中的資源類型相關。所以,本系統中,新增的權限必須選擇權限類型,也就是在資源類型表中確定權限類型。如果沒有某一種類型的資源,也就無從建立此種類型的權限。權限產生意義,必須和具體的資源實例發生關系,就是操作權限和資源表相關聯的資源權限表。
資源(Resource):資源之間存在父子關系(指定父資源id),父子之間是一對多的關系。刪除父資源,子資源一并被刪除。刪除某一資源,除了操作資源表外,還要操作資源權限表。
資源類型(Resourcetype):資源和資源類型是多對一的關系,也即一種資源類型可有許多資源實例。當刪除一個資源類型時,要刪除資源表中所有該類型的資源,還要刪除該權限類型的權限,更新和權限表相關聯的資源權限表、用戶權限表、角色權限表、用戶組權限表、權限操作表。
5 系統實現概述
本系統設計采用了Struts結構,結構較為清晰,后期維護更新較為方便。系統主要實現了登陸、用戶(組)、角色、權限、資源、資源類型、操作類型管理功能。在數據庫設計上,設計了用戶表、用戶組表、角色表、權限表、操作表、資源表、資源類型表,以及它們之間的關聯表(可參看圖3)。由于采用了Struts結構,故需要設計視圖、控制器、模型組件。在這些組件中,最核心的還是模型組件。系統中最關鍵的類為LoginBean、Userbean、ugbean、Rolebean、Permissionbean、Resourcebean、Operationbean、ResourceTypebean,它們實現的功能依次為:用戶的登陸管理、用戶組的登陸管理、角色管理、權限管理、資源管理、操作管理、資源類型管理。下面結合登陸管理和角色管理簡述其實現過程。
5.1 登陸管理
在用戶輸入用戶名和密碼后,系統首先進行簡單的表單驗證,包括用戶名、密碼是否為空,一旦為空,則返回登陸界面,重新輸入。當通過表單驗證后,進入控制器組件loginAction中,進行更為實質的驗證。loginAction調用模型組件loginBean的public boolean getTrue(String name,String password)方法來判斷用戶名、密碼是否匹配,若匹配則進入到主頁面,否則返回登陸界面。其中,loginBean的getTrue(String name,String password)方法,將訪問“用戶”表中的用戶名和密碼。在“用戶”表中存放的密碼,并不是明文,而是采用MD5算法加密后得到的字符串,所以在調用getTrue(String name,String password)方法前,在loginAction中將得到的明文密碼,用MD5算法計算得到新的字符串,將其作為getTrue的password參數。public boolean getTrue(String name,String password)的實現方法中關鍵sql語句如下:
\"select * from User where user_code='\"+username+\"' and user_password='\"+pass+\"'\";
5.2 角色管理
角色是系統中權限的抽象集合。應用系統中的使用角色,每個角色對應著一些特定的權限。角色和用戶之間是多對多的關系。一個用戶可以擁有多個角色,同時一個角色也可以賦給多個用戶。同樣,角色和用戶組也是多對多的關系。角色和權限也是多對多的關系。一個權限可能分屬于多個角色,同時一個角色可以擁有多個權限。角色的應用,使得權限管理更加清晰,維護更為方便。
角色管理主要提供:查詢、修改、刪除、新增功能。例如:
刪除角色:從表單中選擇相應的角色,點按刪除后,系統將刪除該角色。刪除了一個角色要同時更新和角色相關聯的用戶角色表、用戶組角色表、角色權限表。模型組件Rolebean中實現該功能的重要sql為:
\"delete from rel_role_user where role_id='\"+id+\"'\"; //刪除用戶角色關系
\"delete from rel_group_role where role_id='\"+id+\"'\"; //刪除用戶組角色關系
\"delete from rel_role_permission where role_id='\"+id+\"'\"; //刪除角色權限關系
\"delete from Role where role_id='\"+id+\"'\"; //刪除角色
6 結束語
本權限管理系統目前已可投入使用(某省高速公路合同管理系統中以使用了本系統)。本系統以Web方式對系統中的用戶(組)、資源、角色、權限等進行配置,外部Web通過系統提供的API來進行訪問控制,具有一定的通用性,但是RBAC的應用,還不是很充分。
參考文獻:
[1] 孫衛琴. 精通Struts:基于MVC的Java Web設計與開發[M]. 電子工業出版社,2004.8.
[2] 李興唐. 基于角色的權限管理系統[D]. 吉林大學研究生學位論文,2004.
[3] 王鑫. 基于角色的權限系統開發與應用[D]. 西南交通大學研究生學位論文,2005.
收稿日期:2008-03-04
作者簡介:姜雙林(1976-),男,江蘇省蘇州市人,講師,碩士,研究方向為計算機網絡。