最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring框架應(yīng)用的權(quán)限控制系統(tǒng)詳解

 更新時間:2019年08月07日 08:27:40   作者:蘇先生ii  
在本篇文章里小編給大家整理的是關(guān)于基于Spring框架應(yīng)用的權(quán)限控制系統(tǒng)的研究和實(shí)現(xiàn),需要的朋友們可以學(xué)習(xí)下。

Spring框架是一個優(yōu)秀的多層J2EE系統(tǒng)框架,Spring本身沒有提供對系統(tǒng)的安全性支持。Acegi是基于Spring IOC 和 AOP機(jī)制實(shí)現(xiàn)的一個安全框架。本文探討了Acegi安全框架中各部件之間的交互,并通過擴(kuò)展Acegi數(shù)據(jù)庫設(shè)計來實(shí)現(xiàn)基于Spring框架的應(yīng)用的安全控制方法。

一、引言

近年來,隨著Internet技術(shù)的迅猛發(fā)展,計算機(jī)網(wǎng)絡(luò)已深入到了人們的工作、學(xué)習(xí)和日常生活中,于是,怎樣構(gòu)建安全的web應(yīng)用也成為了當(dāng)前最熱門的話題。Spring是一個基于IoC(Inversion of Control)和AOP(Aspect Oriented Programming)的構(gòu)架多層J2EE應(yīng)用系統(tǒng)的框架。Spring框架正在以其優(yōu)良的特性吸引了越來越多的開發(fā)人員的關(guān)注,并在大量的系統(tǒng)開發(fā)中被使用。然而,現(xiàn)有的Spring框架本身并沒有提供對系統(tǒng)安全性的支持,本文通過介紹一種可用于Spring框架中的安全框架Acegi,并對在Spring框架中使用Acegi實(shí)現(xiàn)安全用戶認(rèn)證和資源授權(quán)控制進(jìn)行了較深入的研究和擴(kuò)展,同時給出了可行的解決方案。

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

Spring框架是由Open Source開發(fā)的一個優(yōu)秀的多層J2EE系統(tǒng)框架,它為企業(yè)級應(yīng)用提供了一個非常輕量級的解決方案,大大地降低了應(yīng)用開發(fā)的難度與復(fù)雜度,提高了開發(fā)的速度。

Spring框架的核心是IoC和AOP。IoC是一種設(shè)計模式,即IoC模式。IoC模式進(jìn)一步降低了類之間的耦合度,并且改變了傳統(tǒng)的對象的創(chuàng)建方法,實(shí)現(xiàn)了一種配置式的對象管理方式,Spring框架中由IoC容器負(fù)責(zé)配置性的對象的管理。IoC模式極大的提高了系統(tǒng)開發(fā)與維護(hù)的靈活性。

AOP是一種編程模式,它是從系統(tǒng)的橫切面關(guān)注問題。傳統(tǒng)的面向?qū)ο缶幊蘋OP主要從系統(tǒng)的垂直切面對問題進(jìn)行關(guān)注,對于系統(tǒng)的橫切面關(guān)注很少,或者說很難關(guān)注,這樣當(dāng)考慮到系統(tǒng)的安全性、日志、事務(wù)以及其他企業(yè)級服務(wù)時,OOP就無能為力了,只能在所有相關(guān)類中加入類似的系統(tǒng)服務(wù)級的代碼。AOP為解決系統(tǒng)級服務(wù)問題提供了一種很好的方法。AOP將系統(tǒng)服務(wù)分解成方面看待,并為類提供一種聲明式系統(tǒng)服務(wù)方式。Java類不需要知道日志服務(wù)的存在也不需要考慮相關(guān)的代碼。所以,用AOP編寫的應(yīng)用程序是松耦合的,代碼的復(fù)用性就提高了。

2.2 Acegi 安全框架

借助于Spring框架,開發(fā)者能夠快速構(gòu)建結(jié)構(gòu)良好的WEB應(yīng)用,但現(xiàn)有的Spring框架本身沒有提供安全相關(guān)的解決方案。同樣來自于Open Source 社區(qū)的Acegi安全框架為實(shí)現(xiàn)基于Spring框架的WEB應(yīng)用的安全控制提供了一個很好的解決方案。Acegi本身就是利用Spring提供的IoC和AOP機(jī)制實(shí)現(xiàn)的一個安全框架,它將安全性服務(wù)作為J2EE平臺中的系統(tǒng)級服務(wù),以AOP Aspect形式發(fā)布。所以借助于Acegi安全框架,開發(fā)者能夠在Spring使能應(yīng)用中采用聲明式方式實(shí)現(xiàn)安全控制。

