为什么80%的码农都做不了架构师?>>>   

前注:当我摸到了通过filter拦截权限,通过AOP拦截方法,通过权限控制菜单的时候,猛然发现这一切的一切已经是别人已经发明好的轮子。

摘 要 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安全框架介绍

  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配置文件的代码如下:

/* 配置数据库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>

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

  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的系统中,还有待进一步研究。

转载于:https://my.oschina.net/wamdy/blog/129421

实现基于Spring框架应用的权限控制系统(转)相关推荐

  1. 实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架

    对于任何一个完整的应用系统,完善的认证和授权机制是必不可少的.在基于SpringFramework的WEB应用中, 我们可以使用Acegi作为安全架构的实现.本文将介绍如何在基于Spring构架的We ...

  2. java 电力 监测 系统,基于Spring框架的电力负荷管理系统[Java编程]

    赞助商链接 本文"基于Spring框架的电力负荷管理系统[Java编程]"是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自 ...

  3. java毕业设计基于spring框架的论坛网站项目设计和源码

    一.主题 榴莲社区--java开发基于spring框架的论坛网站,基于spring框架的论坛网站项目设计和项目 源 码 免 费下 载 链 接 如 下:  毕业设计项目基于spring框架的论坛网站源码 ...

  4. 基于Spring+SpringMVC+Beetl的权限管理框架源码分享

    Java企业级开发平台源码 权限管理框架源码 源码分享! 基于Spring+SpringMVC+Beetl+Beetlsql+Shiro的权限管理框架.内置功能:用户管理.角色管理.菜单管理.字典管理 ...

  5. 基于 Spring Security 搭建用户权限系统(二) - 自定义配置

    说明 本文的目的是如何基于 Spring Security 去扩展实现一个基本的用户权限模块, 内容会覆盖到 Spring Security 常用的配置. 文中涉及到的业务代码是不完善的, 甚至会存在 ...

  6. 基于Spring框架的Controller中进行事务管理

    如果是Spring框架,那么会有7种传播方式: REQUIRED - 没有事务就新建立一个事务,有事务就加入当前事务: SUPPORTS - 如果当前有事务则加入,没有就以没有事务的方式执行: MAN ...

  7. 基于Spring框架的Shiro配置

    http://kdboy.iteye.com/blog/1103794 一.在web.xml中添加shiro过滤器 Xml代码   <!-- Shiro filter--> <fil ...

  8. 基于Spring框架的Wap门户网站设计思想(转)

    在Wap手机门户网站的程序设计过程中,我们使用了Spring 框架结构.在前台的jsp页面中,重点应用了web MVC设计思想和Spring 对JDBC的封装策略.MVC即Model –View-Co ...

  9. 基于spring 的开源框架

    2019独角兽企业重金招聘Python工程师标准>>> Spring框架是一个相对较难学习的一个框架,尤其是当你想要使用行业标准开发一个真实的项目案例的时候.虽然刚开始的时候阅读大量 ...

最新文章

  1. html5 文字定义线宽,html 5画布线宽
  2. ngx_lua_module-1.0.5.0 (LUA编写网页脚本,支持windows和linux)
  3. GMT 时间日期格式
  4. 目的港无人提货的法律风险及风险承担
  5. 职场中一路走来却拂不去一丝失落——一个女IT的告白
  6. python调用系统_python 执行系统命令
  7. 60小时打通Python任督二脉
  8. BugkuCTF-MISC题telnet
  9. 使用PXE+dhcpd+vsftpd+tftp+kickstart 实现无人值守安装linux
  10. c#绝对值函数图像_C# 中如何取绝对值函数
  11. 也许你看了一本假的天龙八部
  12. Pandas: Drop函数(Dataframe删除指定行列)
  13. 哪个大学开python课_2017春Python语言程序设计(天津大学仁爱学院)
  14. Codeforces Round #701 D. Multiples and Power Differences LCM性质
  15. windows文件服务器高可用,通过 Windows Server 2012 构建高可用性的文件服务器
  16. c语言西华大学陈晓亮,计算机与软件工程学院
  17. 这8个要点,能让你的网页首图抓住用户注意力
  18. 字典 列表和集合习题
  19. leetcode-跳跃游戏
  20. Netjava project 简单画板的实现

热门文章

  1. 应用函数修饰符@来改变AI Studio的输出信息
  2. MindMotion MM32 单片机上的MicroPython移植-PWM
  3. 2021年春季学期-信号与系统-第十次作业参考答案-第五小题
  4. 利用一个继电器来实现脚踏鼠标按钮
  5. 人工智能创意赛复选赛成绩单
  6. 使用BH60测量小功率步进电机角度实验数据
  7. linux c 获取文件权限,如何在C / C++中以编程方式读取Linux文件权限
  8. rmi反序列化导致rce漏洞修复_JAVA反序列化漏洞解决办法
  9. python 批量下载网址_python 遍历oss 实现批量下载
  10. python安装方法32位_Python-3.9.0 安装教程【64位/32位】