﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-刘文涛-随笔分类-spring 安全框架 acegi-security</title><link>http://www.blogjava.net/liuwentao253/category/14265.html</link><description>SPRING,设计模式,UML,Oracle</description><language>zh-cn</language><lastBuildDate>Sun, 06 Jan 2008 03:44:22 GMT</lastBuildDate><pubDate>Sun, 06 Jan 2008 03:44:22 GMT</pubDate><ttl>60</ttl><item><title>Acegi 资源配置动态扩展实现</title><link>http://www.blogjava.net/liuwentao253/archive/2007/01/30/96760.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 30 Jan 2007 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/01/30/96760.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. 问题提出		在使用 Acegi Security Framework 的过程中, 如果细心的话, 会发现其资源和角色配置是在配置文件中的, 下面是 Appfuse 中相关配置 : 										&lt;				bean id				=				"				filterInvocationInterceptor				"				 				class...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuwentao253/archive/2007/01/30/96760.html'>阅读全文</a><img src ="http://www.blogjava.net/liuwentao253/aggbug/96760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-01-30 16:57 <a href="http://www.blogjava.net/liuwentao253/archive/2007/01/30/96760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关acegi实现ACL的问题 </title><link>http://www.blogjava.net/liuwentao253/archive/2007/01/30/96719.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 30 Jan 2007 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/01/30/96719.html</guid><description><![CDATA[
		<p>acegi的权限控制并不是基于role和group的，但我们却可以进行扩展，比如Acl_Permission表中的recipient就可以设为role或者是group,但问题也就来了，我使用的是username登陆，authenticationManager里维护的是username的信息，我该如何同Acl_Permission表中的role或者group对应上呢？<br /><br />----------------<br /><br /></p>
		<table width="100%">
				<tbody>
						<tr>
								<td>
										<p>authenticationManager里维护的是Authentication接口的实现类. <br />Authentication接口定义了GrantedAuthurity[],这个GrantedAuthurity可以对应系统中的Role,也可以对应Permission或者Group, 具体对应什么,取决于你的AccessDecisionManager和相关的Voter.</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/96719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-01-30 14:01 <a href="http://www.blogjava.net/liuwentao253/archive/2007/01/30/96719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈Acegi配置 </title><link>http://www.blogjava.net/liuwentao253/archive/2007/01/29/96469.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Mon, 29 Jan 2007 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/01/29/96469.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Acegi是基于Spring的一个开源的安全认证框架，现在的最新版本是1.04。Acegi的特点就是有很多的过滤器：不过我们也用不到这么多的过滤器，只是可以把它们看作为一个个的模块，在用的时候加上自己用的着的即可，由于认证的流程的方面比较复杂导致它的配置很复杂，如果能摸清它的工作原理还是不太难.下面用比较顺着人思维的流程过一遍 这里只列出常用的过滤器和拦载器 1. 过滤器：						...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuwentao253/archive/2007/01/29/96469.html'>阅读全文</a><img src ="http://www.blogjava.net/liuwentao253/aggbug/96469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-01-29 11:59 <a href="http://www.blogjava.net/liuwentao253/archive/2007/01/29/96469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi学习小结 </title><link>http://www.blogjava.net/liuwentao253/archive/2007/01/29/96467.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Mon, 29 Jan 2007 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2007/01/29/96467.html</guid><description><![CDATA[
		<p>
				<b>一、基本原理</b>
				<br />Acegi认证授权主要基于两大技术，一是Filter机制，二是AOP的拦截机制。<br /><br />通过FilterSecurityInterceptor很好地实现了对URI的保护，<br />通过MethodSecurityInterceptor实现了对Service的方法的拦截保护，<br />通过ACL 实现了对prototype类型的Object进行过滤和保护。</p>
		<p>
				<b>二、基本概念</b>
				<br />HttpSessionContextIntegrationFilter 存储SecurityContext in HttpSession <br />ChannelProcessingFilter 重定向到另一种协议，如http到https</p>
		<p>ConcurrentSessionFilter 因为不使用任何SecurityContextHolder的功能，但是需要更新SessionRegistry来表示当前的发送请求的principal，通过在web.xml中注册Listener监听Session事件，并发布相关消息，然后由SessionRegistry获得消息以判断当前用户的Session数量。</p>
		<p>AuthenticationProcessingFilter 普通认证机制(大多数用这个)</p>
		<p>CasProcessingFilter CAS认证机制</p>
		<p>BasicProcessingFilter Http协议的Basic认证机制</p>
		<p>HttpRequestIntegrationFilter Authentication 从容器的HttpServletRequest.getUserPrincipal()获得</p>
		<p>JbossIntegrationFilter 与Jboss相关。</p>
		<p>SecurityContextHolderAwareRequestFilter 与servlet容器结合使用。</p>
		<p>RememberMeProcessingFilter 基于Cookies方式进行认证。</p>
		<p>AnonymousProcessingFilter 匿名认证。</p>
		<p>ExceptionTranslationFilter 捕获所有的Acegi Security 异常，这样要么返回一个HTTP错误响应或者加载一个对应的AuthenticationEntryPoint</p>
		<p>AuthenticationEntryPoint 认证入口</p>
		<p>
				<b>三、Acegi认证授权流程</b>
				<br />1、FilterToBeanProxy 负责代理请求给FilterChainProxy</p>
		<p>2、FilterChainProxy 方便的将多个Filter串联起来，如上面基本概念中提到的各种Filter，当然如果对URI进行授权保护，也可以包含FilterSecurityInterceptor。注意各Filter的顺序。</p>
		<p>3、<strong><font color="#0000ff"><u>AbstractSecurityInterceptor 调度中心</u></font></strong>。负责调用各模块完成相应功能。 <br />FilterSecurityInterceptor 对URI进行拦截保护 <br />AspectJSecurityInterceptor 对方法进行拦截保护 <br />MethodSecurityInterceptor 对方法进行拦截保护</p>
		<p>4、AuthenticationManager 用户认证 <br />-&gt; AuthenticationProvider 实际进行用户认证的地方(多个)。 <br />-&gt; UserDetailsService 返回带有GrantedAuthority的UserDetail或者抛出异常。</p>
		<p>5、AccessDecisionManager(UnanimousBased/AffirmativeBased/ConsensusBased) 授权 <br />-&gt; AccessDecisionVoter(RoleVoter/BaseAclEntryVoter) 实际投票的Voter(多个).</p>
		<p>6、RunAsManager 变更GrantedAuthority</p>
		<p>7、AfterInvocationManager 变更返回的对象 <br />-&gt; BaseInvocationProvider 实际完成返回对象变更的地方(多个)。</p>
		<p> </p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/96467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2007-01-29 11:53 <a href="http://www.blogjava.net/liuwentao253/archive/2007/01/29/96467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>acegi 参考的部分翻译1 </title><link>http://www.blogjava.net/liuwentao253/archive/2006/09/06/68103.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Wed, 06 Sep 2006 11:29:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/09/06/68103.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文档是"Spring框架下Acegi安全系统"(Acegi Security System for Spring)的一份参考指南，Acegi安全系统是由一序列类构成,这些类为Spring框架提供认证和授权服务。第一章 安全1 :  准备Acegi通过对流行的WEB容器的可选集成而为使用Spring编写的项目提供认证与授权的能力.这种安全架构是全部用"Spring方式"开发,包括使用bean co...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuwentao253/archive/2006/09/06/68103.html'>阅读全文</a><img src ="http://www.blogjava.net/liuwentao253/aggbug/68103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-09-06 19:29 <a href="http://www.blogjava.net/liuwentao253/archive/2006/09/06/68103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>acegi 角色在哪里定义</title><link>http://www.blogjava.net/liuwentao253/archive/2006/09/06/68089.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Wed, 06 Sep 2006 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/09/06/68089.html</guid><description><![CDATA[
		<p>在如下的配置中：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080"> 1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">  </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bean id</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">channelProcessingFilter</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">org.acegisecurity.securechannel.ChannelProcessingFilter</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #008080"> 2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">channelDecisionManager</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;&lt;</span>
				<span style="COLOR: #000000">ref local</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">channelDecisionManager</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/&gt;&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #008080"> 3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">filterInvocationDefinitionSource</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #008080"> 4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #008080"> 5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON <br /></span>
				<span style="COLOR: #008080"> 6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                                \A</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">secure</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">\Z</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">REQUIRES_SECURE_CHANNEL <br /></span>
				<span style="COLOR: #008080"> 7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                                \A</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">acegilogin.jsp.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">\Z</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">REQUIRES_SECURE_CHANNEL <br /></span>
				<span style="COLOR: #008080"> 8</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                                \A</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">j_acegi_security_check.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">\Z</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">REQUIRES_SECURE_CHANNEL <br /></span>
				<span style="COLOR: #008080"> 9</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                                \A.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">\Z</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">REQUIRES_INSECURE_CHANNEL <br /></span>
				<span style="COLOR: #008080">10</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #008080">11</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #008080">12</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">bean</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>我的理解： </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">         </span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> <br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                            CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON <br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                                \A</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">secure</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">\Z</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">REQUIRES_SECURE_CHANNEL <br /></span>
				<span style="COLOR: #008080">4</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                                \A</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">acegilogin.jsp.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">\Z</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">REQUIRES_SECURE_CHANNEL <br /></span>
				<span style="COLOR: #008080">5</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                                \A</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">j_acegi_security_check.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">\Z</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">REQUIRES_SECURE_CHANNEL <br /></span>
				<span style="COLOR: #008080">6</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                                \A.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">\Z</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">REQUIRES_INSECURE_CHANNEL <br /></span>
				<span style="COLOR: #008080">7</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         </span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000"> </span>
		</div>
		<p>应该是定义资源的访问权限，等号右侧的应该是能够访问该资源的角色吧。 </p>
		<p>问题是这个角色在哪里定义呢？<br /><br />答案来了 ：<br /><br />以最新的1.0.0讲解 <br /><br /><span style="COLOR: #ffa34f"><b>acegi</b></span>中人员信息用UserDetails接口表示，其中GrantedAuthority[] getAuthorities() 方法返回的数组代表该用户所拥有的授权。GrantedAuthority中的String getAuthority()方法一般可以理解为角色名称。 <br /><br />所以应用中用户角色是由userDetailsService返回的<font color="#0000ff"><strong>UserDetails</strong></font>获得的</p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/68089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-09-06 18:15 <a href="http://www.blogjava.net/liuwentao253/archive/2006/09/06/68089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实战Acegi：使用Acegi作为基于Spring框架的WEB应用的安全框架</title><link>http://www.blogjava.net/liuwentao253/archive/2006/09/06/67938.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Wed, 06 Sep 2006 00:52:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/09/06/67938.html</guid><description><![CDATA[对于任何一个完整的应用系统，完善的<font color="#0000ff"><strong>认证</strong></font>和<strong>授权</strong>机制是必不可少的。在基于SpringFramework的WEB应用中，我们可以使用Acegi作为安全架构的实现。<br /><br />1. 概述<br />Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目，全称为<font color="#0000ff"><strong>Acegi Security System for Spring</strong></font>，当前版本为1.0.2。它使用了Spring的方式提供了安全和认证安全服务，包括使用<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Bean Context<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />拦截器<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />面向接口的编程方式</span></div><br />通过精心配置Acegi安全系统能够轻松地适用于复杂的安全需求。它既能应用于WEB应用也能应用于非WEB应用。在 本文的示例程序里，我将演示如何将Acegi应用于WEB应用程序。通过这个例子详细介绍如何配置Acegi的各个组件，同时介绍如何扩展Acegi使其能够从数据库中读取配置信息。<br /><br />2. 例子说明<br />本文的例子是一个联系人管理程序，使用SpringFramework 1.2.4 和 Acegi0.8.3，数据库采用Mysql。<br /><br />2.1 : 程序的目录结构如下：<br /><br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0000.jpg" /><br /><br />2.2 : 程序的ER图(<font size="1"><u>概念模型: E = Entity R = Relationship</u></font><font size="3">) 如下：<br /><br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0001.jpg" /><br /><br />2.3 : 程序的静态类图如下：<br /><br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0002.jpg" /><br /><br /><br />3.配置文件说明<br /><br />接下来，我们将进入本文的重要内容，开始对Acegi应用程序所牵涉到的配置文件进行一一说明。<br /><br />3.1 web.xml<br /><br />首先声明SpringFramework的配置文件列表。为了便于管理，将业务方法相关的配置文件和Acegi安全配置相关的配置文件分开。<br /><br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0003.jpg" /><br /><br />其次声明Acegi过滤器。 <br />　<br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0004.jpg" /><br /><br />说明：Acegi对WEB应用的支持主要是依靠servlet 过滤器（filter） 来实现的。每一个http request都将被这些过滤器层层拦截 并进行安全处理（包括认证和授权）。针对不同的安全处理，<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">Acegi提供了不同的过滤器。过滤器的配置信息位于web.xml，<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />但是我们又希望把Acegi的过滤器配置信息放在SpringFramework的配置文件里（applicationContext</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">security</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">acegi.xml），<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />从而实现对这些过滤器的“控制反转”。</span></div><br />解决这个问题的方法是采用Acegi提供的<font color="#0000ff"><strong>FilterToBeanProxy</strong></font>。FilterToBeanProxy顾名思义就是对Acegi过滤器Bean的代理，它的主要功能就是将http请求依次分派给对应的过滤器Bean。<br /><br />3.2 applicationContext-security-acegi.xml<br /><br />applicationContext-security-acegi.xml主要包括 : <br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"><strong>认证</strong>相关配置信息<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><strong>WEB资源授权</strong>配置信息。</span></div><br />首先是声明过滤器序列。 <br /><br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0005.jpg" />　<br /><br />各个过滤器的作用如下：<br /><br />3.2.1 : httpSessionContextIntegrationFilter : <br /><br />           根据session中存放的信息组装ContextHolder。ContextHolder主要用于存放SecureContext，包括用户的<br />           权限信息<br /><br />3.2.2 : authenticationProcessingFilter<br /><br />           处理认证请求（通常是一个登录页面的表单请求）<br /><br />            authenticationProcessingFilter的配置比较复杂，我们通过下图来看一下：<br /><br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0007.jpg" /><br /><br />3.2.3 : anonymousProcessingFilter<br /><br />            匿名用户处理。如果用户尚未登录，将生成一个匿名用户的Authentication存放到ContextHolder中<br />            <br />            相关配置信息：<br /><br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0008.jpg" /><br /><br />3.2.4 : securityEnforcementFilter<br /><br />            强制安全验证过滤器。验证所请求的url是否在用户的权限范围内。<br /><br />            securityEnforcementFilter的配置比较复杂，我们通过下图来看一下：<br /><br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0009.jpg" /><br /><br /><br />3.3 applicationContext-basic.xml<br /><br />applicationContext-basic.xml主要包括<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">数据访问对象<br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />业务方法<br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />业务方法安全管理拦截器的配置信息</span></div><br />先看一下总揽图：<br /><br /><img src="http://www.tiandi.com/file/liuwentao/2006-9-6_0010.jpg" /><br />我将主要讲解业务方法安全管理拦截器（MethodSecurityInterceptor）的相关配置，其它的配置就不再赘述了，请参考相关文<br />档。<br />3.3.1 contactManager相关配置信息<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">contactManager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.springframework.aop.framework.ProxyFactoryBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">proxyInterfaces</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">sample.service.IContactManager</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">interceptorNames</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">id ref local</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">transactionInterceptor</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">id ref local</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">contactManagerSecurity</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">id ref local</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">contactManagerTarget</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div></font><img src ="http://www.blogjava.net/liuwentao253/aggbug/67938.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-09-06 08:52 <a href="http://www.blogjava.net/liuwentao253/archive/2006/09/06/67938.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>acegi sercurity 简介</title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/31/66901.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Thu, 31 Aug 2006 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/31/66901.html</guid><description><![CDATA[
		<p>
		</p>
		<span id="Codehighlighter1_95_129_Open_Text">
				<p>
				</p>
		</span>每一个<strong><font color="#0000ff">认证对象</font></strong>都有属于它自己的<font color="#0000ff"><strong>拦截器</strong></font>来负责处理它每一次请求。包括如下的一系列操作。<br /><p><img src="http://www.dlog.cn/uploads/diary/200611/16110756940.jpg" /><br /><br />拦截器有如下几种。<br /><br />1  ： 针对类的方法的拦截器<strong>  ：MethodSecurityInterceptor</strong><br /><br />在appfuse中用到了这种方式。如下：</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">txProxyTemplate</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">true</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.springframework.transaction.interceptor.TransactionProxyFactoryBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">transactionManager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ref</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">transactionManager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">transactionAttributes</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">props</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">save*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">PROPAGATION_REQUIRED</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">remove*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">PROPAGATION_REQUIRED</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">PROPAGATION_REQUIRED,readOnly</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">props</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000"> Generic manager that can be used to </span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000"> basic CRUD operations on any objects </span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">manager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> parent</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">txProxyTemplate</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">target</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.appfuse.service.impl.BaseManager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">dao</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ref</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">dao</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000"> Transaction declarations </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> business services.  To apply a generic transaction proxy to<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         all managers, you might look into using the BeanNameAutoProxyCreator </span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userManager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> parent</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">txProxyTemplate</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">target</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.appfuse.service.impl.UserManagerImpl</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userDao</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ref</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userDao</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000"> Override </span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000"> transaction attributes b</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">c of UserExistsException </span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">transactionAttributes</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">props</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">save*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">PROPAGATION_REQUIRED,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">UserExistsException</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">remove*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">PROPAGATION_REQUIRED</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">PROPAGATION_REQUIRED,readOnly</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">props</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000"> This property is overriden in applicationContext</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">security.xml to add<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />             method</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">level role security </span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br /><font color="#0000ff"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />   </font><font color="#0000ff"> </font></span><font color="#0000ff"><span style="COLOR: #000000">&lt;</span></font><font color="#0000ff"><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><strong>preInterceptors</strong></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000"><br /><font color="#0000ff"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </font></span><font color="#0000ff"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000"><br /><font color="#0000ff"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </font></span><font color="#0000ff"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ref bean</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><u>userSecurityInterceptor</u></span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span></font><span style="COLOR: #000000"><br /><font color="#0000ff"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </font></span><font color="#0000ff"><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000"><br /><font color="#0000ff"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </font></span><font color="#0000ff"><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span></font><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div><p>在 bean "userManager" 中的preInterceptors中有一个&lt;ref bean="<span style="COLOR: #000000">userSecurityInterceptor</span>"/&gt;。<br />bean "<span style="COLOR: #000000">userSecurityInterceptor</span>"的定义如下  ：</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><font style="BACKGROUND-COLOR: #ffffff">    &lt;bean id="<u>userSecurityInterceptor</u>" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"&gt;<br />        &lt;property name="advice" ref="userSecurityAdvice"/&gt;<br />        &lt;property name="patterns" value=".*saveUser"/&gt;<br />    &lt;/bean&gt;</font><span style="COLOR: #000000"></span></div><p>可以看到，当我们调用userManager的时候，通过spring的aop机制在它执行的前边要先执行<span style="COLOR: #000000">userSecurityInterceptor</span>.</p><img src ="http://www.blogjava.net/liuwentao253/aggbug/66901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-31 16:59 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/31/66901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi  FAQ</title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/31/66827.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Thu, 31 Aug 2006 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/31/66827.html</guid><description><![CDATA[
		<p>一 ： FAQ</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Q:   能否脱离Spring框架来使用Acegi</span>
				<span style="COLOR: #000000">?</span>
		</div>
		<p>A:  虽然Acegi 没有要求必须使用Spring Framework，但事实上Acegi很大程度上利用了Spring的IOC和AOP,很难脱离Spring的单独使用。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Q:  Acegi有对xfire的支持吗</span>
				<span style="COLOR: #000000">?</span>
		</div>
		<p>A: 有,详见<a href="http://jira.codehaus.org/browse/XFIRE-389">http://jira.codehaus.org/browse/XFIRE-389</a></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Q: 为何无论怎么设置都返回到登陆页面无法成功登陆</span>
				<span style="COLOR: #000000">?</span>
		</div>
		<p>A:  检查登陆页面或登陆失败页面是否只有<font color="#0000ff"><strong>ROLE_ANONYMOUS</strong></font>权限<br /><br /><br />二 ： Acegi 补习班<br /><br />要了解Acegi,首先要了解以下几个重要概念： </p>
		<p>1 ：<strong>Authentication  (认证）对象 ：<br /></strong><br /><img src="http://liuwentao253.tiandi.com/file/1455/album/1455/1163590287795.jpg" /><br /><br />      <br />Authentication对象包含了 ：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">principal<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />credentials<br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />authorities(authorities要赋予给principal的),</span>
		</div>
		<p>同时也可以包含一些附加的认证请求信息,如</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">TCP</span>
				<span style="COLOR: #000000">/</span>
				<span style="COLOR: #000000">IP地址<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Session id等。</span>
		</div>
		<p>
				<br />2 ：<strong>SecurityContextHolder<br /></strong> <br />        SecurityContextHolder包含<u>ThreadLocal私有属性</u>用于存取SecurityContext, <br />        <u>SecurityContext包含Authentication私有属性</u>, 看以下一段程序 </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img id="Codehighlighter1_51_1119_Open_Image" onclick="this.style.display='none'; Codehighlighter1_51_1119_Open_Text.style.display='none'; Codehighlighter1_51_1119_Closed_Image.style.display='inline'; Codehighlighter1_51_1119_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
				<img id="Codehighlighter1_51_1119_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_51_1119_Closed_Text.style.display='none'; Codehighlighter1_51_1119_Open_Image.style.display='inline'; Codehighlighter1_51_1119_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				<span style="COLOR: #000000">  </span>
				<span style="COLOR: #0000ff">public</span> <span style="COLOR: #000000">  </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">  getSecurityContextInformations()   </span><span id="Codehighlighter1_51_1119_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_51_1119_Open_Text"><span style="COLOR: #000000">{  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">SecurityContextHolder包含ThreadLocal私有属性用于存取SecurityContext</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    SecurityContext sc  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  SecurityContextHolder.getContext(); <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> SecurityContext包含Authentication私有属性</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    Authentication auth  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  sc.getAuthentication();  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Authentication对象包含了principal</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    Object principal  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  auth.getPrincipal();  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_422_882_Open_Image" onclick="this.style.display='none'; Codehighlighter1_422_882_Open_Text.style.display='none'; Codehighlighter1_422_882_Closed_Image.style.display='inline'; Codehighlighter1_422_882_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_422_882_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_422_882_Closed_Text.style.display='none'; Codehighlighter1_422_882_Open_Image.style.display='inline'; Codehighlighter1_422_882_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">  (principal  </span><span style="COLOR: #0000ff">instanceof</span><span style="COLOR: #000000">  UserDetails)   </span><span id="Codehighlighter1_422_882_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_422_882_Open_Text"><span style="COLOR: #000000">{   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 用户密码    </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">         String password  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  ((UserDetails) principal).getPassword();  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 用户名称    </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">         String username  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  ((UserDetails) principal).getUsername();  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 用户权限    </span> authorities(authorities要赋予给principal的),<font style="BACKGROUND-COLOR: #eeeeee"></font><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">         GrantedAuthority[] authorities  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  ((UserDetails) principal).getAuthorities();   <br /><img id="Codehighlighter1_792_873_Open_Image" onclick="this.style.display='none'; Codehighlighter1_792_873_Open_Text.style.display='none'; Codehighlighter1_792_873_Closed_Image.style.display='inline'; Codehighlighter1_792_873_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_792_873_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_792_873_Closed_Text.style.display='none'; Codehighlighter1_792_873_Open_Image.style.display='inline'; Codehighlighter1_792_873_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />         </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">  ( </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">  i  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">   </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000"> ; i  </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">  authorities.length; i </span><span style="COLOR: #000000">++</span><span style="COLOR: #000000"> )   </span><span id="Codehighlighter1_792_873_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_792_873_Open_Text"><span style="COLOR: #000000">{    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            String authority  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  authorities[i].getAuthority();   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000">   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000">   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    Object details  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  auth.getDetails();  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_992_1115_Open_Image" onclick="this.style.display='none'; Codehighlighter1_992_1115_Open_Text.style.display='none'; Codehighlighter1_992_1115_Closed_Image.style.display='inline'; Codehighlighter1_992_1115_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_992_1115_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_992_1115_Closed_Text.style.display='none'; Codehighlighter1_992_1115_Open_Image.style.display='inline'; Codehighlighter1_992_1115_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">  (details  </span><span style="COLOR: #0000ff">instanceof</span><span style="COLOR: #000000">  WebAuthenticationDetails)   </span><span id="Codehighlighter1_992_1115_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_992_1115_Open_Text"><span style="COLOR: #000000">{   <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 用户session id    </span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">         String SessionId  </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">  ((WebAuthenticationDetails) details).getSessionId();  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"> </span></div>
		<br />AuthenticationManager<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">通过Providers 验证 在当前 ContextHolder中的<strong>Authentication对象</strong>是否合法。</span></div> <br />AccessDecissionManager<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">经过投票机制来审批是否批准操作 </span></div><br />RunAsManager<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">当执行某个操作时,RunAsManager可选择性地替换<strong>Authentication对象</strong> </span></div><br />Interceptors<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">拦截器(如FilterSecurityInterceptor,JoinPoint,MethodSecurityInterceptor等)用于协调授权,认证等操作</span></div><img src ="http://www.blogjava.net/liuwentao253/aggbug/66827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-31 12:00 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/31/66827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+Hibernate+Acegi 的初次体验</title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/30/66707.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Wed, 30 Aug 2006 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/30/66707.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一 ：高层设计 核心组件		大多数的企业级应用有四种基本的安全需求。										1				：需要对主体进行鉴别				2				：需要对web请求进行保护				3				：需要对服务层方法进行保护				4				：很多情况下需要对域对象实例进行保护				Acegi系统提供了一个通用的框架，它可以满足所有这四种企业安全级的需求。到现在...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuwentao253/archive/2006/08/30/66707.html'>阅读全文</a><img src ="http://www.blogjava.net/liuwentao253/aggbug/66707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-30 18:09 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/30/66707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ehcache 在appfuse中的使用</title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/20/64589.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sun, 20 Aug 2006 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/20/64589.html</guid><description><![CDATA[appfuse中使用了缓冲：<br /><br /><font size="1">applicationContext-service.xml:</font><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userCache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.springframework.cache.ehcache.EhCacheFactoryBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cacheManager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.springframework.cache.ehcache.EhCacheManagerFactoryBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cacheName</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userCache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div><br />这里没有给org.springframework.cache.ehcache.<font color="#0000ff"><strong>EhCacheManagerFactoryBean</strong></font>. 定义属性configLocation. 则EhCache使用默认的配置文件.WEB- INF/classes/ehcache.xml.(当然你也可以通过以下方式指定配置文件)<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">cacheManager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> <br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.springframework.cache.ehcache.EhCacheManagerFactoryBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">configLocation</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">classpath:</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">ehcache</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">failsafe.xml</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div><br />WEB- INF/classes/ehcache.xml文件中的定义如下:<br /><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080"> 1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ehcache</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">diskStore path</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">java.io.tmpdir</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">defaultCache<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        maxElementsInMemory</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">10000</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        eternal</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">false</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        overflowToDisk</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">true</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 7</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        timeToIdleSeconds</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">120</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        timeToLiveSeconds</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">120</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        diskPersistent</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">false</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        diskExpiryThreadIntervalSeconds</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">120</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">ehcache</span><span style="COLOR: #000000">&gt;</span></div><br /><br /><br />可以看到<br />1: acegi security提供的<font color="#0000ff"><strong>daoAuthenticationProvider </strong></font>把userDetails对象保存在Cache里.这个Cache在bean "userCache"里进行了定义(cache名为 userCache). <br /><br /><font size="1">security.xml : <br /></font><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">daoAuthenticationProvider</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.acegisecurity.providers.dao.DaoAuthenticationProvider</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userDetailsService</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ref</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userDao</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userCache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ref</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userCache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">passwordEncoder</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ref</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">passwordEncoder</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div><br />2同时userSecurityAdvice这个AOP设备也对cache进行了操作.这个类实现了 MethodBeforeAdvice接口的before方法.此方法的作用是不允许非 administrators用户修改自己的角色.它也实现了AfterReturningAdvice接口的 afterReturning方法,此方法的作用是根据当前用户信息更新缓冲中的用户数据 (userDetail). <br /><br /><font size="1">applicationContext-service.xml:</font><br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userSecurityAdvice</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.appfuse.service.UserSecurityAdvice</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">2</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userCache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> ref</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">userCache</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #008080">3</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div><br /><br /><img src ="http://www.blogjava.net/liuwentao253/aggbug/64589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-20 11:14 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/20/64589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi安全系统扩展 （二）</title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/06/50870.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 06 Jun 2006 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/06/50870.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 三 Acegi安全系统扩展 		      相信side对Acegi的扩展会给你耳目一新的感觉,提供完整的扩展功能,管理界面,中文注释和靠近企业的安全策略。side只对Acegi不符合企业应用需要的功能进行扩展,尽量不改动其余部分来实现全套权限管理功能,以求能更好地适应Acegi升级。						3.1 基于角色的权限控制(RBAC)		    Acegi 自带的 sample...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuwentao253/archive/2006/06/06/50870.html'>阅读全文</a><img src ="http://www.blogjava.net/liuwentao253/aggbug/50870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-06 19:02 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/06/50870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi安全系统介绍 （一）</title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/06/50770.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 06 Jun 2006 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/06/50770.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Author: cac 差沙&nbsp;&nbsp;&nbsp; Acegi是Spring Framework 下最成熟的安全系统，它提供了强大灵活的企业级安全服务，如:&nbsp;&nbsp;&nbsp; 1 : 完善的认证和授权机制，&nbsp;&nbsp;&nbsp;&nbsp;2 : Http资源访问控制，&nbsp;&nbsp;&nbsp; 3 : Metho...&nbsp;&nbsp;<a href='http://www.blogjava.net/liuwentao253/archive/2006/06/06/50770.html'>阅读全文</a><img src ="http://www.blogjava.net/liuwentao253/aggbug/50770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-06 15:03 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/06/50770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi Security 1.0.0 Released </title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/02/49971.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Fri, 02 Jun 2006 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/02/49971.html</guid><description><![CDATA[
		<span class="postbody">
				<font color="#800080" size="1">首先在appfuse1.9.3中使用的 acegi 版本是 Acegi Security 1.0.1</font>
				<br />
				<br />
				<br />终于 release 了 <br /><br /><a href="http://www.springframework.org/node/285" target="_blank">http://www.springframework.org/node/285</a><br /><br /><span class="postbody">主要变化: <br /><br /><font color="#a52a2a">专门增加了一个 AccessDeniedHandler 用以实现无权限时的自定义操作</font><br /><br /><font color="#ff0000">新的 logoff filter 用以清除 RememberMeService 写的 cookie</font><br /><br />增加了一个 tutorial web app 使之更容易上手<br /><br />－－－－－－－－－－－－－－－－－－－－－－－－－<br /></span><span class="postbody"></span><span class="gensmall"><span class="postbody">Q ：真不容易 <br /><br />           俺还在用0.8呢，看来要升级罗...<br /></span><span class="postbody"></span><span class="gensmall"><br /><span class="postbody">A ： 从 0.8 升过来的话, 估计你会比较痛苦了 <img alt="Laughing" src="http://forum.javaeye.com/images/smiles/icon_lol.gif" border="0" /> ，<span class="postbody">你可以看看官方网站上的升级指南，还是很多地方要改的。</span></span></span></span></span>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/49971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-02 16:26 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/02/49971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>