Acegi安全框架主要由安全管理對象、攔截器以及安全控制管理組件組成。安全管理對象是系統(tǒng)可以進(jìn)行安全控制的實(shí)體,Acegi框架主要支持方法和URL請求兩類安全管理對象;攔截器是Acegi中的重要部件,用來實(shí)現(xiàn)安全控制請求的攔截,針對不同的安全管理對象的安全控制請求使用不同的攔截器進(jìn)行攔截;安全控制管理部件是實(shí)際實(shí)現(xiàn)各種安全控制的組件,對被攔截器攔截的請求進(jìn)行安全管理與控制,主要組件包括實(shí)現(xiàn)用戶身份認(rèn)證的AuthenticationManager、實(shí)現(xiàn)用戶授權(quán)的AccessDecisionManager 以及實(shí)現(xiàn)角色轉(zhuǎn)換的RunAsManager。安全管理對象、攔截器以及安全控制管理組件三者關(guān)系如圖1所示。

三、Acegi安全框架在基于Spring框架的系統(tǒng)中的應(yīng)用 3.1 分析系統(tǒng)安全性需求

首先,需要明確進(jìn)行安全控制的對象,可為業(yè)務(wù)方法和URL資源。

其次,需要進(jìn)一步明確,系統(tǒng)身份認(rèn)證資料和資源授權(quán)信息的數(shù)據(jù)持久化形式。

3.2 Acegi安全系統(tǒng)數(shù)據(jù)庫設(shè)計

在Acegi框架中支持多種安全信息的持久化方式,可以在配置文件中配置或存放在關(guān)系數(shù)據(jù)庫。由于在實(shí)際應(yīng)用中,需求是經(jīng)常發(fā)生變化的。所以,在配置文件中配置是滿足不了實(shí)際應(yīng)用需求的。然而,Acegi本身對權(quán)限表的設(shè)計非常簡單,users表{username,password,enabled} 和authorities表{username,authority},這樣簡單的設(shè)計肯定無法適用復(fù)雜的權(quán)限需求。為了解決權(quán)限管理的復(fù)雜性,在這里引入了role(角色)的概念,使得用戶和權(quán)限分離,一個用戶擁有多個角色,一個角色擁有多個相應(yīng)的權(quán)限,這樣就更靈活地支持安全策略。

同時,為了更好地配合Acegi安全框架,還引入resource(資源)的概念,資源可分為URL和FUNCTION(方法)兩種,一個權(quán)限可以對應(yīng)多個資源。具體的數(shù)據(jù)庫設(shè)計見圖2。


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

圖2 Acegi安全控制系統(tǒng)數(shù)據(jù)庫設(shè)計

3.3 認(rèn)證管理器,授權(quán)管理器的配置

實(shí)現(xiàn)系統(tǒng)的安全控制,首先需要對系統(tǒng)的安全管理器和授權(quán)管理器進(jìn)行配置,系統(tǒng)進(jìn)行認(rèn)證和授權(quán)需要獲取安全信息,Acegi本身提供了對認(rèn)證信息的獲取機(jī)制,在實(shí)現(xiàn)認(rèn)證與授權(quán)過程中,系統(tǒng)將主動根據(jù)配制信息和相應(yīng)的信息解釋安全信息的讀取。圖3給出了一個將用戶安全信息存儲在數(shù)據(jù)庫中的認(rèn)證管理器的配置示意圖。

對應(yīng)于圖示的XML配置文件的代碼如下:

/* 配置數(shù)據(jù)庫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 認(rèn)證管理器配制示意圖
<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”>
…//這里對緩存有效時間進(jìn)行設(shè)置
</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>
/*配置認(rèn)證管理器*/
<bean id=”authenticationManager” class=”org.acegisecurity. providers.ProviderManager”>
<property name=”providers”>
<list>
<ref local=”daoAuthenticationProvider”/>
</list>
</property>
</bean>

授權(quán)管理器的配置方法與認(rèn)證管理器的配置基本類似,這里不再討論。

3.4 安全請求攔截器的配置

以上配置完成后,就需要配置安全攔截器。不同的安全管理對象需要使用不同的安全攔截器。對于方法級的安全認(rèn)證需要使用的攔截器為MethodSecurityInterceptor,而應(yīng)用于URL資源的安全攔截器為FilterSecurityInterceptor 。其中,MethodSecurityInterceptor攔截器是借助于Spring Aop實(shí)現(xiàn)的,而FilterSecurityInterceptor攔截器是借助于Servlet Filter 實(shí)現(xiàn)的。本文以URL資源請求的安全攔截器為例說明配置情況。

由于URL資源請求安全攔截是借助于過濾器進(jìn)行的。因此首先要配置Acegi Servlet過濾器。過濾器類似于AOP Around裝備,實(shí)現(xiàn)在web資源調(diào)用前后進(jìn)行的一些操作6種過濾器,他們依次構(gòu)成Servlet過濾器鏈,依次處理客戶請求。需要注意的是過濾器配置的順序是不能交換的,當(dāng)不需要使用某個過濾器時,可直接將其刪除和注釋。過濾器在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的配置,該過濾器對用戶是否有權(quán)訪問web資源作出最后的決定。其它的過濾器的配置類同。
配置完過濾器后,需要對攔截器FilterSecurityInterceptor進(jìn)行配置,

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

