引言
近年来,随着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。
实现系统的安全控制,首先需要对系统的安全管理 器和授权管理器进行配置,系统进行认证和授权需要获取安全信息,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> |
<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的系统中,还有待进一步研究。
相关推荐
通用权限管理系统可练手可毕设,如果项目中有权限开发要求可直接拿来基础开发。...总的来说,基于SpringBoot+Vue的通用权限控制系统设计与实现,可以提供灵活、可扩展、易维护的权限控制功能,适用于各种应用
Java语言开发的统一角色访问控制系统(Unified Role Access Control System),基于Spring Security 3实现的权限控制系统 程序框架版本说明:Spring MVC 3.0.6 + Spring Security 3.1.3 + Hibernate 3.6.10 运行...
- 集成Spring Security,配置安全认证相关的配置,如登录认证、访问权限控制等。 - 实现用户管理功能,包括用户注册、登录、密码加密等。 - 实现角色管理功能,包括角色创建、角色权限分配等。 - 实现权限管理...
一个能够为基于Spring的企业应用系统提供声明式的安全訪问控制解决方式的安全框架(简单说是对访问权限进行控制嘛),应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分。用户认证指...
Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。 正如你可能知道的关于安全方面的两个主要区域是“**认证**”和“**授权**”(或者访问控制),一般来说,Web 应用的安全性包括**用户...
基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本。前端采用Vue、Element UI。后端采用Spring Boot、Spring Security、Redis & Jwt。权限认证使用Jwt,支持...
4.权限管理框架-----spring-security 5.监控框架---------actuator、remote-shell 6.日志-------------logback 7.前台框架---------thymeleaf 8.生成工具---------generator(自动生成bean、mapper、SQL) 9.分页...
此项目源码采用spring boot开发,使用springsecurity进行权限控制。前后端基于json进行交互,接口通过JWT无状态token进行权限校验,使用redis或者数据库进行token缓存,接口完全采用Restful的风格,实现按钮级权限...
权限控制:spring security ORM框架:spring data jpa 操作日志回显:websocket 前后端分离:angularjs+bootstrap 系统部署 多角色配置,不同角色区分环境和菜单权限。不同环境可以做不同配置,满足一般公司的基本...
在开源的SpringSide上作权限控制的demo,附带数据库。分层清晰,设计合理,系统松散耦合。结合业界流行的安全框架精心设计开发。
15. 基于表达式的权限控制 15.1. 概述 15.1.1. 常用内建表达式 15.2. Web 安全表达式 15.3. 方法安全表达式 15.3.1. @Pre 和 @Post 注解 15.3.1.1. 访问控制使用 @PreAuthorize 和 @PostAuthorize ...
"基于Spring Boot的可盈保险合同管理系统的设计与实现.zip"是一个针对保险行业设计的应用软件包,它旨在帮助保险公司高效管理保险合同。该项目采用了流行的Java开发框架Spring Boot,以便快速搭建和部署微服务架构。...
SpringSecurity5+Element?UI+Vue?Admin?Template+蚂蚁可视化AntV?等技术栈开发的项目,采用分布式,多模块,前后端分离开发。包括图形展示、权限管理、用户管理等功能。【后端技术】技术说明Spring?Boot2MVC框架?...
统一角色访问控制系统(Unified Role Access Control System),是基于Spring Security 3实现的权限控制系统 程序框架版本说明:Spring MVC 3.0.6 Spring Security 3.1.3 Hibernate 3.6.10 运行演示例子: ...
Spring Security为基于J2EE企业应用软件提供了全面安全服务。 特别是使用领先的J2EE解决方案-spring框架开发的企业软件项目。 如果你没有使用Spring开发企业软件,我们热情的推荐你仔细研究一下。 熟悉Spring-尤其是...
通过Spring Security实现用户权限控制和安全认证。 景点信息管理模块: 提供景点信息的展示和查询功能,包括景点介绍、图片展示等。 实现了基于关键词的搜索和分类展示功能。 订单管理模块: 用户可以查看已下订单、...
SpringBlade微服务开发平台基于SpringBlade的...借鉴OAuth2,实现了多终端认证系统,可控制子系统的token权限互相隔离。 借鉴Security,封装了Secure模块,采用JWT做Token认证,可拓展集成Redis等细颗粒度控制方案。
基于微信小程序的传染病防控宣传系统的设计与实现结合Spring Boot框架,旨在通过移动端平台向用户传播有关传染病预防和控制的知识,提高公众对传染病防控的认知和应对能力。该系统具有以下主要特点: 微信小程序端...
用户管理模块:包括用户的注册、登录、权限管理等功能,通过使用Spring Security框架实现安全认证和授权控制。 设备管理模块:包括设备的基本信息录入、查询、修改、删除等功能,通过使用MyBatis框架实现数据库访问...
同时,本系统将采用Spring Security进行权限控制,保证系统的安全性和稳定性。 经过开发和测试,本系统将实现以下目标: - 实现商品信息的展示和搜索功能。 - 实现商品拍卖和购买功能。 - 实现订单管理功能。 - ...