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的"掩护"下顺利通过了.
#p#分页标题#e#
这里为了说明设置都起什么浸染,这些设置很散,各人可从附件中看到这些设置都加到什么位置了,它们又是怎么跟原的filter及其支撑类共同的.