当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

Acegi(八):securityContextHolderAwareRequestFilter[Java编程]

赞助商链接



  本文“Acegi(八):securityContextHolderAwareRequestFilter[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

上篇 中我们说了下 LogoutFilter的配置, 这篇里接着看另一个常见的配置SecurityContextHolderAwareRequestFilter. 下面先看怎么把它配置到Acegi里.

应当说对 securityContextHolderAwareRequestFilter 的配置要比LogoutFilter的更简单些. 有以下两步:

Step1: 定义一个名为securityContextHolderAwareRequestFilter的bean, 以下所示:

Xml代码

<bean id="securityContextHolderAwareRequestFilter"
class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter" />

呵呵, 简单地我就有些不好意思往这写了. 就这么一个干巴巴的类, 别什么属性要配置的.

Step2: 把定义好的 securityContextHolderAwareRequestFilter放到 filterInvocationDefinitionSource里, 以下所示:

/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter ,exceptionTranslationFilter,filterInvocationInterceptor

上面是对它的配置, 这个配置有些干巴巴的, 那它毕竟有什么用呢? 我们接着往下看, 那将是一个丰富多彩的世界.

SecurityContextHolderAwareRequestFilter类名怎么这么长? 也看不出什么有效的信息啊. 不过, 看文档得知 SecurityContextHolderAwareRequestFilter的作用是:将传来的 request用一个 HttpServletRequestWrapper封装下再传给 filterChain. 我们不由要问? 为什么要这么做呢? 也就是说这么做有什么好处呢?

要弄通这个问题, 我们得看这个Filter对传的 request做了些什么手脚, 也就是说是以什么样的一个 HttpServletRequestWrapper来封装了传来的 request. 在Acegi中我们发现就有两个 HttpServletRequestWrapper的子类: SecurityContextHolderAwareRequestWrapper和 SavedRequestAwareWrapper. 它们又有什么样的特质呢? 发现 SavedRequestAwareWrapper是 SecurityContextHolderAwareRequestWrapper的子类, 为了研究的便利, 我们先看父类 SecurityContextHolderAwareRequestWrapper , 所谓有其父必有其子嘛.

先解剖下这个类, 这个类只有一个属性authenticationTrustResolver(其实它没什么多大的用处, 待会再细说), 覆盖了 HttpServletRequestWrapper的三个办法: getRemoteUser, getUserPrincipal, isUserInRole.

(这里先趁便说下, 我从前一向没注意到上面的这三个办法是接口里定义的, 看来Servlet标准里早就考虑到Security方面的问题了; 另一个没注意到的是, 本来 Principal是Java尺度类security包下的定义的接口, 而Acegi里重要的接口 Authentication是担当自 Principal )

于是问题就转为为什么要单独再覆盖这三个办法了.那得看这三个办法又都干了什么. 看办法的实现, 发现它们实际上是做了一样的事, 即通过 SecurityContextHolder.getContext().getAuthentication()拿到 Authentication后再get出String范例的 RemoteUser,或 Principal范例信息, 或看这个 Authentication能否有指定的权限. 也就是说它们把Acegi里自身的考证信息放到Servlet标准里表现的对Security的支持!

那为什么非要用Acegi的认证信息来替换或填充Servlet标准中 Security信息呢? 我想有这么几点好处:

1, 替换掉Web容器自身的认证信息. 拿Tomca为例, 我们知道在Tomcat中可以配置管理权限的, 若Tomcat自身配置了权限管理, 而Acegi不做什么处理的话, 程序员从 HttpServletRequest里通过调用上面三种办法得到的Security方面的信息就不是通过Acegi配置的了, 那样岂不就乱套了? Acegi自身的Security作用也就给架空了, 这还得了? 于是Acegi就有果断地通过 SecurityContextHolderAwareRequestWrapper把漏洞给补上了.

2, 还有一个大概的好处, 那就是通过这种覆盖处理, 程序员可以在Action或JSP中便利地得到当前登录用户的信息, 而没必要在系统中揉合进Acegi自己的API. 项目中这样的反例太多了.

通过上面的解析,再看类的名字 SecurityContextHolderAwareRequestFilter, 这样也就好理解了, 真是顾名思义! 这个名字表达的意思是说, 这个Filter是让Request 来aware下SecurityContextHolder里的信息, 这个让它Aware恰是通过覆盖三个办法实现的.

好了, 这篇就写到这里, 下一篇中我们将看 SecurityContextHolderAwareRequestFilter子类 SavedRequestAwareWrapper又加了些什么功效. Until the next.


  以上是“Acegi(八):securityContextHolderAwareRequestFilter[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • Acegi(一):酝酿将近一年后的提高
  • Acegi(二): 苍茫后,写还是不写?
  • Acegi(三):Acegi?Who are you?
  • Acegi(四):Acegi初体验及初解剖
  • <b>Acegi源码研究(五):七剑下天山</b>
  • Acegi源码研究(六):Acegi编码/筹划碎得
  • Acegi(七):LogoutFilter配置及几个问题
  • Acegi(八):securityContextHolderAwareRequestFilter
  • Acegi(九) 子类SavedRequestAwareWrapper
  • <b>Acegi(十):securityContextHolderAwareRequestFilter结</b>
  • Acegi(十一):鉴戒Acegi的Exception的非常处理
  • Acegi(十二):anonymousProcessingFilter有什么好玩的?
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .