- 浏览: 907999 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (322)
- Hibernate研究&源码 (27)
- Server (10)
- Coder碎语 (64)
- EnglishMulling (11)
- About XML (1)
- persistence (12)
- Core Java & OO (23)
- Java EE (6)
- JavaScript/JSON/Ajax/ext... (22)
- 我的读书笔记 (16)
- Source Codes Study (29)
- workFlow/jBPM (22)
- OFBiz: Open For Business (1)
- 项目积累 (21)
- srcStudy_acegi (1)
- Cache/Ehcache... (9)
- Java Test/JUnit.. (7)
- maven/ant (2)
- 设计模式 (1)
- SOA/cxf/ws-security (2)
- Android (4)
- 云计算/Hadoop (2)
- 加密/签名 (1)
- 正则表达式 (1)
- htmlparser (1)
- 操作系统 (5)
- DB (1)
最新评论
-
天使建站:
这里这篇文章更详细 还有完整的实例演示:js跳出循环 ...
jQuery中each的break和continue -
heshifk:
刚刚我也遇到同样的问题,然后就在纠结为什么不能直接使用brea ...
jQuery中each的break和continue -
masuweng:
不错写的.
集万千宠爱于一身的SessionImpl:get研究(四): Hibernate源码研究碎得(8) -
muzi131313:
这个老是忘,做一下笔记还是挺好的
jQuery中each的break和continue -
lg068:
data = data.replace("\n&qu ...
项目小经验: eval与回车符
经过一段时间的总结, 对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及其支撑类配合的.
- applicationContext-acegi-security.rar (1.5 KB)
- 下载次数: 62
发表评论
-
Spring下配置job
2010-07-20 15:58 3352没什么可说的, 今天把以前配置的一个job重新整理了下,用ma ... -
研究下Spring中AOP的实现?
2010-06-03 17:57 1270碰到一个AOP的问题, 见“用Spring的 ... -
Debug地研究Hibernate分页功能过程中的另外收获
2009-12-17 15:04 12801, 如用MySQL,其分页sql是啥样的: selec ... -
CJC(二): abstract、子类与多态的单例模式
2009-03-16 10:33 2193CJC是Common Java Cookbo ... -
CJC(一): ToStringBuilder两种方法用法优缺点及一个问题
2009-03-15 20:37 3956CJC是Common Java Cookbook的缩 ... -
研究源码的新天地: 避害趋利
2009-03-14 14:48 1581前两篇分别描述了"为什么要研究源码" ... -
研究源码的新天地: 研究源码的痛苦
2009-03-12 15:50 1714上篇 中,写了出于什 ... -
研究源码的新天地: 为什么研究源码?
2009-03-11 21:03 1863把前些列出的一个 ... -
Acegi(十二): anonymousProcessingFilter有什么好玩的?
2009-03-09 17:47 2391在这篇博客中, 我们接着看另一个Filter, ano ... -
Acegi(十一): 借鉴Acegi的Exception的异常处理
2009-03-05 11:16 1434今天改项目中的一个问题时, 不由自住地想到了Acegi异 ... -
Acegi(十): securityContextHolderAwareRequestFilter结
2009-03-04 21:46 1775在Acegi(八) 和Acegi ... -
Acegi(九): 子类SavedRequestAwareWrapper
2009-03-02 22:27 2169上篇 中我们对 securi ... -
Acegi(八): securityContextHolderAwareRequestFilter
2009-03-01 22:03 2347上篇 中我们说了下 LogoutFilter的配置, 这篇 ... -
Acegi(七): LogoutFilter配置及几个问题
2009-02-28 18:49 2776这些天有点懒散, 想 ... -
Acegi源码研究(六): Acegi编码/设计碎得
2009-02-18 22:28 1569前些天通过一个Acegi的Web实例,我们感受了下 ... -
Acegi源码研究(五):七剑下天山
2009-02-17 23:10 1965在Acegi初体验及初解剖(http://rmn19 ... -
CoreJava: 第一次用LinkedHashSet带来的思考(二)
2009-02-15 21:05 1503在第一次用LinkedHa ... -
CoreJava: 第一次用LinkedHashSet带来的思考(一)
2009-02-14 19:34 8247用Java虽说时间不 ... -
Acegi(四):Acegi初体验及初解剖
2009-02-14 12:03 3229上篇博客中,我们以静态地角度对Acegi的核心概念及其 ... -
Acegi(三): Acegi? Who are you?
2009-02-13 08:38 2390Acegi是个什么? ...
相关推荐
用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
用JAVA开发的一个小型的目录监视系统,系统会每5秒自动扫描一次需要监视的目录,可以用来监视目录中文件大小及文件增减数目的变化。 Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...
BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...