`
fly.net.cn
  • 浏览: 186739 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Acegi 关键组件详述

阅读更多

作者: cac,作者保留版权,转载请注明出处。

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中获取用户身份,若再获取失败,则重定向到authenticationFailureUrl所定义登 陆失败页面。

<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清空, 把rememberMeServices从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

该过滤器会首先调用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参数,headers, 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的 decisionVoters属性需要一个或多个Voter(投票者),Voter必须实现AccessDecisionVoter 接口。Voter的工作是去匹配用户已拥有的权限和受保护的资源要求的权限,在该资源有相应权限的情况下,如果匹配则投允许票,否则投反对票。 allowIfAllAbstainDecisions属性表示是否允许所有都弃权时就通过。Voter的实现类RoleVoter在当受保护资源的名字 由ROLE_开始时才参与投票。

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()方法,尝试在cookie中 获取用户登录信息,如果存在则并返回Authentication对象。在每次用户登录时,如果设置了RememberMe功能,在验证用户身份成功后, 则会调用loginSuccess()方法记录用户信息在cookie中,否则调用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中Authentication对象的功能。

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

评论

相关推荐

    acegi

    - **过滤器链(Filter Chain)**:Acegi 使用过滤器链来拦截请求,执行安全检查,这是其实现安全控制的关键机制。 2. **Acegi 的主要组件** - **AuthenticationManager**:处理用户的登录请求,负责身份验证。 -...

    Acegi使用.pdf

    Acegi安全框架通过一系列关键组件来实现这些功能,同时它还具备高度的灵活性,可以与各种认证机制(如容器认证、CASSSO、X509等)进行整合,以适应不同的应用场景。 #### Acegi的关键组件 Acegi安全系统由多个关键...

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

    Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目,全称为Acegi Security System for ...通过这个例子详细介绍如何配置Acegi的各个组件,同时介绍如何扩展Acegi 使其能够从数据库中读取配置信息。

    基于java的ACEGI

    AceGI,全称为Acegi Security,是Java领域中一个用于Spring框架的安全组件,它提供了全面的身份验证、授权和会话管理功能。这个框架在早期的Spring版本中非常流行,为开发者构建安全的Web应用程序提供了强大的支持。...

    spring acegi 详细文档

    Acegi的核心组件包括`AuthenticationManager`、`AccessDecisionManager`和`FilterSecurityInterceptor`。 1. **AuthenticationManager**:这是处理用户认证的核心组件。它负责验证用户的凭证,如用户名和密码。...

    Acegi框架介绍 acegi安全与认证

    Acegi的核心组件包括AuthenticationManager负责身份认证,AccessDecisionManager负责访问控制决策。SecurityContextHolder作为全局的安全上下文容器,保存了每个用户的SecurityContext,其中包含了用户信息和权限。...

    acegi的使用

    安全拦截器是 Acegi 中的关键组件,它类似于锁舌,阻止未经授权的用户访问受保护的资源。只有当用户提供有效的认证信息(通常是用户名和密码)并被系统接受后,安全拦截器才会“解锁”,允许访问。 11.1.2 认证管理...

    acegi-security源码包

    它是Acegi Security与Spring MVC集成的关键组件。 5. **AbstractSecurityInterceptor**: 这是FilterSecurityInterceptor的抽象基类,定义了安全拦截器的基本行为。它管理着访问决策管理器和授权策略。 6. **...

    Acegi例子代码+一个很好的学习Acegi的网址

    4. **过滤器安全链(Filter Security Interceptor)**:Acegi的核心组件之一,它是一个Spring MVC的过滤器,会在请求被处理之前检查用户的权限。如果用户没有足够的权限,过滤器将阻止请求的进一步处理。 5. **频道...

    Acegi学习笔记(JAVA系统安全编程时用到)

    接着,设置 Acegi 的 Filter Chain 代理,这是一个关键组件,负责处理所有 HTTP 请求。在 `web.xml` 中,你需要定义一个名为 `Acegi Filter Chain Proxy` 的过滤器,并将其映射到所有 URL,以便拦截并处理每个请求。...

    ACEGI

    Acegi Security的核心设计考虑了认证(Authentication)和授权(Authorization)这两个关键的安全操作。 **认证(Authentication)**是验证用户身份的过程,Acegi Security支持多种认证机制,包括: 1. **HTTP基本...

    Acegi-spring安全框架

    Acegi的体系结构由两个主要组件构成: 1. AuthenticationManager:负责用户身份认证。当用户尝试访问受保护的资源时,AuthenticationManager会检查用户提供的身份凭证(如用户名和密码)。它使用多个...

    Spring Acegi权限控制

    1. **安全拦截器(Security Interceptor)**:这是Acegi的核心组件,它根据配置的规则对请求进行拦截,决定是否允许访问。 2. **认证管理器(Authentication Manager)**:负责处理用户的认证请求,通常会集成多种...

    acegisecurity-1.0.7

    《Acegi Security 1.0.7:Spring框架的安全认证组件深度解析》 Acegi Security是Spring框架的一个扩展,专为Java企业级应用提供安全认证和授权服务。它在Spring框架的基础上构建了一套完整的安全解决方案,使开发者...

    acegi pdf 学习

    由于文章内容是关于acegi pdf学习的参考文档,其中包含了大量关于Acegi安全系统的技术细节,因此以下将详细阐述文档中提及的关键知识点。 首先,Acegi安全系统是一个基于Spring框架的安全解决方案。文档开头简要...

    权限Acegi的使用

    Acegi Security,现已被Spring Security所取代,是Java EE应用程序中的一个强大且灵活的权限管理框架。它提供了全面的身份验证、授权和访问控制功能,旨在确保企业级应用的安全性。Acegi通过AOP(面向切面编程)的...

    spring的acegi应用

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

    spring Acegi例子,很简单的一个acegi实例,容易理解

    3. **过滤器安全链(Filter Security Interceptor)**:Acegi的核心组件之一,它是Servlet过滤器,负责拦截请求并根据配置的策略进行身份验证和授权。 4. **安全性配置(Security Configurations)**:在Spring应用...

Global site tag (gtag.js) - Google Analytics