`
Relucent
  • 浏览: 208660 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Acegi 各组件说明[转]

阅读更多

1.Filter 组件
HttpSessionContextIntegrationFilter
该Filter负责每次请求从HttpSession中获取Authentication对象,然后把Authentication存于一个新的ContextHolder对象(其实质上只是一个ThreadLocal对象)中,则让该次请求过程中的任何Filter都可以通过ContextHolder来共享Authentication,而不需要从HttpSession中取,减少传HttpRequest参数的麻烦.在请求完后把Authentication对象保存到HttpSession中供下次请求使用,最后把刚才生成的ContextHolder对象销毁.这样就达到了让Authentication对象跨越多个请求的目的

注意此filter须在调用其他Acegi filter前使用:


<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter">
</bean>


AuthenticationProcessingFilter
该Filter负责处理登陆身份验证.当接受到与filterProcessesUrl所定义相同的请求时,它会首先通过AuthenticationManager来验证用户身份.如果验证成功,则重定向到defaultTargetUrl所定义的成功登陆页面.如果验证失败,则再从rememberMeServices中获取用户身份,若再获取失败,则重定向到auhenticationFailureUrl所定义的登陆失败页面


<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager"><ref bean="authenticationManager"/></property>
<property name="authenticationFailureUrl"><value>/acegilogin.jsp?login_error=1</value></property>
<property name="defaultTargetUrl"><value>/</value></property>
<property name="filterProcessesUrl"><value>/j_acegi_security_check</value></property>
<property name="rememberMeServices"><ref local="rememberMeServices"/></property>
</bean>


LogoutFilter
该Filter负责处理退出登录后所需要的清理工作.它会把session销毁,把ContextHolder清空,把rememberMeService从cookies中清除掉,然后重定向到指定的退出登陆页面.

<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
<constructor-arg value="/index.jsp"/> <!-- URL redirected to after logout ->
<constructor-arg>
<list>
<ref bean="rememberMeServices"/>
<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
</list>
</constructor-arg>
</bean>


FilterInvocationInterceptor
该Filter会首先调用AuthenticationManager判断用户是否已登陆认证,如还没认证成功,则重定向到登陆界面.认证成功,则从Authentication中获取用户的权限.然后从objectDefinitionSource属性获取各种URL资源所对应的权限.最后调用AccessDecisionManager来判断用户所拥有的权限与当前受保护的URL资源所对应的权限是否相匹配.如果匹配失败,则返回403错误给用户.匹配成功则用户可以访问受保护的URL资源

<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
<property name="authenticationManager"><ref bean="authenticationManager"/></property>
<property name="accessDecisionManager"><ref local="httpRequestAccessDecisionManager"/></property>
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/index.jsp=ROLE_ANONYMOUS,ROLE_USER
/hello.htm=ROLE_ANONYMOUS,ROLE_USER
/logoff.jsp=ROLE_ANONYMOUS,ROLE_USER
/switchuser.jsp=ROLE_SUPERVISOR
/j_acegi_switch_user=ROLE_SUPERVISOR
/acegilogin.jsp*=ROLE_ANONYMOUS,ROLE_USER
/**=ROLE_USER
</value>
</property>
</bean>


SecurityContextHolderAwareRequestFilter
该Filter负责通过Decorate Model(装饰模式),装饰的HttpServletRequest对象.其Wapper是ServletRequest包装类HttpServletRequestWrapper的子类(SavedRequestAwareWrapper或者SecurityContextHolderAwareRequestWrapper),附上获取用户权限信息,request参数,header,Date,headers和cookies的方法.


<bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter" />


BasicProcessingFilter
该Filter负责处理HTTP头的认证信息,如从Spring远程协议(如Hessian和Burlap)或普通的浏览器如IE,Navigator的HTTP头中获取用户信息,将他们转交给通过authenticationManager属性装配的认证管理器。如果认证成功,会将一个Authentication对象放到会话中,否则,如果认证失败,会将控制转交给认证入口点(通过authenticationEntryPoint属性装配)


<bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">
<property name="authenticationManager"><ref local="authenticationManager"/></property>
<property name="authenticationEntryPoint"><ref local="basicProcessingFilterEntryPoint"/></property>
</bean>

<bean id="basicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
<property name="realmName"><value>Contacts Realm</value></property>
</bean>


RememberMeProcessingFilter
该Filter负责在用户登录后在本地机上记录用户cookies信息,免除下次再次登陆。检查AuthenticationManager 中是否已存在Authentication对象,如果不存在则会调用RememberMeServices的aotoLogin方法来从cookies中获取Authentication对象


<bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
<property name="authenticationManager" ref="authenticationManager" />
<property name="rememberMeServices" ref="rememberMeServices" />
</bean>


AnonymousProcessingFilter
该Filter负责为当不存在任何授权信息时,自动为Authentication对象添加userAttribute中定义的匿名用户权限


<bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
<property name="key" value="changeThis" />
<property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS" />
</bean>


ExceptionTranslationFilter
该过滤器负责处理各种异常,然后重定向到相应的页面中。

<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
<property name="authenticationEntryPoint">
<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl" value="/login.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>


2.拦截器组件

MethodSecurityInterceptor
该拦截器实现了org.aopalliance.intercept.MethodInterceptor接口.在方法被调用之前,拦截器会先调用AuthenticationManager判断用户身份是否已验证,然后从objectDefinitionSource中获取方法所应用的权限,再调用AccessDecisionManager来匹配用户权限和方法对应的权限.如果用户没有足够权限调用当前方法,则抛出AccessDeniedException是方法不能被调用.调用runAsManager,使在调用方法前动态改变authentication中获取用户权限.

<bean id="securityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="validateConfigAttributes">
<value>false</value>
</property>
<property name="authenticationManager">
<ref local="authenticationManager" />
</property>
<property name="accessDecisionManager">
<ref local="accessDecisionManager" />
</property>
<property name="runAsManager">
<ref local="runAsManager" />
</property>
<property name="objectDefinitionSource">
<value>
sample.contact.ContactManager.create=ROLE_USER
sample.contact.ContactManager.getAllRecipients=ROLE_ADMIN
</value>
</property>
</bean>


BeanNameAutoProxyCreator
设置AOP代理的最简单方法就是用Spring的BeanNameAutoProxyCreator.在BeanNameAutoProxyCreator中选出你所需要的interceptor,和列出你所需要保护的Bean.


<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass" value="true" />
<property name="interceptorNames">
<list>
<idref local="securityInterceptor" />
</list>
</property>
<property name="beanNames">
<list>
<idref bean="userManager"/>
<idref bean="roleManager"/>
<idref bean="rescManager"/>
</list>
</property>
</bean>

 

3.其他组件

AccessDecisionManager
AccessDecisionManager接口有decide()和support()方法.decide()方法是进行决策是否批准通过,如果没有抛出AccessDeniedException则为允许访问资源,否则拒绝访问.support()方法是根据配置属性和受保护资源的类来判断是否需要对该资源作出决策判断.
AccessDecisionManager有三个实现类,功能各不相同:
AffirmativeBased:当至少有一个Voter投允许票才通过
UnanimousBased:没有Voter投反对票时才通过
ConsensusBased:当所有Voter都投允许票时才通过


<bean id="accessDecisionManager" class="org.acegisecurity.vote.UnanimousBased">
<property name="allowIfAllAbstainDecisions">
<value>false</value>
</property>
<property name="decisionVoters">
<list>
<ref local="roleVoter" />
</list>
</property>
</bean>

<bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter" />


AuthenticationManager

AuthenticationManager的其中一个实现是ProviderManager,它负责把身份验证的工作委托给一个或多个Provider(认证提供者).

Provider都是实现AuthenticationProvider接口,该接口有两个方法authenticate()和support().authenticate()方法会尝试验证用户身份,若验证成功则返回一个Authentication对象,否则抛出一个AuthenticationException.

support()方法会评估当前Authentication对象是否适合这个Provider来进行进一步的处理,而不是指已经通过.

Provir有多个实现.例如daoAuthenticationProvider,anonymousAuthenticationProvider,rememberMeAuthenticationProvider.


<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
<property name="providers">
<list>
<ref local="daoAuthenticationProvider"/>
<ref local="anonymousAuthenticationProvider"/>
<ref local="rememberMeAuthenticationProvider"/>
</list>
</property>
</bean>


daoAuthenticationProvider负责提供用户信息,包括用户名和密码。其中取用户名密码的工作就交给userDetailsService来做。通过userCache来缓存用户信息,减少查询数据库次数。用passwordEncoder来使用加密密码。userDetailsService的接口实现有jdbcDaoImpl和inMemoryDaoImpl。jdbcDaoImpl通过数据库获取用户名和密码,而inMemoryDaoImpl则只是通过xml定义的方式来获取。
userCache的接口实现有EhCacheBasedUserCache和NullUserCache。NullUserCache实际上就是不进行缓存。EhCacheBasedUserCache是基于ehcache的开源缓存项目来实现的。
passwordEncoder是使用加密器对用户输入的明文进行加密。Acegi提供了三种加密器:
PlaintextPasswordEncoder---默认,不加密,返回明文.
ShaPasswordEncoder---哈希算法(SHA)加密
d5PasswordEncoder---消息摘要(MD5)加密


<bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
<property name="userDetailsService"><ref local="jdbcDaoImpl"/></property>
<property name="userCache"><ref local="userCache"/></property>
<property name="passwordEncoder"><ref local="passwordEncoder"/></property>
</bean>

<bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>

<bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
<property name="cache"><ref local="userCacheBackend"/></property>
</bean>

<bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/>

<bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
<property name="cacheManager">
<ref local="cacheManager"/>
</property>
<property name="cacheName">
<value>userCache</value>
</property>
</bean>
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>


anonymousAuthenticationProvider负责匿名用户的AnonymousAuthenticationToken的进一步处理

<bean id="anonymousAuthenticationProvider" class="org.acegisecurity.providers.anonymous.AnonymousAuthenticationProvider">
<property name="key"><value>foobar</value></property>
</bean>


rememberMeAuthenticationProvider负责Cookies记忆用户RememberMeAuthenticationToken的进一步处理


<bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
<property name="key"><value>springRocks</value></property>
</bean>


RememberMeServices

rememberMeServices负责通过以cookie的形式保存先前的用户登录信息.在Authentication对象不存在时,rememberMeProcessingFilter会调用rememberMeServices的autoLogin()方法,尝试在cookies中获取用户登录信息,如果存在则并返回Authentication对象.在每次用户登录时,如果设置了RememberMe功能,在验证用户身份成功后,则会调用loginSuccess()方法记录用信息在cookies中,否则调用loginFail()方法清除cookie.


<bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="userDetailsService" />
<property name="key" value="changeThis" />
</bean>


runAsManager
runAsmanager提供了动态替换ContextHolder中Ahthentication对象的功能.

<bean id="runAsManager" class="org.acegisecurity.runas.RunAsManagerImpl">
<property name="key">
<value>my_run_as_password</value>
</property>
</bean>

 

分享到:
评论

相关推荐

    Acegi 详细配置说明

    Acegi的配置主要涉及以下几个关键组件: 1. **安全上下文(Security Context)**:这是存储当前用户安全信息的地方,包括认证的Principal(用户信息)和权限信息。 2. **认证管理器(Authentication Manager)**:...

    spring的acegi应用

    Acegi是Spring早期的一个安全组件,后来发展成为Spring Security,是Spring生态系统中的重要部分,用于提供全面的安全解决方案。 Spring Security(原名Acegi Security)是一个强大的框架,用于保护基于Spring的...

    acegi-security-resin-0.8.3.jar.zip

    1. **理解Acegi Security配置**:阅读官方文档,了解如何在Spring配置文件中声明Acegi Security组件,如FilterChainProxy、AuthenticationProvider等。 2. **设置Resin服务器**:根据Acegi的指导配置Resin服务器,...

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

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

    acegi-security-1.0.4.jar的源码

    5. **核心组件**:`AuthenticationManager`负责处理认证,`SecurityContextHolder`持有当前安全上下文,`AccessDecisionManager`处理授权决策,`AuthenticationEntryPoint`用于处理未授权访问时的响应。 6. **源码...

    acegi-security-1.0.5.zip

    8. license.txt、readme.txt和notice.txt:这些文件分别包含了框架的许可协议、使用说明和版权信息,对于理解Acegi Security的使用权限和限制至关重要。 Acegi Security的设计理念是将安全性融入到应用程序的开发...

    集成ACEGI 进行权限控制.rar

    压缩包内的“集成ACEGI 进行权限控制详细介绍”很可能是详细说明如何在项目中集成和配置ACEGI Security的文档。这个文档可能涵盖了从添加依赖、配置安全设置到编写自定义逻辑的所有步骤,是学习和实践ACEGI ...

    acegi-security-catalina-0.8.1.jar.zip

    这个"acegi-security-catalina-0.8.1.jar.zip"文件包含的是Acegi Security的一个特定版本——0.8.1,与Apache Tomcat(Catalina是Tomcat的主要组件,负责Servlet容器的部分)集成的版本。这个zip文件里有两个主要...

    acegi-security-jboss-0.8.1.jar.zip

    总的来说,这个压缩包为在JBoss环境中使用Acegi Security提供了必要的组件。开发者在使用前,需要了解Acegi Security的配置和用法,遵循"springframework-license.txt"中的许可规定,并确保正确地集成到自己的Spring...

    最新ACEGI2.0教程

    - **配置**:详细说明如何配置表单身份验证机制,包括登录页面的定制和错误处理逻辑。 通过以上详细的内容介绍,我们可以看到Spring Security不仅仅是一个简单的认证与授权工具,它还提供了丰富的功能集来满足企业...

    acegi-security-jboss-0.7.0.jar.zip

    1. **Acegi Security**: Acegi Security在2009年被Spring Security所取代,但它是Spring生态系统早期的重要安全组件。它提供了一种灵活的方式来保护基于Spring的应用程序,包括用户身份验证、访问控制、会话管理等...

    acegi-security-cas-0.8.1.jar.zip

    Acegi Security CAS 0.8.1中的主要组件包括: 1. **Authentication Manager**:负责处理用户的认证请求,与各种认证机制(如数据库、LDAP或CAS服务器)进行交互。 2. **Access Decision Manager**:处理权限决策,...

    acegi-security-jboss-lib-0.6.1.jar.zip

    6. **与Spring的深度集成**:Acegi Security设计为Spring框架的一个模块,可以无缝地与其他Spring组件配合工作,如Spring MVC、Spring AOP等。 7. **可扩展性**:开发者可以通过自定义拦截器和策略类来扩展其功能,...

    Spring Security(Spring安全权限管理手册) PDF

    - **与Spring框架的高度集成**:作为Spring的子项目,Spring Security能够无缝地与Spring框架中的其他组件协同工作。 - **灵活性**:Spring Security提供了高度可定制化的配置选项,允许开发者根据具体需求调整...

    jsecurity 资料

    在IT安全领域,JSecurity(后更名为Apache Shiro)是一款轻量级且功能强大的Java安全框架,它为开发者提供了简单易用的安全控制手段,相较于早期的Acegi Security(现为Spring Security),JSecurity在设计上更注重...

    spring in action英文版

    第4章“征服数据库”详细讨论了Spring的DAO(Data Access Object)理念,并说明了如何使用Spring的JDBC支持。Spring也提供了对多种ORM框架的支持,如Hibernate、JDO、iBATIS以及OJB,这些都是Java持久化技术的一部分...

    instantmessage-lib

    以下是一些关键知识点的详细说明: 1. **Java Chat**: Java Chat是该系统的核心部分,它允许用户在网站上进行实时通信。这通常涉及到Socket编程,用于创建客户端和服务器之间的连接。Java的多线程技术也在这里发挥...

Global site tag (gtag.js) - Google Analytics