objectDefinitionSource屬性定義了那些受保護(hù)的URL資源,其中引用了一個本地對象filterObjectDefinitionSource?! ?filterObjectDefinitionSource類從數(shù)據(jù)庫中讀取需要保護(hù)的URL安全信息,它擴(kuò)展了PathBasedFilterInvocationDefinition Map類。

同樣,實(shí)現(xiàn)了另外一個methodObjectDefinitionSource類從數(shù)據(jù)庫中讀取需要保護(hù)的FUNCTION資源,它擴(kuò)展了MethodDefinitionMap類。限于篇幅,在這里就不列出具體實(shí)現(xiàn)的源代碼。

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

四、結(jié)束語

由于Spring在越來越多的項(xiàng)目中的應(yīng)用,因此基于Spring應(yīng)用的安全控制系統(tǒng)的研究就顯得非常重要。Acegi提供了對Spring應(yīng)用安全的支持,然而 Acegi本身提供的實(shí)例并不能滿足大規(guī)模的復(fù)雜的權(quán)限需求,本文通過擴(kuò)展Acegi的數(shù)據(jù)庫設(shè)計即可滿足復(fù)雜的權(quán)限需求。然而,怎樣將Acegi應(yīng)用到非Spring的系統(tǒng)中,還有待進(jìn)一步研究。

感謝大家的閱讀和對腳本之家的支持。

相關(guān)文章

  • Springboot+MyBatis進(jìn)行日志輸出參考示例

    Springboot+MyBatis進(jìn)行日志輸出參考示例

    這篇文章主要給大家介紹了關(guān)于Springboot+MyBatis進(jìn)行日志輸出的相關(guān)資料,在項(xiàng)目開發(fā)過程中,日志是必不可少的,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • JAVA十大排序算法之歸并排序詳解

    JAVA十大排序算法之歸并排序詳解

    這篇文章主要介紹了java中的歸并排序,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Windows 10上JDK環(huán)境安裝配置圖文教程

    Windows 10上JDK環(huán)境安裝配置圖文教程

    這篇文章主要為大家詳細(xì)介紹了Windows 10上JDK環(huán)境安裝配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • idea關(guān)閉vim編輯模式的操作

    idea關(guān)閉vim編輯模式的操作

    這篇文章主要介紹了idea關(guān)閉vim編輯模式的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    springboot如何使用logback-spring配置日志格式,并分環(huán)境配置

    這篇文章主要介紹了springboot如何使用logback-spring配置日志格式,并分環(huán)境配置的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • javaweb判斷當(dāng)前請求是否為移動設(shè)備訪問的方法

    javaweb判斷當(dāng)前請求是否為移動設(shè)備訪問的方法

    這篇文章主要為大家詳細(xì)介紹了javaweb判斷當(dāng)前請求是否為移動設(shè)備訪問的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java synchronized關(guān)鍵字使用方式及特性解析

    Java synchronized關(guān)鍵字使用方式及特性解析

    這篇文章主要介紹了Java synchronized關(guān)鍵字使用方式及特性解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • Spring Gateway的入門概述及主要功能

    Spring Gateway的入門概述及主要功能

    Spring Gateway是Spring Cloud微服務(wù)生態(tài)下的網(wǎng)關(guān)組件,網(wǎng)絡(luò)層使用了基于非阻塞的 Netty使用異步IO增加了系統(tǒng)的性能,Gateway 是基于 Spring 5 和 Spring Boot 2 搭建的,這篇文章主要介紹了Spring Gateway的入門概述簡介,需要的朋友可以參考下
    2024-04-04
  • 如何對spring框架的搭建進(jìn)行封裝--springboot

    如何對spring框架的搭建進(jìn)行封裝--springboot

    這篇文章主要介紹了如何對spring框架的搭建進(jìn)行封裝--springboot,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Vue3實(shí)現(xiàn)多頁面跳轉(zhuǎn)效果的幾種方式

    Vue3實(shí)現(xiàn)多頁面跳轉(zhuǎn)效果的幾種方式

    Vue.js是一個用于構(gòu)建用戶界面的漸進(jìn)式 JavaScript 框架,它提供了多種方法來實(shí)現(xiàn)頁面之間的導(dǎo)航,在 Vue 3 中,頁面跳轉(zhuǎn)主要通過 Vue Router 來管理,同時也支持其他方式如編程式導(dǎo)航和使用錨點(diǎn)鏈接,本文將詳細(xì)介紹 Vue 3 中的各種頁面跳轉(zhuǎn)方式,需要的朋友可以參考下
    2025-03-03

最新評論

SHOW| 瓦房店市| 射阳县| 怀远县| 盈江县| 剑阁县| 淮南市| 那曲县| 磐石市| 伽师县| 呼和浩特市| 全椒县| 太白县| 普兰店市| 金阳县| 页游| 浦县| 邢台市| 莱芜市| 九江市| 朔州市| 青神县| 济宁市| 镇原县| 拜泉县| 项城市| 天津市| 乐陵市| 江西省| 西乌珠穆沁旗| 新邵县| 犍为县| 勃利县| 永定县| 锦州市| 泗阳县| 穆棱市| 潼南县| 电白县| 易门县| 汕尾市|