Acegi源码研究(六):Acegi编码/设计碎得
前些天通过一个Acegi的Web实例,我们感觉了下受掩护的长处,也通过一步步的跟踪,感受到Acegi里"七剑"的存在.原来是想着继承再往下做扩展的,厥后一想照旧回过甚来整理下研究Acegi进程中的碎得吧,究竟这样的碎得写起轻松些,我也稍稍放松下.
信马由缰地溜达了下,又想起了其时一开始看Acegi源码时的如下问题:
1, FilterToBeanProxy –> FilterChainProxy, 一个VirtualFilterChain来仿照Web 容器中的FilterChain, 内容类 (本身写代码时也有意识地用protected, private了).
要领的实现与挪用 –> 代码块的重用.
FilterChainProxy类里filterInvocationDefinitionSource属性从String到相应类的自动转换.
2, Filter挪用与要领栈的吻合,画一个序列图来暗示.
3, SecurityContextHolder的多种实现, 为什么要有多种实现,每一种实现又有什么特点?
HttpSession中放没放SecurityContext? 在SecurityContextHolder里也有放. 这种有问题了: 如何让它们俩同步? 删了一个后又奈何?
4, 另处一些常用的设置:
logoutFilter, securityContextHolderAwareRequestFilter, anonymousProcessingFilter
出于什么思量提出这样的观念?
5, 这一段的浸染:
if (request.getAttribute(FILTER_APPLIED) != null) {
// ensure that filter is only applied once per request
chain.doFilter(request, response);
return;
}
要防备在 filterInvocationDefinitionSource中设置了多个httpSessionContextIntegrationFilter, httpSessionContextIntegrationFilter老是在第一个的. 多设置了也没用, 若不加有什么害处不?
6, 为什么如下这种方法来取HttpSession?
try {
httpSession = request.getSession(forceEagerSessionCreation);
}
catch (IllegalStateException ignored) {
}
若getSesssion时传一个False会是什么样的?一个HttpSession一般什么机缘建设? 此刻越来越不思量这些问题了.
7, 为什么要把response再包装下? OnRedirectUpdateSessionResponseWrapper
8, 为什么每次都要有 SecurityContextHolder.clearContext();这不挺挥霍的吗? 防备Authentication里的用户名/暗码/权限在用户操纵时有改? 作为一个通用的安详框架应该支持这个成果的, 把权限节制存放到数据库中太常见了.
9, 如下代码段的的留意点:
if (cloneFromHttpSession) {
Assert.isInstanceOf(Cloneable.class, contextFromSessionObject,
"Context must implement Clonable and provide a Object.clone() method");
try {
Method m = contextFromSessionObject.getClass().getMethod("clone", new Class[]{});
if (!m.isAccessible()) {
m.setAccessible(true);
}
contextFromSessionObject = m.invoke(contextFromSessionObject, new Object[]{});
}
catch (Exception ex) {
ReflectionUtils.handleReflectionException(ex);
}
}
9.1 为什么要 cloneFromHttpSession? 遐想到Hibernate的PersistentContext, 它会自动来做dirty check的, 若不clone一个,直接把一个本来的return给client的话,会影响dirty check的速度.
9.2 本身写例子试试clone接口的实现与深度拷贝.
10, 从要领 readSecurityContextFromSession看框架级代码的书写:
10.1 思量到多种大概层层设防. 从而确保return一个 non-null,且为实现 SecurityContext接口的HttpSession里以" ACEGI_SECURITY_CONTEXT_KEY "存放的工具, 不要被"狸猫换太子"了.
10.2, log的书写.