基於Spring框架應用的權限控制系統的研究和實現

摘 要: Spring框架是一個優秀的多層J2EE系統框架,Spring自己沒有提供對系統的安全性支持。Acegi是基於Spring IOC 和 AOP機制實現的一個安全框架。本文探討了Acegi安全框架中各部件之間的交互,並經過擴展Acegi數據庫設計來實現基於Spring框架的應用的安全控制方法。html

關鍵詞: Spring ;Acegi ;認證; 受權web

1、引言

近年來,隨着Internet技術的迅猛發展,計算機網絡已深刻到了人們的工做、學習和平常生活中,因而,怎樣構建安全的web應用也成爲了當前最熱門的話題。Spring是一個基於IoC(Inversion of Control)和AOP(Aspect Oriented Programming)的構架多層J2EE應用系統的框架。Spring框架正在以其優良的特性吸引了愈來愈多的開發人員的關注,並在大量的系統開發中被使用。然而,現有的Spring框架自己並無提供對系統安全性的支持,本文經過介紹一種可用於Spring框架中的安全框架Acegi,並對在Spring框架中使用Acegi實現安全用戶認證和資源受權控制進行了較深刻的研究和擴展,同時給出了可行的解決方案。算法

2、Spring框架和Acegi安全框架介紹

2.1 spring 框架

Spring框架是由Open Source開發的一個優秀的多層J2EE系統框架,它爲企業級應用提供了一個很是輕量級的解決方案,大大地下降了應用開發的難度與複雜度,提升了開發的速度。spring

Spring框架的核心是IoC和AOP。IoC是一種設計模式,即IoC模式。IoC模式進一步下降了類之間的耦合度,而且改變了傳統的對象的建立方法,實現了一種配置式的對象管理方式,Spring框架中由IoC容器負責配置性的對象的管理。IoC模式極大的提升了系統開發與維護的靈活性。數據庫

AOP是一種編程模式,它是從系統的橫切面關注問題。傳統的面向對象編程OOP主要從系統的垂直切面對問題進行關注,對於系統的橫切面關注不多,或者說很難關注,這樣當考慮到系統的安全性、日誌、事務以及其餘企業級服務時,OOP就無能爲力了,只能在全部相關類中加入相似的系統服務級的代碼。AOP爲解決系統級服務問題提供了一種很好的方法。AOP將系統服務分解成方面看待,併爲類提供一種聲明式系統服務方式。Java類不須要知道日誌服務的存在也不須要考慮相關的代碼。因此,用AOP編寫的應用程序是鬆耦合的,代碼的複用性就提升了。編程

2.2 Acegi 安全框架

藉助於Spring框架,開發者可以快速構建結構良好的WEB應用,但現有的Spring框架自己沒有提供安全相關的解決方案。一樣來自於Open Source 社區的Acegi安全框架爲實現基於Spring框架的WEB應用的安全控制提供了一個很好的解決方案。Acegi自己就是利用Spring提供的IoC和AOP機制實現的一個安全框架,它將安全性服務做爲J2EE平臺中的系統級服務,以AOP Aspect形式發佈。因此藉助於Acegi安全框架,開發者可以在Spring使能應用中採用聲明式方式實現安全控制。設計模式

Acegi安全框架主要由安全管理對象、攔截器以及安全控制管理組件組成。安全管理對象是系統能夠進行安全控制的實體,Acegi框架主要支持方法和URL請求兩類安全管理對象;攔截器是Acegi中的重要部件,用來實現安全控制請求的攔截,針對不一樣的安全管理對象的安全控制請求使用不一樣的攔截器進行攔截;安全控制管理部件是實際實現各類安全控制的組件,對被攔截器攔截的請求進行安全管理與控制,主要組件包括實現用戶身份認證的AuthenticationManager、實現用戶受權的AccessDecisionManager 以及實現角色轉換的RunAsManager。安全管理對象、攔截器以及安全控制管理組件三者關係如圖1所示。緩存

3、Acegi安全框架在基於Spring框架的系統中的應用

3.1 分析系統安全性需求

首先,須要明確進行安全控制的對象,可爲業務方法和URL資源。安全

其次,須要進一步明確,系統身份認證資料和資源受權信息的數據持久化形式。網絡

3.2 Acegi安全系統數據庫設計

在Acegi框架中支持多種安全信息的持久化方式,能夠在配置文件中配置或存放在關係數據庫。因爲在實際應用中,需求是常常發生變化的。因此,在配置文件中配置是知足不了實際應用需求的。然而,Acegi自己對權限表的設計很是簡單,users表{username,password,enabled} 和authorities表{username,authority},這樣簡單的設計確定沒法適用複雜的權限需求。爲了解決權限管理的複雜性,在這裏引入了role(角色)的概念,使得用戶和權限分離,一個用戶擁有多個角色,一個角色擁有多個相應的權限,這樣就更靈活地支持安全策略。

同時,爲了更好地配合Acegi安全框架,還引入resource(資源)的概念,資源可分爲URL和FUNCTION(方法)兩種,一個權限能夠對應多個資源。具體的數據庫設計見圖2。


圖1 安全管理對象,攔截器和安全管理組件交互圖

圖2 Acegi安全控制系統數據庫設計

3.3 認證管理器,受權管理器的配置

實現系統的安全控制,首先須要對系統的安全管理器和受權管理器進行配置,系統進行認證和受權須要獲取安全信息,Acegi自己提供了對認證信息的獲取機制,在實現認證與受權過程當中,系統將主動根據配製信息和相應的信息解釋安全信息的讀取。圖3給出了一個將用戶安全信息存儲在數據庫中的認證管理器的配置示意圖。

對應於圖示的XML配置文件的代碼以下:

/* 配置數據庫datasource 和Acegi 的 jdbcDao */
<bean id=」dataSource」 class=」org.springframework.jdbc.datasource.DriverManagerDataSource」>
<property name=」driverClassName」>
<value>${jdbc.driverClassName}</value>
</property>
<property name=」url」>
<value>${jdbc.url}</value>
</property>

 


圖3 認證管理器配製示意圖
<property name=」username」>
<value>${jdbc.username}</value>
</property>
<property name=」password」>
<value>${jdbc.password}</value>
</property>
</bean>
<bean id=」jdbcDaoImpl」 class=」org.acegisecurity. roviders. dao.jdbc.JdbcDaoImpl」>
<property name=」dataSource」>
<ref bean=」dataSource」/>
</property>
</bean>
/*配置用戶信息的加密算法*/
<bean id=」passwordEncoder」 Class=」org.acegisecurity.providers.encoding.Md5passwordEncoder」/>
/*配置緩存有效時間*/
<bean id=」userCache」 class=」org.acegiSecurity. providers. dao.cache.EhCacheBasedUserCache」>//這裏對緩存有效時間進行設置
</bean>
/*配置daoAuthenticationProvider*/
<bean id=」daoAuthenticationProvider」 class=」org.acegisecurity.providers.dao.DaoAuthenticationProvider」>
<property name=」authenticationDao」>
<ref local=」JdbcDaoImpl」/>
</property>
<property name=」passwordEncoder」>
<ref local=」 passwordEncoder」/>
</property>
<property name=」userCache」>
<ref local=」 userCache」/>
</property>
</bean>
/*配置認證管理器*/
<bean id=」authenticationManager」 class=」org.acegisecurity. providers.ProviderManager」>
<property name=」providers」>
<list>
<ref local=」daoAuthenticationProvider」/>
</list>
</property>
</bean>

受權管理器的配置方法與認證管理器的配置基本相似,這裏再也不討論。

3.4 安全請求攔截器的配置

以上配置完成後,就須要配置安全攔截器。不一樣的安全管理對象須要使用不一樣的安全攔截器。對於方法級的安全認證須要使用的攔截器爲MethodSecurityInterceptor,而應用於URL資源的安全攔截器爲FilterSecurityInterceptor 。其中,MethodSecurityInterceptor攔截器是藉助於Spring Aop實現的,而FilterSecurityInterceptor攔截器是藉助於Servlet Filter 實現的。本文以URL資源請求的安全攔截器爲例說明配置狀況。

因爲URL資源請求安全攔截是藉助於過濾器進行的。所以首先要配置Acegi Servlet過濾器。過濾器相似於AOP Around裝備,實如今web資源調用先後進行的一些操做6種過濾器,他們依次構成Servlet過濾器鏈,依次處理客戶請求。須要注意的是過濾器配置的順序是不能交換的,當不須要使用某個過濾器時,可直接將其刪除和註釋。過濾器在web.xml中配置形式爲

<filter>
<filter-name>Acegi HTTP Request Security Filter</filter-name>
<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
<init-param>
<param-name>targetClass</param-name>
<param-value> Org.acegisecurity.intercept.web.SecurityEnforcementFilter </param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Acigi HTTP Request Security Filter</filter-name>
<url-pattern>/*</url-pattern> </filter-mapping>

在spring applicationContext.xml文件中的配置形式爲

<bean id=」securityEnforcementFilter」 class=」」>
<property name=」filterSecurityInterceptor」>
<ref bean=」filterInvocationInteceptor」/>
</property>
<property name=」authenticationEntryPoint」>
<ref bean=」authenticationProcessingFilterEntryPoint」/>
</property>

以上代碼是SecurityEnforcementFilter的配置,該過濾器對用戶是否有權訪問web資源做出最後的決定。其它的過濾器的配置類同。
配置完過濾器後,須要對攔截器FilterSecurityInterceptor進行配置,

<bean id=」filterInvocationInterceptor」 Class=」」>
<property name=」authenuserCacheticationManager」>1
<property name=」accessDecisionManager」>
<property name=」objectDefinitionSource」>
<ref local="filterObjectDefinitionSource"/>
</property>
<bean id="filterObjectDefinitionSource"
class="org.xiaohongli.acegi.db.DBFilterObjectDefinitionSource">
<constructor-arg><refbean="jdbcTemplate"/> 
</constructor-arg>
</bean>

objectDefinitionSource屬性定義了那些受保護的URL資源,其中引用了一個本地對象filterObjectDefinitionSource。   filterObjectDefinitionSource類從數據庫中讀取須要保護的URL安全信息,它擴展了PathBasedFilterInvocationDefinition Map類。

一樣,實現了另一個methodObjectDefinitionSource類從數據庫中讀取須要保護的FUNCTION資源,它擴展了MethodDefinitionMap類。限於篇幅,在這裏就不列出具體實現的源代碼。

<bean id="methodObjectDefinitionSource"
class="org.xiaohongli.acegi.db.DBMethodObjectDefinitionSource">
<constructor-arg><refbean="jdbcTemplate"/> 
</constructor-arg>
</bean>

4、結束語

因爲Spring在愈來愈多的項目中的應用,所以基於Spring應用的安全控制系統的研究就顯得很是重要。Acegi提供了對Spring應用安全的支持,然而 Acegi自己提供的實例並不能知足大規模的複雜的權限需求,本文經過擴展Acegi的數據庫設計便可知足複雜的權限需求。然而,怎樣將Acegi應用到非Spring的系統中,還有待進一步研究。

 

蘇先生ii:專一於Java開發技術的研究與知識分享!


————END————

原文出處:https://www.cnblogs.com/Java-no-1/p/11312011.html

相關文章
相關標籤/搜索