Acegi(八):securityContextHolderAwareRequestFilter
上篇 中我们说了下 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.