Acegi源码研究(五):七剑下天山 - 编程入门网
Acegi源码研究(五):七剑下天山时间:2009-12-13 javaeye rmn190在Acegi初体验及初解剖(http://rmn190.javaeye.com/blog/332711)里, 通过对web.xml和applicationContext-acegi-security.xml的跟踪,我们得出被Acegi拦截下的请求最终交到了filterInvocationDefinitionSource配置下的几个Filter的实现类来处理. 它们是怎么处理这个请求的呢? 在Acegi(三): Acegi? Who are you? ,我们听说江湖中有"七剑", 但这么久了"七剑"怎么还 没露面呢? 这篇博客中我们将看到下天山的"七剑". 首先我看下都有哪些Bean参于了Acegi的保卫工作, 如下图所示: 上面是静态的定义, 再看下图的动态调用图: 这里结合着上图,我们跟着浏览器发出的请求走一遍. Step1: 对上就上图中数字1,这里浏览器发出一个请求. Step2: Web服务器,我们这里的Tomcat接受到Step1发来的HTTP请求, 把里面的信息抽取出来,组装成一个Request 对象, 同时Tomcat也生成了一个Response对象,这样接下的Request穿过的Filter都有机会来修改这个Response对象了, 也正是Acegi抓住了这个机会利用Filter来改变Response里的值达到保护我们系统的作用.这里Request到达图中的"Filter chain proxy", 我们还记得web.xml中配置的" FilterToBeanProxy "及基配置参数 FilterChainProxy(targetClass的值), 再看Bean图中的 filterChainProxy,这里我们动态地感觉到这个 filterChainProxy的存在了.通过配置中的" /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor" 一句我们告诉 filterChainProxy 当Request来时,都有哪些Filter处理这个Request. Step3/Step4: filterChainProxy调用filterChain中的第一个Filter,也就是 httpSessionContextIntegrationFilter . 这个httpSessionContextIntegrationFilter 是 HttpSessionContextIntegrationFilter类的实例, 这个类正是"七剑"之一. 从它的名字上,我们也隐隐约约地感觉到了点什么: 把Context integrate 到HttpSession中? 对的, 在HttpSessionContextIntegrationFilter的 doFilter方法里Acegi从HttpSession中获得 SecurityContext 对象(或没有的话新建个), 随后再把这个 SecurityContext存放到 SecurityContextHolder中, 很自然嘛, SecurityContextHolder 就是用来放 SecurityContext的. 做了这些处理后, httpSessionContextIntegrationFilter通过 chain.doFilter方法将执行权交给下一filter. 我们例子中下一个filter就是 authenticationProcessingFilter,它是 AuthenticationProcessingFilter的实例,看它名字里有Authentication跟"七剑"中的 Authentication有关系? 不错, authenticationProcessingFilter类中有一个 requiresAuthentication方法, 顾名思义,它是看当前的Request是否是用来做验证的,也就是说是否是登录的. 这就用到了Bean配置 authenticationProcessingFilter里属性, 看Acegi的源码可以得到验证. 接下来, 在方法 attemptAuthentication中Acegi从Request中取出 username和 password组建一个 Authentication 对象, 再由配置中的 authenticationManager来加以验证,若"暗号"没对上的话, 就有一个 AuthenticationException异常抛出, authenticationProcessingFilter catch住这个 AuthenticationException,再通过 sendRedirect方法在浏览器中指向 authenticationFailureUrl的值" /login.jsp?login_error=1 ". 若"暗号"对上了,将通过方法 successfulAuthentication重定向到 defaultTargetUrl指定的页面, 同时Acegi把对上"暗号&q |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |