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及其支撑类配合的.

时间: 2024-08-03 12:05:27

Acegi(十三):让系统记住我的相关文章

如何轻松找回系统记住的WIFI密码

  第一步:安装"RE管理器"(这基本上是手机ROOT后必备的软件了); 第二步:打开"RE管理器",进入data/misc/wifi路径; 第三步:找到bcm_supp.conf或wpa_supplicant.conf文件,并打开; 第四步:现在手机里保存过的WIFI账号的密码就一目了然了.ssid=后面的是WIFI网络名,psk=后面的就是相应的密码.

JavaWeb学习----Cookie实现记住密码的功能

一.什么是Cookie cookie是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段.Cookie的目的就是为用户带来方便,为网站带来增值.虽然有着许多误传,事实上Cookie并不会造成严重的安全威胁.Cookie永远不会以任何方式执行,因此也不会带来病毒或攻击你的系统.另外,由于浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB,因此Cookie不会塞满你的硬盘. 例如,当我们第一次访问网站输入用户名密码时,可以选择让系统

Acegi(三):Acegi?Who are you?

Acegi是个什么? 是一个基于Spring的开源框架,用来做安全控制. 基于Spring? 能不能在不用Spring的情况下配置Acegi呢?Acegi官网上有一个链接:Use Withou Spring ,看来是可以的,自己还没有动手做过. 实现安全控制? 原理是什么? Servlet的Filter和AOP机制: 利用Filter, Acegi实现了基于Web实用的URI保护; 通过AOP,Acegi实现了对象访问方法的保护;利用ACL,Acegi实现了对prototype类型的Object

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

安全永远是WEB应用系统必须面对的头等大事, 也是最头疼的事, 其实安全系统就只包括两个问题: 认证和授权. 以前做些网站系统, 安全检测逻辑都在放在须要安全控制的代码前面, 这样做有很多不好的地方, 重复多次的编码就不用说了, 代码移植性, 重用性都得不到体现, 安全检测逻辑要永远和业务逻辑放在一起. 那么, 能不能够在进入方法前就调用一些安全检测? 其实Spring AOP就是这个思想, 那么又如何实现安全检测呢? Spring Acegi Security 框架就是做这个事情. 本文主要是

直接登录Win8系统省略密码输入步骤

微软Windows 8采用统一的"微软帐户"(Microsoft account),这个微软帐户相当于Win 8的通行证和万能钥匙.对于一些在安全环境中仅供个人使用的Win8设备比如家里的Win8一体机.台式机等等,部分用户会觉得每次都输入密码登录Win8有些繁琐,我们可以通过系统设置让Win8系统记住我们常用帐户的登录密码,这样每次开机时Win8就可以省去输入密码的过程自动登录了. 开机并登录Win8系统,进入传统桌面,按"Win+R"打开运行窗口,在输入框中输入

省略密码输入步骤直接登录Windows 8系统

微软Windows 8采用统一的"微软帐户"(Microsoft account),这个微软帐户相当于Win 8的通行证和万能钥匙.对于一些在安全环境中仅供个人使用的Win8设备比如家里的Win8一体机.台式机等等,部分用户会觉得每次都输入密码登录Win8有些繁琐,我们可以通过系统设置让Win8系统记住我们常用帐户的登录密码,这样每次开机时Win8就可以省去输入密码的过程自动登录了. 开机并登录Win8系统,进入传统桌面,按"Win+R"打开运行窗口,在输入框中输入

苹果笔记本记住的wifi账户怎么删除

  最近有读者问小编,说自己的苹果笔记本wifi老是连不上是怎么回事?经过小编各种排查,发现这位读者是更改过wifi密码的,需要把原来的wifi密码删除,然后重新连接,那要怎么删除了?下面小编就为大家带来如何删除苹果笔记本mac os x系统记住的wifi账户. 1.点击苹果笔记本连接wifi的位置,然后点击打开网络偏好设置:   2.出现网络界面,点击右下角的高级选项:   3.点击之前连接过的wifi帐号,然后点击"-"号: 4.最后wifi帐号就去掉了,到时候我们再连,这时就可以

什么是web 2.0 (4)

web 正如在上面关于google和netscape的讨论中所指出的,互联网时代定义特性之一就是,它是以服务方式传递,而不是产品.这导致这样一个公司在商业模式方面,出现很多根本性的改变.  运转(Operations)必须成为核心竞争能力.Google或yahoo的产品开发专家必须配有一个每日运转专家.因此,基本原则就是把软件从一种产品转为服务,除非每天都要维护,否则软件不会停止执行任务.Google必须不停的搜索网络.更新其索引,不断过滤垃圾链接以及影响其结果的其他尝试,不断和动态的对数百万人

网站应注意的25条有利于排名的建议

网站设计应注意的25条有利于排名的建议 第一条:网站优化最重要的是网站内容要准确定位客户,这一点是网站是否能吸引您真正期望的访问者的直接因素. 第二条:精心选择和网站主题及所瞄准的时常相关的关键字. 第三条:尽量在网站内容中利用选择的关键字,值得注意的是,关键字尽量出现在内容的前面部分. 第四条:网站的标题中一定要包含您认为最为重要的关键字. 第五条:在头部标记中尽量运用关键字,将帮助网站在基于该关键字在搜索结果中的排名. 第六条:尽量为图像加上ALT标记,在该标记中包含必要的关键字. 第七条: