http://www.diybl.com/course/3_program/java/javajs/2007117/84951.html

1、spring   框架

  Spring框架是由Open   Source开发的一个优秀的多层J2EE系统框架,它为企业级应用提供了一个非常轻量级的解决方案,大大地降低了应用开发的难度与复杂度,提高了开发的速度。

  Spring框架的核心是IoC和AOP。IoC是一种设计模式,即IoC模式。IoC模式进一步降低了类之间的耦合度,并且改变了传统的对象的创建方法,实现了一种配置式的对象管理方式,Spring框架中由IoC容器负责配置性的对象的管理。IoC模式极大的提高了系统开发与维护的灵活性。

  AOP是一种编程模式,它是从系统的横切面关注问题。传统的面向对象编程OOP主要从系统的垂直切面对问题进行关注,对于系统的横切面关注很少,或者说很难关注,这样当考虑到系统的安全性、日志、事务以及其他企业级服务时,OOP就无能为力了,只能在所有相关类中加入类似的系统服务级的代码。AOP为解决系统级服务问题提供了一种很好的方法。AOP将系统服务分解成方面看待,并为类提供一种声明式系统服务方式。Java类不需要知道日志服务的存在也不需要考虑相关的代码。所以,用AOP编写的应用程序是松耦合的,代码的复用性就提高了。

  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框架的系统中的应用

  1、分析系统安全性需求

  首先,需要明确进行安全控制的对象,可为业务方法和URL资源。

  其次,需要进一步明确,系统身份认证资料和资源授权信息的数据持久化形式。

  2、Acegi安全系统数据库设计

  在Acegi框架中支持多种安全信息的持久化方式,可以在配置文件中配置或存放在关系数据库。由于在实际应用中,需求是经常发生变化的。所以,在配置文件中配置是满足不了实际应用需求的。然而,Acegi本身对权限表的设计非常简单,users表{username,password,enabled}   和authorities表{username,authority},这样简单的设计肯定无法适用复杂的权限需求。为了解决权限管理的复杂性,在这里引入了role(角色)的概念,使得用户和权限分离,一个用户拥有多个角色,一个角色拥有多个相应的权限,这样就更灵活地支持安全策略。

  同时,为了更好地配合Acegi安全框架,还引入resource(资源)的概念,资源可分为URL和FUNCTION(方法)两种,一个权限可以对应多个资源。具体的数据库设计见图2。

图1   安全管理对象,拦截器和安全管理组件交互图

图2   Acegi安全控制系统数据库设计

3、认证管理器,授权管理器的配置

  实现系统的安全控制,首先需要对系统的安全管理器和授权管理器进行配置,系统进行认证和授权需要获取安全信息,Acegi本身提供了对认证信息的获取机制,在实现认证与授权过程中,系统将主动根据配制信息和相应的信息解释安全信息的读取。图3给出了一个将用户安全信息存储在数据库中的认证管理器的配置示意图。

  对应于图示的XML配置文件的代码如下:

  授权管理器的配置方法与认证管理器的配置基本类似,这里不再讨论。

  4、安全请求拦截器的配置

  以上配置完成后,就需要配置安全拦截器。不同的安全管理对象需要使用不同的安全拦截器。对于方法级的安全认证需要使用的拦截器为MethodSecurityInterceptor,而应用于URL资源的安全拦截器为FilterSecurityInterceptor   。其中,MethodSecurityInterceptor拦截器是借助于Spring   Aop实现的,而FilterSecurityInterceptor拦截器是借助于Servlet   Filter   实现的。本文以URL资源请求的安全拦截器为例说明配置情况。

  由于URL资源请求安全拦截是借助于过滤器进行的。因此首先要配置Acegi   Servlet过滤器。过滤器类似于AOP   Around装备,实现在web资源调用前后进行的一些操作6种过滤器,他们依次构成Servlet过滤器链,依次处理客户请求。需要注意的是过滤器配置的顺序是不能交换的,当不需要使用某个过滤器时,可直接将其删除和注释。过滤器在web.xml中配置形式为

显示代码打印
01 <filter>

02  <filter-name>Acegi   HTTP   Request   Security   Filter</filter-name>

03  <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>

04  <init-param>

05   <param-name>targetClass</param-name>

06   <param-value>

07    Org.acegisecurity.intercept.web.SecurityEnforcementFilter

08   </param-value>

09  </init-param>

10 </filter>

11 <filter-mapping>

12  <filter-name>Acigi   HTTP   Request   Security   Filter</filter-name>

13  <url-pattern>/*</url-pattern>

14 </filter-mapping>

15

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

17

18 <bean   id=”securityEnforcementFilter”   class=””>

19  <property   name=”filterSecurityInterceptor”>

20   <ref   bean=”filterInvocationInteceptor”/>

21  </property>

22  <property   name=”authenticationEntryPoint”>

23   <ref   bean=”authenticationProcessingFilterEntryPoint”/>

24  </property>

  以上代码是SecurityEnforcementFilter的配置,该过滤器对用户是否有权访问web资源作出最后的决定。其它的过滤器的配置类同。
配置完过滤器后,需要对拦截器FilterSecurityInterceptor进行配置,

  objectDefinitionSource属性定义了那些受保护的URL资源,其中引用了一个本地对象filterObjectDefinitionSource。filterObjectDefinitionSource类从数据库中读取需要保护的URL安全信息,它扩展了PathBasedFilterInvocationDefinition   Map类。
同样,实现了另外一个methodObjectDefinitionSource类从数据库中读取需要保护的FUNCTION资源,它扩展了MethodDefinitionMap类。限于篇幅,在这里就不列出具体实现的源代码。

  结束语

  由于Spring在越来越多的项目中的应用,因此基于Spring应用的安全控制系统的研究就显得非常重要。Acegi提供了对Spring应用安全的支持,然而   Acegi本身提供的实例并不能满足大规模的复杂的权限需求,本文通过扩展Acegi的数据库设计即可满足复杂的权限需求。然而,怎样将Acegi应用到非Spring的系统中,还有待进一步研究。
文章出处:飞诺网(www.diybl.com):http://www.diybl.com/course/3_program/java/javajs/2007117/84951.html

Acegi 安全框架相关推荐

  1. 实现基于Spring框架应用的权限控制系统(转)

    为什么80%的码农都做不了架构师?>>>    前注:当我摸到了通过filter拦截权限,通过AOP拦截方法,通过权限控制菜单的时候,猛然发现这一切的一切已经是别人已经发明好的轮子. ...

  2. Spring Security 教程

    Spring Security 教程 在这篇文章中,我们将讨论Spring框架 "安全性"模块基础知识.我们将在即将发布的帖子中开发一些简单而先进的示例. 现在,开发安全应用程序是 ...

  3. 《Spring技术内幕(第2版)》PDF 国内经典分析spring源代码

    书名:Spring技术内幕(第2版) 作者: 计文柯 出版社: 机械工业出版社 副标题: 深入解析Spring架构与设计原理 出版年: 2012-2 页数: 399 定价: 69.00元 装帧: 平装 ...

  4. spring思想分析

    摘要: EveryBody in the world should learn how to program a computer...because it teaches you how to th ...

  5. Spring技术内幕

    Spring技术内幕--深入解析Spring架构与设计原理 图 书 内 容 本书是Spring领域的问鼎之作,由业界拥有10余年开发经验的资深Java专家亲自执笔!Java开发者社区和Spring开发 ...

  6. spring源码解析(一)迈向学习spring之路

    设计伊始 Spring是为解决企业级应用开发的复杂性而设计,她可以做很多事.但归根到底支撑Spring的仅仅是少许的基本理念,而所有地这些的基本理念都能可以追溯到一个最根本的使命:简化开发.这是一个郑 ...

  7. 【转载】JSP开发工具的选择

    JSP引擎搭建起来后就可以着手使用开发工具进行JSP的编程了,现下流行的JSP开发工具主要有IBM VisualAge,JBuilder,NetBeans,JRun,Urledit,dreamweav ...

  8. Spring 源码分析 (一)——迈向 Spring 之路

    一切都是从 Bean 开始的 在 1996 年,Java 还只是一个新兴的.初出茅庐的编程语言.人们之所以关注她仅仅是因为,可以使用 Java 的 Applet 来开发 Web 应用.但这些开发者很快 ...

  9. SQL基础---day6

    ##   删除数据库 drop  database  ecport; ##   创建数据库 create   database   ecport; ##   使用数据库 use   ecport; # ...

最新文章

  1. tomcat日志切割
  2. C# DateTimePicker控件如何精确设置显示时分秒
  3. 看一家公司发展得如何就看这家公司的财务部门
  4. 2020-11-21(线性扫描反汇编算法和递归下降扫描反汇编算法)
  5. 2021-9-下旬 数据结构-线性表-链表-java代码实现(复习用)
  6. 青岛农业大学第九届ACM程序设计竞赛
  7. OpenGL 基础光照ColorsBasic Lighting
  8. E:Sleeping Schedule(DP)
  9. 认识JSON补丁:JSON-P 1.1概述系列
  10. 前端学习(1991)vue之电商管理系统电商系统之实现商品的分页功能
  11. 现在自驾旅游吃住有没有问题?
  12. 【OpenCV】简单高效地访问图像像素
  13. pe_xscan 增加 O31 项
  14. Excel如何批量生成二维码
  15. 大型稀疏矩阵计算的现代方法介绍
  16. 游戏开发者如何有效的编写游戏策划文档
  17. 计算机网络通信模型之cs模式(一)简单的socket
  18. jieba分词关键词抽取
  19. Python 基础 - Day 1 Assignment - Three tier menu 三级菜单
  20. 构建maven时No archetypes currently available的解决方法

热门文章

  1. 632. Smallest Range Covering Elements from K Lists 最小区间
  2. 【Qt】2D绘图之绘制图像(二)
  3. 【C++】Visual Studio教程(七) -修改 Visual Studio
  4. 【Linux】一步一步学Linux——reset命令(268)
  5. python的requests.session()_Python+requests之session保持会话
  6. linux下产生core文件以及不产生core文件的条件
  7. 【算法】Floyd-Warshall算法(任意两点间的最短路问题)(判断负圈)
  8. LVS(8)——tcpdump查看数据包到底如何传递
  9. Linux(8) —— grep命令
  10. 环形链表II—leetcode142