`

实现基于Spring框架应用的权限控制系统security

    博客分类:
  • @SSH
阅读更多

引言

  近年来,随着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。

实现基于Spring框架应用的权限控制系统(图一)
图1 安全管理对象,拦截器和安全管理组件交互图
实现基于Spring框架应用的权限控制系统(图二)
图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>

实现基于Spring框架应用的权限控制系统(图三)
图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的系统中,还有待进一步研究。
 
分享到:
评论

相关推荐

    实现基于Spring框架应用的权限控制系统.doc

    在基于Spring框架的应用中,构建一个有效的权限控制系统至关重要,因为它确保了只有授权用户才能访问特定的资源或执行特定的操作。Spring框架虽然提供了强大的IoC(Inversion of Control)和AOP(Aspect Oriented ...

    springboot springsecurity动态权限控制

    - 如果默认的过滤器不能满足需求,可以编写自定义过滤器,插入到Spring Security的过滤器链中,实现更复杂的逻辑,比如基于URL、方法或自定义条件的权限控制。 5. **JWT令牌**: - 为了支持API的无状态认证,可以...

    通用权限管理系统+springboot+mybatis plus+spring security+jwt+redis+mysql

    通用权限管理系统可练手可毕设,如果项目中有权限开发要求可直接拿来基础开发。...总的来说,基于SpringBoot+Vue的通用权限控制系统设计与实现,可以提供灵活、可扩展、易维护的权限控制功能,适用于各种应用

    (源码)基于Spring Boot和Spring Security的权限管理系统.zip

    项目涵盖了用户认证、权限控制、角色管理、资源管理等多个方面,通过Spring Security框架实现安全认证和授权功能。 ## 项目的主要特性和功能 1. 用户认证与授权 使用Spring Security实现用户登录认证和权限控制。...

    基于Spring Cloud框架的权限管理系统.zip

    基于Spring Cloud框架的权限管理系统 内容概要 本项目是一个基于Spring Cloud框架的权限管理系统,旨在提供一个高效、灵活且易于扩展的微服务架构解决方案。系统支持前后端分离,后端开发专注于服务实现,前端开发...

    基于Spring Boot框架的Spring Security项目.zip

    本项目是一个基于Spring Boot框架的Spring Security项目,涵盖了Spring Boot、Spring Security、Spring Cloud等多个技术栈的应用。项目主要功能包括用户认证、授权、权限管理、缓存、日志记录、服务发现与注册、负载...

    SpringBoot集成Spring Security实现权限控制【完整源码+数据库】

    总的来说,这个项目为学习者提供了一个实际的、完整的SpringBoot集成Spring Security的示例,通过它,你可以了解如何配置和使用Spring Security进行权限控制,同时掌握如何将数据库集成到Spring Boot应用中。...

    spring security实现动态授权

    Spring Security 是一个强大的安全框架,用于为Java应用提供安全控制。在传统的权限管理中,权限配置通常硬编码在应用程序中,这使得权限调整变得困难,每次变动都需要重新部署应用。然而,通过动态授权,我们可以将...

    Spring框架应用案例

    7. **Spring Security**:Spring的认证和授权框架,用于实现复杂的权限控制,如登录验证、角色权限分配等,保护Web应用的安全。 8. **Spring Batch**:针对批量处理任务的设计,提供了一套完整的解决方案,包括读取...

    spring security(权限框架)

    Spring Security能够无缝集成到Spring框架的应用程序中,因此在Spring生态系统中广泛使用。 **1. 用户认证** Spring Security 提供了多种认证方式,包括基于内存的用户信息、数据库连接、 LDAP 服务器等。它支持...

    (源码)基于Spring Cloud和Spring Security的微服务权限管理系统.zip

    系统采用Spring Cloud作为微服务框架,Spring Security作为权限认证框架,结合Nacos作为服务注册和配置中心,Sentinel作为流量控制和熔断工具,SkyWalking作为链路跟踪工具,Redis作为缓存工具,MySQL作为数据库。...

    基于Spring Security的细粒度权限管理系统设计源码

    这是一个基于Spring Security框架的细粒度权限管理系统,使用Java语言开发,同时包含JavaScript、CSS、HTML等多种编程语言。该项目共包含2447个文件,其中主要文件类型包括JavaScript、PNG图片、CSS、HTML、JAR包、...

    SpringSecurity+OAuth2+JWT分布式权限控制.zip

    综上所述,这个项目展示了如何将Spring Security、OAuth2和JWT结合起来,实现一个完整的分布式权限控制系统。开发者可以从中学习到如何配置Spring Security来处理认证和授权,如何使用OAuth2来管理用户授权,以及...

    使用Acegi作为基于Spring框架的WEB应用的安全框架

    Acegi Security,现已被Spring Security所取代,是Spring框架生态系统中的一个强大安全组件,用于构建安全的Web应用程序。本文将深入探讨如何利用Acegi来增强基于Spring的应用程序的安全性,并结合给定的资源进行...

    spring-security实现复杂的权限管理

    Spring Security 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在Spring Security 3.17版本中,它提供了一套完整的解决方案来处理复杂的权限管理系统,包括用户认证、授权以及...

    基于 Spring Cloud 2021 、Spring Boot 2.7、 OAuth2 的 RBAC 权限管理系统源码

    OAuth2是一种授权协议,常用于实现第三方应用的访问权限控制。在这个系统中,OAuth2可能被用来保护API接口,确保只有经过授权的用户或应用才能访问特定资源。通过OAuth2,用户可以将权限授予第三方应用,而无需分享...

    spring boot +spring security+thymeleaf实现权限

    Spring Boot是基于Spring框架的快速开发工具,它通过预配置的依赖和自动配置机制,极大地简化了Spring应用的启动和管理。在权限管理场景中,Spring Boot可以作为基础架构,提供应用运行环境和依赖管理。 接下来是...

    springBoot+security+mybatis 实现用户权限的数据库动态管理

    在Spring Boot应用中,我们可以轻松集成Spring Security来实现用户登录、权限控制等功能。Spring Security的核心概念包括认证(Authentication)和授权(Authorization)。认证是确认用户身份,而授权则是确定用户...

    基于Spring Boot的权限管理系统.zip

    通过集成Spring Security和JWT,系统能够高效地处理用户登录认证和权限控制。此外,系统还提供了丰富的配置选项,如跨域配置、数据源监控、验证码生成等,以增强系统的安全性和可用性。 主要功能 1. 用户认证与...

    基于Spring Boot框架的权限管理系统4608ed516072070e2f3a230e5566cc99.zip

    基于Spring Boot框架的权限管理系统 项目简介 本项目是一个基于Spring Boot框架的前后端分离的权限管理系统。系统从零开始搭建,集成了Vue、Element UI、Axios等前端技术,以及Spring Boot、Spring Security、JWT...

Global site tag (gtag.js) - Google Analytics