首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

acegi参考手册(v1.0.4)[译]-第三章 赞助系统

2012-11-17 
acegi参考手册(v1.0.4)[译]-第三章 协助系统第三章. 协助系统本章介绍一些Acegi Security使用的附加和协助

acegi参考手册(v1.0.4)[译]-第三章 协助系统
第三章. 协助系统

本章介绍一些Acegi Security使用的附加和协助系统。那些和安全无关,但是包含在Acegi Security项目中的部分,将会在本章中讨论

3.1. 本地化

Acegi Security支持对终端客户可能会看到的异常信息进行本地化。如果你的应用是为英文用户设计的,那么你什么都不用做,因为Acegi Security的所有消息默认都是英文的。如果你要支持其他区域用户,那么本节包含了你所需要了解的所有东西。

包括认证失败或者访问被拒绝(授权失败)的所有异常消息都可以被本地化。提供给开发者或者系统部署人员的异常或者日志信息(包括错误的属性、接口不符、构造器错误、debug级日志)没有被本地化,它们硬编码在Acegi Security的代码中。

在acegi-security-xx.jar(译注:xx代表版本号)的org.acegisecurity包中包含了一个 messages.properties文件。这个文件会被你的application context引用,因为Acegi Security实现了Spring的MessageSourceAware接口,它期待在application context启动的时候注入一个message resolver。通常你所需要做的是在你的application context中注册一个引用这个消息的bean,如下所示:

我们强烈推荐你使用FilterChainProxy而不是FilterToBeanProxy。虽然FilterToBeanProxy是一个非 常有用的类FilterToBeanProxy,问题是当web.xml中filter变多时,<filter> 和 <filter-mapping>项就会太多而变得臃肿不堪。为了解决这个问题,Acegi Security提供一个FilterChainProxy类。它在FilterToBeanProxy中被装配(正如上面例子中所示),但目标类 (target class)是org.acegisecurity.util.FilterChainProxy。这样过滤器链(filter chain)可以在application context中按照如下代码配置:</filter-mapping></filter>

