程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 基於AOP的角色訪問控制模型設計與實現

基於AOP的角色訪問控制模型設計與實現

編輯:關於JAVA

當前,隨著信息技術的不斷發展,對於資源的安全訪問與管理已經成為了一個急需解決的問題。訪問控制正是基於通過對主體進行相應的權限設計,讓主體在一定的權限設計框架內對客體信息資源進行訪問的一種方法,它依賴於鑒別使主體合法化,並將組成員關系和特權與主體聯系起來。只有經授權的用戶,才允許訪問特定的系統資源 。對於現在所有開發的Web信息系統來說,沒有訪問控制的功能將是不可想象的訪問控制的實現方法有很多種,傳統的訪問控制方法主要有自主型訪問控制和強制型訪問控制,這兩種訪問控制方法雖然解決了Web系統的安全問題,但也會使系統的安全管理更為復雜,管理開銷增大。角色訪問控制理論的提出,為訪問控制提供了一種良好的解決方案。角色訪問控制能夠較好地減少權限管理復雜性,並能夠很好地提供與企業組織結構相一致的安全策略。技術是一種新型的軟件設計方法它通過將AOP ,訪問控制、日志記錄和事務管理等非系統功能模塊從主功能模塊中分離出來使軟件具有更好的松散耦合性、適應性和可維護性是當前軟件開發中的發展方向和趨勢。文中根據 的基本模型給出了一個基RBAC ,於角色表單的訪問控制模型的設計並采用了AOP技術給出了實現方案。

1 基礎知識概述

1.1 角色訪問控制(RBAC)

基於角色的訪問控制是美國NIST(NationalInsti2tuteofStandardsandTechnology)於20世紀90年代初

提出的一種新的訪問控制技術。該技術主要研究將用戶劃分成與其在組織結構體系相一致的角色,以減少授權管理的復雜性,降低管理開銷和為管理員提供一個比較好的實現復雜安全政策的環境。RBAC主要由用戶集(user)、角色集(role)、權限集(permission)及會話集(session)等實體組成,用戶與角色之間、角色與權限之間都是多對多的關系,采用RBAC的最大好處在於將用戶和它所具有的權限分離開來,可以將用戶的授權和權限的劃分進行分別處理。

現階段,RBAC主要有兩種實現級系統級別,一種是應用程序級別。當前,由於B/S架構的流行,針對Web信息系統的角色訪問控制已經成為了一個研究熱點。文中主要討論基於應用程序級別的Web信息系統中的角色訪問控制模型的設計與實現。

1.2 面向方面編程(AOP)及ASPectJ

在傳統的編程方法中,常常將軟件的業務邏輯作為軟件設計的主線,即核心關注點(也稱問題領域關注) ,但是,在軟件中常常還包含許多系統級的關注點(也稱解題領域關注) ,比如系統安全性、日志記錄、事務完整性等。按照面向對象的編程思想,很難將核心關注點與系統級關注點完全分離,從而產生了實現多種關注的代碼相互穿插,程序因缺乏抽象性、封裝性而導致程序難以理解、難以維護。通常將這類混合與散亂於多個模塊的系統關注點,稱為橫切(crosscutting)關注點。AOP是一種能有效管理、分離橫切關注點的程序設計方法學,是面向對象編程思想的一種有效補充AOP通過引入方面(ASPect)這種新的模塊單元來實現橫切關注點。在設計和實現系統時,將橫切關注模塊織入(weaving)與其相關的核心關注模塊中,從而實現了橫切關注模塊與核心關注模塊的有效分離,使開發人員能夠輕松地構造松散耦合的軟件系統 。

AspectJ是AOP在Java語言上的一種實現,是最成熟與最具代表性的AOP語言工具 。AspectJ是ava語言的無縫擴展,這使得所有符合規范的Java虛擬機都可以解釋、執行其所生成的代碼。同時,ASPect還提供了與流行IDE的集成,因此,對於Java開發者而言,ASPect是一個很有用的AOP實現。

2 基於AOP的角色-表單訪問控制模型的實現

2.1 基於角色-表單的角色訪問控制模型近年來,B/S架構已經成為信息系統的主流,而由於在RBAC模型中,用戶與角色、角色與權限之間多對多關系的存在,RBAC模型在Web應用中的復雜性也越來越明顯。一般基於Web的信息系統體系結構分為三層:第一層為頁面表示層,第二層為業務邏輯層,第三層為數據層。在三層架構中,與用戶直接交互的就是頁面表示層,而用戶主要是通過與頁面中的表單(Form)或按鈕來與服務器進行交互,因此,一個系統中訪問控制的最小單位應該是表單或按鈕。

2.2 數據庫設計

根據以上基於表單的角色訪問控制模型,在實際的系統開發中,建立了相應的角色-用戶-權限的數

據表單,詳細說明如下:

用戶表(user):保存用戶ID、用戶名及密碼等字段;

角色表(role):保存角色ID、角色名稱等字段;

用戶角色分配表(userRole):用於保存用戶的角色信息,主要有用戶ID、角色ID、用戶名、角色名稱等字段權限表(permission):用於保存系統中相關的表單功能信息,與後台中的表單處理功能相對應。

