`
raymond.chen
  • 浏览: 1441396 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何在Spring中集成Acegi 1.x安全框架

阅读更多
    Acegi Security是一个能为基于Spring的企业应用提供强大而灵活安全访问控制解决方案的框架,Acegi已经成为Spring官方的一个子项目,所以也称为Spring Security。它通过在Spring容器中配置一组Bean,充分利用Spring的IoC和AOP功能,提供声明式安全访问控制的功能。
    下面将详细介绍Acegi在Spring中如何配置,配置范例是在acegi-security-1.0.6版本下测试通过的。


1、在web.xml中的配置

	<!-- 声明Spring Bean的配置文件列表 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/config/applicationContext.xml,
			/WEB-INF/config/ beans-acegi.xml
		</param-value>
	</context-param>
	
	<!-- 声明Acegi过滤器 -->
	<filter>
		<filter-name>securityFilter</filter-name>   
		<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>   
		<init-param>   
			<param-name>targetClass</param-name>   
			<param-value>org.acegisecurity.util.FilterChainProxy</param-value>   
		</init-param>   
	</filter>

	<filter-mapping>
		<filter-name>securityFilter</filter-name>
			<url-pattern>/j_security_check</url-pattern>
		</filter-mapping>
	<filter-mapping>
		<filter-name>securityFilter</filter-name>   
		<url-pattern>/*</url-pattern>   
	</filter-mapping>
		
	说明:
		1)安全框架会对/j_security_check和所有的请求进行权限控制。
		2)Acegi通过实现了Filter接口的FilterToBeanProxy提供一种特殊的使用Servlet Filter的方式,它委托Spring中的Bean -- FilterChainProxy来完成过滤功能,以便简化web.xml的配置,并且可以充分利用Spring IOC的优势。FilterChainProxy包含了处理认证过程的filter列表,每个filter都有各自的功能。


2、filterChainProxy的配置
	<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
		<property name="filterInvocationDefinitionSource">
			<value>
				CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
				PATTERN_TYPE_APACHE_ANT
				/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor</value>   
		</property>
	</bean>
	说明:
		1)	过滤器列表必须位于同一行内,中间不能换行。这些过滤器将按顺序被调用。
		2)	CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON:表示URL比较前先转为小写。
		3)	PATTERN_TYPE_APACHE_ANT:表示使用Apache Ant的匹配模式


3、httpSessionContextIntegrationFilter的配置
	<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>
	说明:
		1)	必须将该Filter配置为过滤器链中第一个过滤器,使验证信息能跨越多个请求。
		2)	为了解决认证主体安全信息能在多个Http请求之间保持共享,Acegi将认证主体安全信息缓存于HttpSession中,当用户请求一个受限的资源时,Acegi通过HttpSessionContextIntegrationFilter将认证主体信息从HttpSession中加载到SecurityContext实例中,认证主体关联的SecurityContext实例则保存在Acegi容器级的SecurityContextHolder里。当请求结束之后,HttpSessionContextIntegrationFilter执行相反的操作,将SecurityContext中的认证主体安全信息重新转存到HttpSession中,然后从SecurityContextHolder中清除对应的SecurityContext实例。
		3)	SecurityContextHolder是框架级的容器,它保存着和所有用户关联SecurityContext实例,SecurityContext承载着用户的帐号及权限信息,通过以下方法可以取到这些信息:SecurityContextHolder.getContext().getAuthentication()。


4、logoutFilter的配置
	<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
		<constructor-arg value="/index.jsp"/>
		<constructor-arg>
			<list>
				<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
			</list>
		</constructor-arg>
		<property name="filterProcessesUrl" value="/j_acegi_logout"/>
	</bean>
	说明:
		1)负责处理退出系统后所需要的清理工作。
		2)	LogoutFilter过滤器的构造方法有两个参数:
一个表示成功退出系统后转向的URL;
另一个表示退出系统前需要执行的操作,执行的操作可以有多个。
		3)	SecurityContextLogoutHandler操作类会把HttpSession销毁,清除SecurityContextHolder里的SecurityContext实例,把rememberMeServices从cookies中清除。然后重定向到指定的退出登录页面。
		4)	filterProcessesUrl:指定用于响应退出系统请求的URL,其默认值为 /j_acegi_logout。当访问的URL为filterProcessesUrl属性值时,logoutFilter过滤器将会被调用。


5、认证处理过滤器authenticationProcessingFilter的配置
	<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
		<property name="filterProcessesUrl" value="/j_security_check"/>
		<property name="authenticationFailureUrl" value="/index.jsp?login_error=1"/>
		<property name="defaultTargetUrl" value="/main.action"/>
		<property name="authenticationManager" ref="authenticationManager"/>
		<property name="rememberMeServices" ref=""/><!-可选 -->
	</bean>
	说明:
		1)负责处理基于表单的身份验证请求。
		2)当接收到与filterProcessesUrl所定义相同的请求时,它会首先通过AuthenticationManager来验证用户身份。如果验证成功,则重定向到defaultTargetUrl所定义的成功登陆页面。如果验证失败,则再从 rememberMeServices中获取用户身份。若再获取失败,则重定向到auhenticationFailureUrl所定义的登陆失败页面。
		3)filterProcessesUrl:默认值为/j_acegi_security_check。该值必须与登录页面form的action值一致。
    form中输入用户名的input控件的name必须为j_username;输入密码的input控件的name必须为j_password。
		4)rememberMeServices 负责通过以cookie的形式保存先前的用户登录信息。在Authentication对象不存在时, rememberMeProcessingFilter会调用rememberMeServices的autoLogin()方法,尝试在cookies 中获取用户登录信息,如果存在则返回Authentication对象。在每次用户登录时,如果设置了RememberMe功能,在验证用户身份成功后,则会调用loginSuccess()方法记录用户信息在cookies中,否则调用loginFail()方法清除cookie。


6、认证管理器authenticationManager的配置
	<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
		<property name="providers">
			<list>
				<ref local="daoAuthenticationProvider"/>
				<ref local="anonymousAuthenticationProvider"/>
			</list>
		</property>
	</bean>
	说明:
		1)认证管理器用来管理身份验证提供者。它将验证的功能委托给多个Provider,并通过遍历Providers, 以保证获取不同来源的身份认证,若某个Provider能成功确认当前用户的身份,authenticate()方法会返回一个完整的包含用户授权信息的Authentication对象,否则会抛出一个AuthenticationException。
		2)无论成功与否,认证管理器都会发布一个ApplicationEvent事件对象。


7、身份验证提供者的配置
	<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
		<property name="userDetailsService" ref="userDao"/>
		<property name="userCache" ref="userCache"/>
		<property name="passwordEncoder" ref="passwordEncoder"/><!-可选 -->
	</bean>
	<bean id="anonymousAuthenticationProvider" class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
		<property name="key" value="anonymous"/>
	</bean>

	<bean id="userDao" class="com.cjm.web.dao.impl.UserDaoImpl">
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>

	<bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
		<property name="cache">
			<bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">
				<property name="cacheManager">
					<bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>
				</property>
				<property name="cacheName" value="userCache"/>
			</bean>
		</property>
	</bean>

	<bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/>
	说明:
		1)daoAuthenticationProvider:负责提供用户信息,包括用户名和密码。其中取用户名密码的工作交给userDetailsService来做。
		2)anonymousAuthenticationProvider:匿名用户身份验证。
		3)userDao:用于在数据库中获取用户信息。UserDaoImpl需要实现Acegi提供的UserDetailsService接口类。
		4)userCache:缓存用户和资源相对应的权限信息。每当请求一个受保护资源时,daoAuthenticationProvider就会被调用以获取用户授权信息。如果每次都从数据库获取的话,那代价很高,对于不常改变的用户和资源信息来说,最好是把相关授权信息缓存起来。
		5)passwordEncoder:使用加密器对用户输入的明文进行加密。Acegi提供了三种加密器:
			PlaintextPasswordEncoder---默认,不加密,返回明文
			ShaPasswordEncoder---哈希算法(SHA)加密
			d5PasswordEncoder---消息摘要(MD5)加密


8、securityContextHolderAwareRequestFilter的配置
	<bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/>
	说明:
		1)负责通过Decorate Model(装饰模式)装饰HttpServletRequest对象。
其Wapper是ServletRequest包装类 HttpServletRequestWrapper的子类(SavedRequestAwareWrapper或者 SecurityContextHolderAwareRequestWrapper)。附上获取用户权限信息,request参数,header, Date,headers和cookies的方法。


9、anonymousProcessingFilter的配置
	<bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
		<property name="key" value="anonymous"/>
		<property name="userAttribute" value="anonymous,ROLE_ANONYMOUS"/>
	</bean>
	说明:			1)该过滤器用于判断ContextHolder中是否有Authentication对象,如果没有就创建一个Authentication对象,其中包含的用户名是anonymous,用户权限是ROLE_ANONYMOUS。这使得没有登录的匿名用户能够自动的获得匿名的用户名和权限。


10、exceptionTranslationFilter的配置
	<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
		<property name="authenticationEntryPoint">
			<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
				<property name="loginFormUrl" value="/index.jsp"/>
				<property name="forceHttps" value="false"/>
			</bean>
		</property>
		<property name="accessDeniedHandler">
			<bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
				<property name="errorPage" value="/accessDenied.jsp" />
			</bean>
		</property>
	</bean>
	说明:
		1)	该过滤器用于处理身份验证和授权过程中的异常情况。
		2)	authenticationEntryPoint:将用户重定向到一个基于HTML表单的登录页面。
loginFormUrl:指定登录页面。
forceHttps:指定是否强制使用HTTPS协议。
		3)errorPage:指定访问拒绝时要跳转到的页面。


11、filterInvocationInterceptor的配置
	<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
		<property name="authenticationManager" ref="authenticationManager"/>
		<property name="accessDecisionManager" ref="accessDecisionManager"/>
		<property name="objectDefinitionSource">
			<value>
				PATTERN_TYPE_APACHE_ANT
				/index.jsp*=ROLE_ANONYMOUS
				/accessDenied.jsp*=ROLE_ANONYMOUS
/**/*.jsp*=ADMIN,SYS_MANAGER
				/**/*.htm*=ADMIN,SYS_MANAGER
				/**/*.action*=ADMIN,SYS_MANAGER
			</value>
		</property>
	</bean>
	说明:
	1)该Filter 会首先调用AuthenticationManager判断用户是否已登陆认证,如还没认证成功,则重定向到登陆界面。如认证成功,则从 Authentication中获取用户的权限。然后从objectDefinitionSource属性获取各种URL资源所对应的权限。最后调用 AccessDecisionManager来判断用户所拥有的权限与当前受保护的URL资源所对应的权限是否相匹配。如果匹配失败,则返回403错误给用户。如果匹配成功,则用户可以访问受保护的URL资源。


12、访问决策管理器accessDecisionManager的配置
	<bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
		<property name="allowIfAllAbstainDecisions" value="false"/>
		<property name="decisionVoters">
			<list>
				<bean class="org.acegisecurity.vote.RoleVoter">
					<property name="rolePrefix" value=""/>
				</bean>
			</list>
		</property>
	</bean>
	说明:
		1)通过投票机制来决定是否可以访问某一资源。Acegi提供三种投票通过策略的实现:
			AffirmativeBased(至少一个投票者同意方可通过)
			ConsensusBased(多数投票者同意方可通过)
			UnanimousBased(所有投票者同意方可通过)
		2)allowIfAllAbstainDecisions:设定是否允许 "没人反对就通过" 的投票策略。
		3)	rolePrefix:角色投票者支持的权限前缀,默认为ROLE_。权限必须以rolePrefix设定的值开头才能进行投票。
7
1
分享到:
评论
3 楼 flyfan 2008-08-29  
用2.0简单多了,不用这么麻烦
2 楼 javeye 2008-08-29  
恩,写得比较仔细。不过现在有acegi2.0了,说做了较大的简化。不知道有没有研究过啊?
1 楼 qaybpljplj 2008-08-29  
恩啊 写得不错!

相关推荐

    如何在Spring中集成Acegi 2.x安全框架

    在Spring框架中集成Acegi 2.x安全框架,可以实现高度可定制的权限管理和认证机制。Acegi(现已被Spring Security 2.0所取代)是Spring的一个扩展,提供了全面的安全解决方案,包括用户身份验证、访问控制、会话管理...

    Spring+Acegi+ehcache安全框架常用jar包.rar

    在"Spring+Acegi+ehcache安全框架所用jar包"这个压缩包中,你可能会找到以下关键的库文件: 1. spring-context.jar:Spring的核心库,包含Bean管理和AOP支持。 2. spring-aop.jar:Spring的面向切面编程模块,用于...

    Spring集成Acegi安全框架在J2EE中的应用

    然而对于一个完整的应用系统,完善的认证和授权机制是必不可少的,Acegi是一个基于Spring的安全框架,探讨了Spring框架集成Acegi的方法,即在Spring的IOC配置文件中定义所有的安全逻辑,改变了传统的通过编写代码的...

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

    1. **配置文件**:展示了如何在Spring配置中集成Acegi Security。 2. **控制器**:演示了如何在控制器方法上添加安全注解,限制访问权限。 3. **视图**:显示不同角色用户能看到的不同页面。 4. **用户和角色**:...

    Spring源代码解析(十):Spring_Acegi框架授权的实现.doc

    在本文中,我们将深入探讨Spring_Acegi框架如何实现授权机制,特别是通过`FilterSecurityInterceptor`来处理HTTP请求的安全检查。 `FilterSecurityInterceptor`是Spring Security的核心组件之一,它负责拦截HTTP...

    acegi-sample.rar_acegi-1.0.7_acegi-sample.part2_spring-1.2.4.jar

    而"spring-1.2.4.jar"则是Spring框架的一个较旧版本,表明Acegi Security是在Spring 1.x时代设计的,那时候Spring尚未内置完整的安全模块。 首先,让我们了解Acegi Security的主要组件: 1. **Authentication**...

    Acegi使用.pdf

    Acegi安全框架是专为Spring框架设计的安全解决方案,它通过深度集成Spring的特性,提供了一套全面、灵活的安全管理方案。不同于传统的安全框架,Acegi采用了面向切面编程(AOP)的方式来处理认证和授权问题,这使得...

    集成ACEGI 进行权限控制.rar

    ACEGI Security的核心目标是提供一套灵活、可扩展的安全框架,使开发人员能够轻松地在Spring应用中实现用户认证和授权。它通过拦截器(interceptors)和AOP(面向切面编程)技术,对用户的请求进行过滤,确保只有...

    acegi安全框架简介

    Acegi安全系统,是一个用于Spring Framework的安全框架,能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和面向接口的编程方式。因此,Acegi安全...

    基于Spring的安全框架Acegi在Web系统中的应用.pdf

    ### 基于Spring的安全框架Acegi在Web系统中的应用 #### 概述 随着互联网技术的发展,Web应用系统越来越复杂,对系统的安全性要求也越来越高。一个完整的应用系统必须具备完善的认证和授权机制来保障数据的安全性和...

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

    4. **安全配置**:Acegi的安全配置是在Spring的配置文件中完成的,这使得安全设置可以与其他Spring组件无缝集成。配置中包含了定义安全拦截器链、指定访问决策策略、设置认证和授权规则等内容。 5. **会话管理**:...

    spring的acegi应用

    标题“spring的acegi应用”指的是在Spring框架中使用Acegi安全模块进行权限管理和用户认证的一个主题。Acegi是Spring早期的一个安全组件,后来发展成为Spring Security,是Spring生态系统中的重要部分,用于提供全面...

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

    本篇将深入探讨如何在基于Spring的Web应用中集成并使用Acegi进行安全控制。 1. **Acegi简介**: Acegi是一个强大的、可配置的安全框架,它提供了认证、授权、会话管理等功能,能够与Spring无缝集成,为Web应用程序...

    Spring Acegi权限控制

    Spring Acegi权限控制是Spring框架中用于实现Web应用安全的一种解决方案。Acegi Security(现已被Spring Security替代)是一个功能强大的安全框架,它主要解决了认证(Authentication)和授权(Authorization)这两...

    Acegi框架介绍.rar

    Acegi框架是Spring框架的一个早期安全模块,它为Java企业级应用提供了强大的安全访问控制功能。在Spring 2.0之后,Acegi被整合并发展成为Spring Security,这是一个更为全面且强大的安全解决方案。本篇文章将深入...

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

    在实践中,阅读“实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf”这本书,你将了解到如何配置Acegi,创建安全拦截器,设置权限规则,以及处理各种安全异常。书中还会介绍如何调试和测试安全设置,...

    spring acegi 使用工程demo

    这个"spring acegi 使用工程demo"显然是一个示例项目,旨在帮助开发者理解和实践如何在Spring应用中集成和使用Acegi安全框架。 首先,Acegi是Spring Security的前身,后来被Spring Security所取代,但它的概念和...

    Spring ACEGI手册(部份)

    这个框架旨在提供全面的身份验证、授权和服务层安全功能,允许开发者轻松地在Spring应用中实现复杂的安全需求。 **核心组件** 1. **AuthenticationManager**: 身份验证管理器负责处理用户的登录尝试,验证用户凭证...

    grails-acegi-0.5.zip

    在Grails应用中集成Acegi 0.5插件,不仅可以提高项目的安全性,还能让开发者更专注于业务逻辑的实现,而不是繁琐的安全代码。然而,需要注意的是,随着Spring Security的发展,Acegi已被Spring Security 3.x及更高...

Global site tag (gtag.js) - Google Analytics