xml 代码?
  1. <bean?id="filterChainProxy"?class="org.acegisecurity.util.FilterChainProxy">??
  2. ????<property?name="filterInvocationDefinitionSource">??
  3. ????????<value>??
  4. ????????????CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON??
  5. ????????????PATTERN_TYPE_APACHE_ANT??
  6. ????????????/webServices/*=httpSessionContextIntegrationFilterWithASCFalse,basicProcessingFilter,exceptionTranslationFilter,??
  7. ????????????/*=httpSessionContextIntegrationFilterWithASCTrue,authenticationProcessingFilter,exceptionTranslationFilter,filterSecurityInterceptor??
  8. ????????<!---->value>??
  9. ????<!---->property>??
  10. <!---->bean>??
???

你可能注意到FilterSecurityInterceptor定义方式的相似之处。同时支持正则表达式和Ant Paths格式,越对应的URI越早出现。在运行时,FilterChainProxy会定位符合当前的web请求的第一个URI模式。每个对应的配置属 性代表了在application context中定义的一个bean的名字。接着fiter会按照它们被指定的顺序,按照FilterChain的标准行为模式被调用(如果一个 Filter决定停止处理,它可以不在chain中执行)。

如你所见,FilterChainProxy需要为不同的请求模式重复配置filter的名字(在上面的例子中,, exceptionTranslationFilter 和 filterSecurityInterceptor 是重复的)。这样的设计是为了让FilterChainProxy能够为不同的URI配置不同的filter调用顺序,同时也提高了表达力(针对正则表达 式、Ant Paths、以及任何FilterInvocationDefinitionSource的特定实现)和清晰度,可以知道是哪个filter应该被调用。

你可能注意到了我们在filter chain定义了两个HttpSessionContextIntegrationFilter (ASC是allowSessionCreation的缩写,是HttpSessionContextIntegrationFilter的一个属性)。 因为web服务不会为将来的请求提供一个jsessionid,为这样的用户创建HttpSessions是浪费的。如果你有一个需要最大限度的伸缩性的 高容量的应用,我们建议你使用上述的方法。对于小的应用,使用单一的HttpSessionContextIntegrationFilter (默认的allowSessionCreation设为true)应该足够了。

说到生命周期问题,如果对FilterChainProxy自身调用init(FilterConfig) 和 destroy()方法,它会把它代理到底层的filter。这样FilterChainProxy保证只初始化和析构每个filter一次,不论它在 FilterInvocationDefinitionSource中定义了多少次。你可以通过FilterToBeanProxy的lifecycle 初始化参数来控制这些方法是否被调用。如上面所讨论的那样,默认所有servlet容器生命周期调用是不被代理到FilterChainProxy的。

在web.xml中定义的filter的顺序是非常重要的。不管你实际用到哪个filter,<filter-mapping>的顺序应该是如下所示的:</filter-mapping>

1.ChannelProcessingFilter,因为可能要重定向到另一种协议。

2.ConcurrentSessionFilter 因为不使用任何SecurityContextHolder的功能,但是需要更新SessionRegistry来表示当前的发送请求的principal。

3. HttpSessionContextIntegrationFilter, 这样当一个web请求开始的时候就可以在SecurityContextHolder中设置一个SecurityContext,当web请求结束的时候 任何对SecurityContext的改动都会被copy到HttpSession(以备下一个web请求使用)。

4.Authentication processing mechanisms - AuthenticationProcessingFilter, CasProcessingFilter, BasicProcessingFilter, HttpRequestIntegrationFilter, JbossIntegrationFilter 等 - 修改SecurityContextHolder,使其中包含一个有效的认证请求令牌(token)。

5.SecurityContextHolderAwareRequestFilter, 如果你使用它来在你的servlet容器中安装一个Acegi Security aware HttpServletRequestWrapper。

6.RememberMeProcessingFilter, 如果早期的认证处理过程没有更新SecurityContextHolder,并且请求(request)提供了一个cookie启用remember- me服务,一个合适的被记住的Authentication对象会被放到SecurityContextHolder那里。

7.AnonymousProcessingFilter, 如果早期的认证处理过程没有更新SecurityContextHolder,, 一个匿名Authentication 对象会被放到SecurityContextHolder那里。

8.ExceptionTranslationFilter, 捕获所有的Acegi Security 异常,这样要么返回一个HTTP错误响应或者加载一个对应的AuthenticationEntryPoint。

9.FilterSecurityInterceptor, 保护 web URIs

所有上述的filter使用FilterToBeanProxy或FilterChainProxy。建议在一个应用中使用一个单个的 FilterToBeanProxy代理到一个单个的FilterChainProxy。,在FilterChainProxy中定义所有的Acegi Security Filters。如果你使用SiteMesh,确保Acegi Security filters 在 SiteMesh filters调用前调用。这样使SecurityContextHolder在SiteMesh decorator使用前能够及时被装配。

1 楼 lighter 2006-12-31   文章是leondu自己翻译的啊
怎么有"新手帖 (19)"啊,奇怪,挺好的一个帖子 2 楼 leondu 2007-01-01   是我自己翻译的,新不新手无所谓啦,可能大家觉得比较基础吧。 3 楼 zelsa 2007-01-01   投新手贴的都不厚道。
4 楼 jamesby 2007-01-03   楼主辛苦拉,支持下! 5 楼 boogie 2007-01-04   投新手贴的人总认为自己是高手!该学学extremecomponents的作者,人家有问必答,为人谦虚厚道! 6 楼 pioneer21th 2007-01-04   为什么右边显示不完全? 7 楼 ahuaxuan 2007-01-04   好多人喜欢捣乱来着,乱评贴,我就不信有这么多人对acegi熟,这么多人投新手贴,评贴是一种责任,不要扰乱javaeye的秩序。lz再接再厉 8 楼 jonescheng 2007-04-04   这样好的贴子,还有人在这里乱扯淡,有本事你自己来翻译一些好文章阿,别人翻译这些,付出了多少心血和精力。。

辛苦了 9 楼 抛出异常的爱 2007-04-04   这个帖子在哪里呢?怎么找不到呢?
PS:楼上几位中有人光说话不投票 10 楼 simohayha 2007-04-04   俺已经动手了,刚好变为良好.楼主再接再厉. 11 楼 tyzyong 2007-06-06   [url]http://www.google.com

热点排行