`

Acegi(十三): 让系统记住我

阅读更多

      经过一段时间的总结, 对Acegi的初步研究终于到了最后一个常见Filter了,即 rememberMeProcessingFilter . 顾名思义, rememberMeProcessingFilter就是想让系统记下来当前登录的用户,不至于以后每次进系统时都要输入用户名密码.这方面的例子相信大家已有体会,我也就不必在些赘述.
      先简要地说下原理. 假定用户登录时选择了"让系统记住我"后, request进入Acegi后, Acegi会把用户名密码和相关信息记下来,再以Cookie的形式通过Response发往浏览器并存储到浏览器中,这样下次用户访问系统时,系统会通过
rememberMeProcessingFilter从浏览器传来的Cookie中取出先前的登录信息,做判断后以一个 remember-me authentication的形式放到SecurityContext中,接下来,跟anonymousProcessingFilter类似,在 filterInvocationInterceptor检查时,也由自己人投一票通过,于是就通过Acegi的盘问去做想做的操作. 这里我们也看来,其实是不系统记下来了,而浏览器以cookie的形式住了, Acegi只是围绕着cookie在合适的时候做些合适的事.
   
    有了这个对原理的简单介绍,下面我们来看怎么配置,以及这个原理又是由谁来具体实现的.

    按上面原理的顺序,以便用户选择是否让"系统记住我", 往login.jsp里加一个如下所示的一个input标签.
    
<input type="checkbox" name = "rememberMe " />让系统记住我
    注意下这里的
rememberMe,后面要用到的.

   再往以前定义好的
authenticationProcessingFilter里了加个属性,rememberMeServices,如下所示:
        <!--新加 start ,这个很重要,没有它系统就"记不住你"了-->
        <property name="rememberMeServices" ref="rememberMeServices"/>
        <!--新加 end -->
   
    通过个rememberMeServices, Acegi在得知用户登录成功后会把用户名和密码生成一个Cookie放入到response里,(这个cookie里有Acegi做的暗号,这样 acegi以后才能识得), 让它捎给浏览器保存下来,以备后用. 这步对应着上面用户第一次输入用户名密码成功登录的情景.

    接下就是用户不用登录访问系统了. 这要配置主角
rememberMeProcessingFilter了, 其实现类为RememberMeProcessingFilter,这个类两个属性authenticationManager和rememberMeServices需要配置.  如下:
   
<!--新加 start-->
    <bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
        <property name="authenticationManager" ref="authenticationManager"/>
        <property name="rememberMeServices" ref="rememberMeServices"/>
    </bean>
    <!--新加 end -->
    加了这个filter后, request经过这里时,acegi通过rememberMeServices(对,又是它,上面在登录成功时就用到了),把相应的cookie取出 来,再生成一个remember-me_authentication放到securityContext中, authenticationManager在此的目的是为了检验rememberMeServices从cookies里取出的remember- me_authentication是否有效.

    先看rememberMeServices定义,其定义如下:   
    <!--新加 start-->
    <bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
        <property name="userDetailsService" ref="userDetailsService"/>
        <property name="key" value="23_*!cdU='612./e;NrI"/>
        <property name="parameter" value="rememberMe"/>
    </bean>
    <!--下面, 这个rememberMeAuthenticationProvider加到了已经定义好的authenticationManager bean的providers里-->
    <bean id="rememberMeAuthenticationProvider" class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
        <property name="key" value="23_*!cdU='612./e;NrI"/>
    </bean>  
    <!--新加 end -->
    三个属性,它们分别是用来干啥的? 实际上, 在上面rememberMeProcessingFilter里,rememberMeServices通过userDetailsService对 cookie里取出的userName进行了检验,一是看现在还有没这个user, 二是看密码是否已改.这也正是下面rememberMeServices里为什么要有userDetailsService的原因.那key是干啥的呢? 在上面authenticationManager验证remember-me_authentication是否有效时与provider里的key来 做比较的,正是由于这个原因,下面两处的key值得一模一样. 那个parameter呢? 再回过头看第一步, 那里我们加了一个name为rememberMe的input标签,Acegi内部也正是通过个标签来决定是否要做进一步的装cookie处理.

    至此,结合背后的实现原理, rememberMeProcessingFilter的配置完成完毕,在filterInvocationInterceptor检查当前角色是否有足够的操作时,就会在 remember-me_authentication自己人rememberMeAuthenticationProvider的"保护"下顺利通过了.

    这里为了说明配置都起什么作用,这些配置很散,大家可从附件中看到这些配置都加到什么位置了,它们又是怎么跟原的filter及其支撑类配合的.

4
2
分享到:
评论

相关推荐

    ACEGI

    此外,Acegi Security提供的特性如“记住我”功能和“Run-as”机制,进一步增强了用户体验和系统的安全性。 使用Acegi Security,开发者可以构建出符合企业级需求的安全系统,同时避免了因更换服务器环境而需要大量...

    acegisecurity-1.0.7

    Acegi Security提供了一系列安全服务,如RememberMe服务,可以记住用户的登录状态,使用户在一段时间内无需重新登录。另外,还包括了密码加密服务,确保密码在存储和传输过程中的安全性。 五、与其他Spring组件的...

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

    7. **记住我(Remember Me)服务**:Acegi提供了“记住我”功能,允许用户在一段时间内无须重新登录即可访问系统,增强了用户体验。 通过本实战教程,读者将学习到如何设置Acegi安全框架,创建自定义认证和授权逻辑...

    spring的acegi应用

    5. **集成其他安全特性**:如CSRF防护、记住我功能、会话管理等。 至于“工具”标签,可能意味着在实现Acegi安全功能时会用到一些辅助工具,例如数据库连接池、日志框架、测试工具等。这些工具可以帮助开发者更高效...

    acegi pdf 学习

    其他认证方式还包括X509证书认证、LDAP认证、记住我认证机制等。对于每一种认证方式,文档不仅介绍了其基本概念,还提供了详细配置指导,帮助开发者更好地理解并应用到实际项目中。 此外,文档还提到了标签库的使用...

    acegi rememberMe和退出

    Acegi Security是Spring Security的前身,它是一款强大的安全框架,用于保护Java应用程序。"Remember Me"功能在Web应用中很常见,它允许用户选择“记住我”选项后,在一定时间内无需再次输入用户名和密码登录。而...

    acegi应用安全J2EE安全

    8. **Remember-me服务**:允许用户选择“记住我”功能,以便在关闭浏览器后仍能自动登录,但同时也要考虑其带来的安全风险。 9. **CSRF防护**:Acegi Security提供了防止跨站请求伪造(CSRF)的措施,通过生成和...

    acegi+ssh动态实现基于角色的权限管理

    其中包含了三个认证提供者:数据库认证提供者`daoAuthenticationProvider`、匿名认证提供者`AnonymousAuthenticationProvider`以及记住我认证提供者`RememberMeAuthenticationProvider`。 - **数据库认证提供者**:...

    grails-acegi-0.1.zip

    1. 用户认证:利用Acegi插件,可以轻松实现基于用户名和密码的登录认证,支持记住我功能,同时也可以集成OpenID、OAuth等第三方认证方式。 2. 角色与权限分配:创建角色并分配权限,比如管理员、普通用户等,通过`@...

    acegi的详细配置实现

    记住我认证是一种方便的功能,它可以让用户在关闭浏览器后仍然保持登录状态。 ##### 15.2 配置 配置记住我认证涉及到生成并管理记住我令牌。 #### 十六、X509认证 ##### 16.1 概览 X509认证是一种基于数字证书...

    Acegi框架介绍.rar

    总结,Acegi框架是Spring生态系统中的重要组成部分,它为开发者提供了强大而灵活的安全管理工具。虽然已被Spring Security取代,但理解Acegi的基础可以帮助我们更好地理解和利用Spring Security,为Java企业级应用...

    acegi rememberMe

    【acegi rememberMe】是基于Acegi Security框架的一个特性,主要关注的是用户认证过程中的“记住我”功能。Acegi Security是Spring Security的前身,它为Spring应用提供了全面的安全管理框架,包括身份验证、授权、...

    Acegi + Spring + Hibernate + Struts 2搭建基于角色的权限控制系统

    而`rememberMeAuthenticationProvider`则提供了记住我(Remember Me)的功能,使用户在一段时间内无须重新登录。 在Acegi的安全拦截器部分,我们可以使用`FilterSecurityInterceptor`来定义哪些URL需要进行权限检查...

    Acegi开发项目教程.pdf

    Acegi还支持切换用户的功能,这对于系统管理员来说非常有用。教程会解释如何实现这一功能,使得管理员可以在不注销当前用户的情况下,临时以其他用户的身份进行操作。另一个高级特性是Run-As认证服务,它允许在某些...

    Acegi开发指南.pdf

    `AuthenticatedVoter`是投票者之一,用于判断用户是否具有完全认证、记住我认证或匿名认证等权限,从而参与访问决策过程。 总的来说,Acegi提供了一套完整的安全框架,覆盖了从URL访问控制到业务逻辑安全,再到用户...

    Spring ACEGI手册(部份)

    5. **Remember Me服务**: 支持“记住我”功能,使用户在一定时间内无须再次输入登录凭据。 6. **国际化支持**: 提供多语言的安全提示和错误消息。 **使用流程** 1. **配置安全上下文**: 配置安全管理器,包括认证...

    acegi保护业务方法_basedMemory

    5. **RememberMe服务**:Acegi Security的RememberMe服务允许用户选择“记住我”,以便在关闭浏览器后仍然保持登录状态。它通常使用令牌(token)来实现,这个令牌会被存储在用户的cookie中,下次用户访问时,Acegi ...

    Acegi 各过滤的解析(一)

    2. **RememberMeProcessingFilter**:该过滤器处理"记住我"的功能,允许用户在一段时间内无需再次登录。它通过存储在用户浏览器的cookie来识别已记住的会话,并自动恢复用户的身份验证状态。 3. **...

    acegi rememberMe和匿名登录

    "Remember Me"功能在许多Web应用中非常常见,它允许用户在登录后选择“记住我”,以便在未来的会话中自动登录,而无需每次都输入用户名和密码。Acegi Security提供了这种便利性,通过在用户登录时创建一种持久化的...

Global site tag (gtag.js) - Google Analytics