`

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
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目源代码

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

    JAVA上百实例源码以及开源项目

     用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...

    java开源包1

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包11

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包2

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包3

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包6

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包5

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包10

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包4

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包8

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包7

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包9

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    java开源包101

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

    Java资源包01

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

Global site tag (gtag.js) - Google Analytics