最近在研究安全性框架:acegi-security:
acegi安全系統(tǒng),是一個(gè)用于spring framework的安全框架,能夠和目前流行的web容器無縫集成。它使用了spring的方式提供了安全和認(rèn)證安全服務(wù),包括使用bean context,攔截器和面向接口的編程方式。因此,acegi安全系統(tǒng)能夠輕松地適用于復(fù)雜的安全需求。
安全涉及到兩個(gè)不同的概念,認(rèn)證和授權(quán)。前者是關(guān)于確認(rèn)用戶是否確實(shí)是他們所宣稱的身份。授權(quán)則是關(guān)于確認(rèn)用戶是否有允許執(zhí)行一個(gè)特定的操作。
在acegi安全系統(tǒng)中,需要被認(rèn)證的用戶,系統(tǒng)或代理稱為"principal"。acegi安全系統(tǒng)和其他的安全系統(tǒng)不同,它并沒有角色和用戶組的概念。
acegi系統(tǒng)設(shè)計(jì)
關(guān)鍵組件
acegi安全系統(tǒng)包含以下七個(gè)關(guān)鍵的功能組件:
l authentication對(duì)象,包含了principal,credential和principal的授權(quán)信息。同時(shí)還可以包含關(guān)于發(fā)起認(rèn)證請(qǐng)求的客戶的其他信息,如ip地址。
2 contextholder對(duì)象,使用threadlocal儲(chǔ)存authentication對(duì)象的地方。
3 authenticationmanager,用于認(rèn)證contextholder中的authentication對(duì)象。
4 accessdecissionmanager,用于授權(quán)一個(gè)特定的操作。
5 runasmanager,當(dāng)執(zhí)行特定的操作時(shí),用于選擇性地替換authentication對(duì)象。
6 secure object攔截器,用于協(xié)調(diào)authenticationmanager,accessdecissionmanager,runasmanager和特定操作的執(zhí)行。
7 objectdefinitionsource,包含了特定操作的授權(quán)定義。
安全管理對(duì)象
acegi安全系統(tǒng)目前支持兩類安全管理對(duì)象。
第一類的安全管理對(duì)象管理aop alliance的methodinvocation,開發(fā)人員可以用它來保護(hù)spring容器中的業(yè)務(wù)對(duì)象。為了使spring管理的bean可以作為methodinvocation來使用,bean可以通過proxyfactorybean和beannameautoproxycreator來管理,就像在spring的事務(wù)管理一樣使用。
第二類是filterinvocation。它用過濾器(filter)來創(chuàng)建,并簡(jiǎn)單地包裝了http的servletrequest,servletresponse和filterchain。filterinvocation可以用來保護(hù)http資源。通常,開發(fā)人員并不需要了解它的工作機(jī)制,因?yàn)樗麄冎恍枰獙ilter加入web.xml,acegi安全系統(tǒng)就可以工作了。
安全配置參數(shù)
每個(gè)安全管理對(duì)象都可以描述數(shù)量不限的各種安全認(rèn)證請(qǐng)求。例如,methodinvocation對(duì)象可以描述帶有任意參數(shù)的任意方法的調(diào)用,而filterinvocation可以描述任意的http url。
acegi安全系統(tǒng)需要記錄應(yīng)用于每個(gè)認(rèn)證請(qǐng)求的安全配置參數(shù)。例如,對(duì)于bankmanager.getbalance(int accountnumber)方法和bankmanager.approveloan(int applicationnumber)方法,它們需要的認(rèn)證請(qǐng)求的安全配置很不相同。
為了保存不同的認(rèn)證請(qǐng)求的安全配置,需要使用配置參數(shù)。從實(shí)現(xiàn)的視角來看,配置參數(shù)使用configattribute接口來表示。acegi安全系統(tǒng)提供了configattribute接口的一個(gè)實(shí)現(xiàn),securityconfig,它把配置參數(shù)保存為一個(gè)字符串。
configattributedefinition類是configattribute對(duì)象的一個(gè)簡(jiǎn)單的容器,它保存了和特定請(qǐng)求相關(guān)的configattribute的集合。
當(dāng)安全攔截器收到一個(gè)安全認(rèn)證請(qǐng)求時(shí),需要決定應(yīng)用哪一個(gè)配置參數(shù)。換句話說,它需要找出應(yīng)用于這個(gè)請(qǐng)求的configattributedefinition對(duì)象。這個(gè)查找的過程是由objectdefinitionsource接口來處理的。這個(gè)接口的主要方法是public configattributedefinition getattributes(object object),其中object參數(shù)是一個(gè)安全管理對(duì)象。因?yàn)榘踩芾韺?duì)象包含有認(rèn)證請(qǐng)求的詳細(xì)信息,所以objectdefinitionsource接口的實(shí)現(xiàn)類可以從中獲得所需的詳細(xì)信息,以查找相關(guān)的configattributedefiniton對(duì)象。
acegi如何工作
為了說明acegi安全系統(tǒng)如何工作,我們?cè)O(shè)想一個(gè)使用acegi的例子。通常,一個(gè)安全系統(tǒng)需要發(fā)揮作用,它必須完成以下的工作:
l 首先,系統(tǒng)從客戶端請(qǐng)求中獲得principal和credential;
2 然后系統(tǒng)認(rèn)證principal和credential信息;
3 如果認(rèn)證通過,系統(tǒng)取出principal的授權(quán)信息;
4 接下來,客戶端發(fā)起操作請(qǐng)求;
5 系統(tǒng)根據(jù)預(yù)先配置的參數(shù)檢查principal對(duì)于該操作的授權(quán);
6 如果授權(quán)檢查通過則執(zhí)行操作,否則拒絕。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。