角色權限配置表(rolePermission):保存不同角色對應的不同權限信息,主要有角色ID、角色名稱、是否

有訪問權限等字段信息。

2.3 具體實現

在傳統的OOP實現方法中,往往會將所有的角色權限檢查等相關方法都放在Action類中,致使所有的

訪問控制相關代碼都散亂地分布在響應的業務類中,而且在各個業務類中都必須加入相關的權限檢查代

碼,導致程序可重用性低,調試及維護代碼都變得十分繁雜,不利於軟件開發。針對於此,在該Web信息系

統中,將訪問控制模塊作為一個橫切關注點,通過引入aspect,將角色訪問控制相關代碼從相關的功能模塊中抽取出來,單獨形成一個aspect,然後用ASPectJ的編譯器將訪問控制模塊織入主功能模塊中,有效地分離

了主要功能模塊和訪問控制模塊,取得了較好的效果。一般來說,安全相關的模塊或者說作為橫切關注

點的模塊總是放在最後完成的,當完成了主程序功能之後,可以選擇在IDE中將普通的Web工程轉換為AspectJ工程,這樣AspectJ程序就能在編譯時被織入應用程序,並得到應用。下面以對程序中的一個模塊的角色訪問控制的實現為例來展現如何利用ASPectJ來實現對應用程序的角色訪問控制。首先介紹幾個主要的類:

LoginUsrForm:用戶登陸系統時,該類獲取用戶輸入的用戶名及密碼等相關信息;

LoginUsrAction:執行相關的業務邏輯;

LoginUsrASPect:定義一個方面,擴展LoginUsrAction類,加入LoginPermission()方法,判斷用戶是否為系統的合法用戶;加入FormPermission()方法,根據用戶-角色-權限表關系,判斷是否用戶有訪問表單的權限;聲明一個連接點,當用戶訪問登錄表單時,通知該方面進行權限檢查;

FunctionOneAction:執行相關的業務邏輯;

FunctionOneAspect:定義一個方面,聲明一個連接點,當用戶訪問FunctionOneForm表單時,通知該方面進行權限檢查。在AspectJ中,可以使用靜態橫切技術,以靜態方式使用ASPectJ中的方面把方法和屬性引入現有的類

中,相當於在現有的類中加入了新的方法和屬性。在LoginUsrASPect中,首先擴展LoginUsrAction類,為其增加方法LoginPermission(Stringname,StrinpassWord)(根據用戶名和密碼判斷用戶是否有合法登陸系統的權限)和方法permission(Stringrole)(根據用戶所屬角色擁有的權限來發還給用戶相對應的頁面)。

代碼片段如下:

(

PublicBooleanLoginUsrAction.LoginPermission Stringname,

StringpassWord)

{

LoginUsrDAOlogindao=newLoginUsrDAO();

Permission=logindao.bool(name,passWord);

Returnpermission;

}

publicBooleanLoginUsrAction.permission(Stringrole)

{

Permission=rolePermissionDAO.getPermissionByRole(role);

returnpermission;

}

然後,在FunctionOneASPect中聲明一個連接點

(joinpoint),當執行FunctionOneAction的execute()方

法時,通知該方面進行權限檢查。以下是代碼片段:

//當執行execute()方法時,調用該ASPectpublicpointcutPermissionCheck():execution(ActionForwardFunc

2

tionOneAction.execute());

ActionForwardaround():PermissionCheck()

{

Booleanpermission=loginUsrAction.permission(role);

if(permission){

返回原始連接點繼續執行在 類中默認有

// ; FunctionOneAction ,

權限訪問該頁面

returnproceed(mapping,form,request,response);

}else

{

//用戶無權限,調用failure.JSP

Returnmapping.findForward(“failure”);

}

}

從以上分析可以看出,利用面向方面編程可以將角色訪問控制模塊與主功能模塊完全分離,但在一個Web信息系統中,頁面表單的數量常常很大,如果表單過多,容易造成管理和維護上的困難,基於此,As2pectJ提供了強大的連接點捕獲功能,能夠通過利用通配符以及布爾表達式來實現在一個方面中一次捕獲多個連接點。比如,要捕獲在一個package中的所有以

Action結尾的類的execute()方法,可以作如下聲明 :

pointcutcallPointcut():call(void3Action.execute())通過這種方法,可以把類似的訪問控制代碼都放在一個方面中,極大地提高了程序的可重用性。總的來說,通過應用ASPectJ進行角色訪問控制的實現,能夠減少代碼的繁雜性,提高軟件代碼的可重用性及可維護性。同時,如果當安全策略需要變動時,只階次具有很高的敏感性,在不知道確切的分數階微積分運算階次的情況下,無法提取出嵌入的水印信息。該仿真實例中,水印提取端與水印嵌入端使用的分數階微積分運算階次差值僅為v1-v2=0.00001。如果運算階次的差值v1-v2進一步地減小,那麼在水印嵌入過程中,應該選擇偽隨機序列x(n)的起始n值更大的一段取值范圍,以保證水印提取端無法恢復水印信息。理論上對於這種敏感性的精度為無限小,因為無論(v1-v2)多麼小,總可以找到足夠大的一段n值范圍,使其滿足兩組序列的差值足夠大,從而無法提取出水印。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved