1. 程式人生 > >基於Spring框架應用的許可權控制系統的研究和實現

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

摘 要: Spring框架是一個優秀的多層J2EE系統框架,Spring本身沒有提供對系統的安全性支援。Acegi是基於Spring IOC 和 AOP機制實現的一個安全框架。本文探討了Acegi安全框架中各部件之間的互動,並通過擴充套件Acegi資料庫設計來實現基於Spring框架的應用的安全控制方法。

關鍵詞: Spring ;Acegi ;認證; 授權

一、引言

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

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

2.1 spring 框架

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

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所示。

三、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>

四、結束語

由於Spring在越來越多的專案中的應用,因此基於Spring應用的安全控制系統的研究就顯得非常重要。Acegi提供了對Spring應用安全的支援,然而 Acegi本身提供的例項並不能滿足大規模的複雜的許可權需求,本文通過擴充套件Acegi的資料庫設計即可滿足複雜的許可權需求。然而,怎樣將Acegi應用到非Spring的系統中,還有待進一步研究。

 

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


————END————

相關推薦

基於Spring框架應用許可權控制系統研究實現

摘 要: Spring框架是一個優秀的多層J2EE系統框架,Spring本身沒有提供對系統的安全性支援。Acegi是基於Spring IOC 和 AOP機制實現的一個安全框架。本文探討了Acegi安全框架中各部件之間的互動,並通過擴充套件Acegi資料庫設計來實現基於Spring框架的應用的安全控制方法。

基於SpringBoot框架許可權管理系統--sbed

基於SpringBoot框架的許可權管理系統,支援操作許可權和資料許可權,前後端分離,基於專案結構通過程式碼生成器可生成前端後臺部分程式碼,更加方便地進行二次開發。專案採用Maven構建,方便擴充套件自定義模組。 具體技術選型:Spring Boot 1.5,Apache

基於微信智慧家居控制系統研究與設計

摘 要 隨著人們物質生活水平的不斷提升,對家電智慧化控制的要求也逐漸提高。 目前的智慧家居系統主要通過家庭閘道器對家電進行室內控制,無法實現遠端遙 控,家電的使用情況也無法聯網查詢。雖然使用者可以使用手機直接控制家中電器, 但是需要安裝眾多的控制軟體,無形中增加了手機的負擔。

基於spring框架的webservice介面的開發除錯

1. 基本環境 tomcat6、spring、jdk1.7 2. 引入cxf的jar包 Spring框架整合webservice需要用到cxf框架,需要在pom.xml裡引入以下jar包 <dependency> <g

小專案:基於Struts框架的員工管理系統的java實現

1.匯入struts包 c3p0-0.9.1.2.jar commons-beanutils-1.8.3.jar commons-dbutils-1.6.jar commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commo

基於Dubbo框架的秒殺系統設計與實現-2

針對電影院線實際業務需求,設計出一套功能完整、效能高效穩定的秒殺系統。根據目標業務需求,將分散式框架Dubbo、Redis記憶體資料庫、分散式訊息佇列RocketMQ、Spring框架整合應用於秒殺系統,實現秒殺系統功能模組化,有效快速的利用閒置的硬體資源提高秒殺系統活

javaEE shiro框架許可權控制基於Spring框架的shiro許可權控制

許可權控制的方式: 方式一:通過過濾器或Struts2的攔截器實現許可權控制 方式二:為Struts2的Action加入註解(標識),然後為Action建立代理物件;代理物件進行許可權校驗,校驗通過後通過反射呼叫目標方法。 shiro框架可以進行認證、授權、會話管理、加

基於SSM框架的博客系統(二)博主登錄功能

erl 映射 import incr pac 加密 actor gets AC 一、 準備 1.數據庫 創建表db_blogger: 1 DROP TABLE IF EXISTS `t_blogger`; 2 3 CREATE TABLE `t_bl

基於Spring框架的Shiro配置(轉發:http://kdboy.iteye.com/blog/1103794)

alt work actor proxy post end url return images 一、在web.xml中添加shiro過濾器 Xml代碼 <!-- Shiro filter--> <filter> <

基於spring框架的jt項目小知識點(二)

pri align spring框架 基於 syslog getname 日誌 private .class 知識點匯總 1. 日誌記錄方法   private Logger log=   Logger.getLogger(SysLogServiceImpl.class.

基於SSH框架的電子新聞系統的設計與實現——論文隨筆(十二)

一、基本資訊 標題:基於SSH框架的電子新聞系統的設計與實現 時間:2015-05 出版源:電子科技大學 領域分類:系統架構和設計 二、研究背景 問題定義:新聞資訊採編和釋出的及時性和準確性較差,難以保證新聞的時效性,進而導致新聞資訊難以有效共享、缺乏高效統一控制。此外,隨著高校規模的擴大、高校合併,由

實戰:基於 Spring應用配置如何遷移至阿里雲應用配置管理 ACM

最近遇到一些開發者朋友,準備將原有的Java Spring的應用配置遷移到 阿里雲應用配置管理 ACM 中。遷移過程中,遇到不少有趣的問題。本文將通過一個簡單的樣例來還原遷移過程中遇到的問題和相關解決思路,以期達到和讀者交流的目的。 什麼樣的配置適合進入配置中心 這是所有準備遷移配置到配置中心的使用者遇到

基於spring框架的java開發中的異常處理

在springmvc框架的中異常處理的方式有兩種: 1,在控制器中使用@ExceptionHandler(xxxException.class)註解修飾一個方法,該註解能夠處理通一個控制器類中的丟擲的xxxExcepiton異常。 使用控制器通知註解@ControllerAdvice

實戰:基於 Spring應用配置如何遷移至阿裏雲應用配置管理 ACM

-s conf 統一 ges 編輯 配置 path 51cto 信息 最近遇到一些開發者朋友,準備將原有的Java Spring的應用配置遷移到 阿裏雲應用配置管理 ACM 中。遷移過程中,遇到不少有趣的問題。本文將通過一個簡單的樣例來還原遷移過程中遇到的問題和相關解決思路

一個基於MINA框架應用的最簡單例子

直接上程式碼。關於原理和主要的API以後在說。先能跑通了在說。 主要的包:mina-core-2.0.0.jar【到官網上下載完整專案包裡面還有文件和依賴包】,jcl-over-slf4j-1.5.11.jar,slf4j-api-1.5.11.jar,slf4j-nop-1.5.11.jar這

javaEE shiro框架許可權控制。通過註解的方式為方法配置訪問許可權

applicationContext.xml(Spring的核心配置檔案,開啟shiro框架的註解支援): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spring

javaEE shiro框架許可權控制。ehcache快取使用者許可權資料

匯入shiro框架的jar包和ehcache的jar包。 src/ehcache.xml(ehcache的配置檔案): <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:no

Spring框架及介紹控制反轉

什麼是Spring    Spring是一個開源框架,它由Rod Johnson建立。它是為了解決企業應用開發的複雜性而建立的。    Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。    然而,Spring的用途不僅限於伺服器端的開發。從簡單性

spring框架 (Ioc控制反轉)

重點: 1、什麼是Spring; 2、ioc的優勢; 3、Spring注入方式; 重點解析: 一、Spring是什麼,使用有什麼好處 什麼是spring,它能夠做什麼? Spring是一個開源框架,它由Rod Johnson建立。它是為了解決企業應用開發

MongoDB 許可權控制系統簡介

MongoDB 許可權控制系統簡介 許可權概念 要想理解清楚MongoDB的許可權必須先了解如下一些關鍵字 user 即使用者,用於提供客戶端連線MongoDB的認證賬戶 role 即角色,資料許可權的集合,建立使用者的時候必須要指定對應的角色,否則使用者無法操作