- 浏览: 924943 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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初体验及初解剖(http://rmn190.iteye.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把对上"暗号"的
Authentication对象通过方法
SecurityContextHolder.getContext().setAuthentication存放到
SecurityContext中,以备后用.
Step5/Step6: Acegi将Request(当然还有Response)交给下一个Fillter, 我们例子中是
filterInvocationInterceptor(实际上交给了
exceptionTranslationFilter,这里我们为了讨论的方便,假定交给了
filterInvocationInterceptor
),这个filter再从SecurityContextHolder中取出SecurityContext,再取出里面的已经对上"暗号"的Authentication对象(此对象在本例中实际上是封装了users.properties里这样的"
james=tom@1231,ROLE_TECHNICIAN
"键值对), 再把这个
Authentication对象交给当前bean中配置的
accessDecisionManager属性以决定
Authentication是否能访问它想访问的资源.经
accessDecisionManager"研究"后发现可以访问,此时Acegi即将Request/Response交给我们系统里配置的相应方法(如Struts里配置的某一method).若"研究"时发现没权限,则以异常的方式交给上面提到的
exceptionTranslationFilter,这个filter再重定向到
loginFormUrl指定的URL上.
到这步骤已走完了, 那怎么没看到"七剑"中的另三剑呢? 它们是
GrantedAuthority
, UserDetails
, Us
erDetailsService
. 实际上它们在filterInvocationInterceptor中用到了, 不过当时为了讨论的方便,并没有写出来. 是这样的, 在决定一个
Authentication是否可以访问它想要的资源时,
accessDecisionManager会从
Authentication里
调用getAuthorities得到它的
GrantedAuthority
[]
, 再将它们与通过Us
erDetailsService
得到的
UserDetails
对象里方法返回的GrantedAuthority[]一一比较, 若在比较过程中发现有个对应上了, 就表示有权访问,否则即无权. 这里所论述的过程正是上面
accessDecisionManager所做的"研究".
好了,至此, 我们通过跟踪请求的来龙去脉把
applicationContext-acegi-security.xml配置中的Filter走了一遍,更重要的是走filter时,我们与Acegi江湖里的鼎鼎大名的"七剑"有了短暂但美好的接触.
发表评论
-
Spring下配置job
2010-07-20 15:58 3398没什么可说的, 今天把以前配置的一个job重新整理了下,用ma ... -
研究下Spring中AOP的实现?
2010-06-03 17:57 1323碰到一个AOP的问题, 见“用Spring的 ... -
Debug地研究Hibernate分页功能过程中的另外收获
2009-12-17 15:04 13211, 如用MySQL,其分页sql是啥样的: selec ... -
CJC(二): abstract、子类与多态的单例模式
2009-03-16 10:33 2253CJC是Common Java Cookbo ... -
CJC(一): ToStringBuilder两种方法用法优缺点及一个问题
2009-03-15 20:37 4030CJC是Common Java Cookbook的缩 ... -
研究源码的新天地: 避害趋利
2009-03-14 14:48 1637前两篇分别描述了"为什么要研究源码" ... -
Acegi(十三): 让系统记住我
2009-03-13 09:59 2479经过一段时间的总结, 对Acegi的初步研究终于到 ... -
研究源码的新天地: 研究源码的痛苦
2009-03-12 15:50 1760上篇 中,写了出于什 ... -
研究源码的新天地: 为什么研究源码?
2009-03-11 21:03 1902把前些列出的一个 ... -
Acegi(十二): anonymousProcessingFilter有什么好玩的?
2009-03-09 17:47 2433在这篇博客中, 我们接着看另一个Filter, ano ... -
Acegi(十一): 借鉴Acegi的Exception的异常处理
2009-03-05 11:16 1496今天改项目中的一个问题时, 不由自住地想到了Acegi异 ... -
Acegi(十): securityContextHolderAwareRequestFilter结
2009-03-04 21:46 1843在Acegi(八) 和Acegi ... -
Acegi(九): 子类SavedRequestAwareWrapper
2009-03-02 22:27 2224上篇 中我们对 securi ... -
Acegi(八): securityContextHolderAwareRequestFilter
2009-03-01 22:03 2406上篇 中我们说了下 LogoutFilter的配置, 这篇 ... -
Acegi(七): LogoutFilter配置及几个问题
2009-02-28 18:49 2839这些天有点懒散, 想 ... -
Acegi源码研究(六): Acegi编码/设计碎得
2009-02-18 22:28 1625前些天通过一个Acegi的Web实例,我们感受了下 ... -
CoreJava: 第一次用LinkedHashSet带来的思考(二)
2009-02-15 21:05 1546在第一次用LinkedHa ... -
CoreJava: 第一次用LinkedHashSet带来的思考(一)
2009-02-14 19:34 8283用Java虽说时间不 ... -
Acegi(四):Acegi初体验及初解剖
2009-02-14 12:03 3302上篇博客中,我们以静态地角度对Acegi的核心概念及其 ... -
Acegi(三): Acegi? Who are you?
2009-02-13 08:38 2440Acegi是个什么? ...
相关推荐
解剖Acegi部分,博主可能会深入到源码层面,探讨Acegi如何在运行时工作。这可能涉及到SecurityContext、Authentication对象、ProviderManager和AuthenticationProvider等核心组件。理解这些概念对于定制安全策略或...
深入研究Acegi Security的源码,可以让我们更好地理解其内部工作原理,从而定制和优化自己的安全解决方案。例如,通过阅读`org`目录下的类,我们可以看到Acegi Security是如何实现认证、授权、会话管理等核心功能的...
### acegi源码解读:深度剖析Spring Security核心组件 #### 引言 在现代Web应用开发中,安全性是至关重要的一个方面。Spring Security作为Spring框架的一部分,提供了强大的安全功能,包括认证、授权、会话管理等...
JAVA开发专家:敏捷Acegi、CAS:构建安全的Java系统 pdf
6. **源码分析**:由于标签中有“源码”一词,博文可能深入讲解了 Acegi 源码的某个部分,帮助读者理解其内部工作原理,或者展示了如何根据需求自定义 Acegi 组件。 7. **工具使用**:标签中的“工具”可能指的是 ...
acegi与cas集成 <!-- ========= Acegi as a CAS Client的配置============= --> class="org.acegisecurity.ui.cas.CasProcessingFilter"> ref="authenticationManager" /> value="/login.do?...
在安全检查完成后,`FilterSecurityInterceptor`会调用`FilterChain`的`doFilter()`方法,允许请求继续向下传递到下一个过滤器或目标资源。最后,在`afterInvocation()`方法中,清理资源并执行任何必要的后处理操作...
Acegi 安全框架是 Spring 框架的一个扩展,用于提供高级安全性和身份验证功能。这个框架在 Java 应用程序中非常受欢迎,因为它允许开发者以声明式的方式定义访问控制规则,使得应用的安全管理更加方便。在这个"使用 ...
Acegi是Spring Security的前身,它是一个用于Java企业级应用的安全框架,提供了全面的身份验证、授权和会话管理功能。这个压缩包包含了Acegi的示例代码和一个学习资源,对于初学者来说是非常宝贵的资料。 首先,让...
在源码层面,Acegi 的实现涉及到许多接口和类,如 `Authentication`、`AuthorizationRequest` 和 `SecurityContextHolder`,它们协同工作以提供全面的安全控制。理解这些核心组件的工作原理对于优化和定制 Acegi ...
Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目,全称为Acegi Security System for Spring,当前版本为 0.8.3。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和...
综上所述,这个源码包提供了一个研究Acegi Security如何与Spring框架协作实现安全控制的机会。虽然现在Acegi已不再更新,但其核心理念和机制在Spring Security中得到了继承和发展,因此了解Acegi仍然对理解现代Web...
Acegi 是一个在Java开发领域,特别是Spring框架中曾经广泛使用的安全组件,全称为Acegi Security。这个系统为Spring应用程序提供了全面的安全管理解决方案,包括身份验证、授权、会话管理以及安全事件处理等功能。...
在实际应用中,我们通常会遵循以下步骤来使用Acegi: 1. **集成Acegi**:将Acegi库添加到项目的类路径中,并在Spring配置文件中声明Acegi的安全配置。 2. **配置安全上下文**:定义安全上下文,指定认证和授权的...
而Acegi Security是Spring社区早期的一个安全模块,它提供了全面的身份验证、授权和会话管理功能,为基于Spring的应用程序提供了强大的安全性支持。本实战教程将深入探讨如何将Acegi Security集成到Spring框架中,...
这个"acegi 例子源码"很可能是基于《精通spring2.x企业级应用》第17章的内容,该章节可能详细介绍了如何利用Acegi Security进行权限管理和用户认证。 在Spring 2.x的时代,Acegi Security是一个非常重要的安全解决...
acegi-security 1.0.2.jar