原文:http://dev.yesky.com/127/2688127.shtml 作者:黎小紅注:Spring框架是一個(gè)優(yōu)秀的多層J2EE系統框架,Spring本身沒(méi)有提供對系統的安全性支持。
摘 要 Spring框架是一個(gè)優(yōu)秀的多層J2EE系統框架,Spring本身沒(méi)有提供對系統的安全性支持。Acegi是基于Spring IOC 和 AOP機制實(shí)現的一個(gè)安全框架。本文探討了Acegi安全框架中各部件之間的交互,并通過(guò)擴展Acegi數據庫設計來(lái)實(shí)現基于Spring框架的應用的安全控制方法。
關(guān)鍵詞 Spring ;Acegi ;認證; 授權
![]() 圖1 安全管理對象,攔截器和安全管理組件交互圖 ![]() 圖2 Acegi安全控制系統數據庫設計 |
| /* 配置數據庫datasource 和Acegi 的 jdbcDao */ <bean id=”dataSource” class=”org.springframework.jdbc.datasource.DriverManagerDataSource”> ?。紁roperty name=”driverClassName”> ?。紇alue>${jdbc.driverClassName}</value> ?。?property> ?。紁roperty name=”url”> ?。紇alue>${jdbc.url}</value> ?。?property> |
![]() 圖3 認證管理器配制示意圖 |
| <property name=”username”> ?。紇alue>${jdbc.username}</value> </property> <property name=”password”> ?。紇alue>${jdbc.password}</value> </property> </bean> <bean id=”jdbcDaoImpl” class=”org.acegisecurity. roviders. dao.jdbc.JdbcDaoImpl”> ?。紁roperty name=”dataSource”> ?。紃ef bean=”dataSource”/> ?。?property> </bean> /*配置用戶(hù)信息的加密算法*/ <bean id=”passwordEncoder” Class=”org.acegisecurity.providers.encoding.Md5passwordEncoder”/> /*配置緩存有效時(shí)間*/ <bean id=”userCache” class=”org.acegiSecurity. providers. dao.cache.EhCacheBasedUserCache”> …//這里對緩存有效時(shí)間進(jìn)行設置 </bean> /*配置daoAuthenticationProvider*/ <bean id=”daoAuthenticationProvider” class=”org.acegisecurity.providers.dao.DaoAuthenticationProvider”> ?。紁roperty name=”authenticationDao”> ?。紃ef local=”JdbcDaoImpl”/> ?。?property> ?。紁roperty name=”passwordEncoder”> ?。紃ef local=” passwordEncoder”/> ?。?property> ?。紁roperty name=”userCache”> ?。紃ef local=” userCache”/> ?。?property> </bean> /*配置認證管理器*/ <bean id=”authenticationManager” class=”org.acegisecurity. providers.ProviderManager”> ?。紁roperty name=”providers”> ?。糽ist> ?。紃ef local=”daoAuthenticationProvider”/> ?。?list> ?。?property> </bean> |
授權管理器的配置方法與認證管理器的配置基本類(lèi)似,這里不再討論。
4、安全請求攔截器的配置
以上配置完成后,就需要配置安全攔截器。不同的安全管理對象需要使用不同的安全攔截器。對于方法級的安全認證需要使用的攔截器為MethodSecurityInterceptor,而應用于URL資源的安全攔截器為FilterSecurityInterceptor 。其中,MethodSecurityInterceptor攔截器是借助于Spring Aop實(shí)現的,而FilterSecurityInterceptor攔截器是借助于Servlet Filter 實(shí)現的。本文以URL資源請求的安全攔截器為例說(shuō)明配置情況。
由于URL資源請求安全攔截是借助于過(guò)濾器進(jìn)行的。因此首先要配置Acegi Servlet過(guò)濾器。過(guò)濾器類(lèi)似于A(yíng)OP Around裝備,實(shí)現在web資源調用前后進(jìn)行的一些操作6種過(guò)濾器,他們依次構成Servlet過(guò)濾器鏈,依次處理客戶(hù)請求。需要注意的是過(guò)濾器配置的順序是不能交換的,當不需要使用某個(gè)過(guò)濾器時(shí),可直接將其刪除和注釋。過(guò)濾器在web.xml中配置形式為
| <filter> ?。糵ilter-name>Acegi HTTP Request Security Filter</filter-name> ?。糵ilter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class> ?。糹nit-param> ?。紁aram-name>targetClass</param-name> ?。紁aram-value> Org.acegisecurity.intercept.web.SecurityEnforcementFilter ?。?param-value> ?。?init-param> </filter> <filter-mapping> ?。糵ilter-name>Acigi HTTP Request Security Filter</filter-name> ?。紆rl-pattern>/*</url-pattern> </filter-mapping> |
在spring applicationContext.xml文件中的配置形式為
| <bean id=”securityEnforcementFilter” class=””> ?。紁roperty name=”filterSecurityInterceptor”> ?。紃ef bean=”filterInvocationInteceptor”/> ?。?property> ?。紁roperty name=”authenticationEntryPoint”> ?。紃ef bean=”authenticationProcessingFilterEntryPoint”/> ?。?property> |
以上代碼是SecurityEnforcementFilter的配置,該過(guò)濾器對用戶(hù)是否有權訪(fǎng)問(wèn)web資源作出最后的決定。其它的過(guò)濾器的配置類(lèi)同。配置完過(guò)濾器后,需要對攔截器FilterSecurityInterceptor進(jìn)行配置,
| <bean id=”filterInvocationInterceptor” Class=””> ?。紁roperty name=”authenuserCacheticationManager”>1 ?。紁roperty name=”accessDecisionManager”> ?。紁roperty name=”objectDefinitionSource”> ?。紃ef local="filterObjectDefinitionSource"/> ?。?property> <bean id="filterObjectDefinitionSource" class="org.xiaohongli.acegi.db.DBFilterObjectDefinitionSource"> ?。糲onstructor-arg><refbean="jdbcTemplate"/> ?。?constructor-arg> </bean> |
objectDefinitionSource屬性定義了那些受保護的URL資源,其中引用了一個(gè)本地對象filterObjectDefinitionSource。filterObjectDefinitionSource類(lèi)從數據庫中讀取需要保護的URL安全信息,它擴展了PathBasedFilterInvocationDefinition Map類(lèi)。同樣,實(shí)現了另外一個(gè)methodObjectDefinitionSource類(lèi)從數據庫中讀取需要保護的FUNCTION資源,它擴展了MethodDefinitionMap類(lèi)。限于篇幅,在這里就不列出具體實(shí)現的源代碼。
| <bean id="methodObjectDefinitionSource" class="org.xiaohongli.acegi.db.DBMethodObjectDefinitionSource"> <constructor-arg><refbean="jdbcTemplate"/> </constructor-arg> </bean> |
結束語(yǔ)
由于Spring在越來(lái)越多的項目中的應用,因此基于Spring應用的安全控制系統的研究就顯得非常重要。Acegi提供了對Spring應用安全的支持,然而 Acegi本身提供的實(shí)例并不能滿(mǎn)足大規模的復雜的權限需求,本文通過(guò)擴展Acegi的數據庫設計即可滿(mǎn)足復雜的權限需求。然而,怎樣將Acegi應用到非Spring的系統中,還有待進(jìn)一步研究。
聯(lián)系客服