`

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的书写.

 

 

分享到:
评论

相关推荐

    使用 Acegi 保护 Java 应用程序: 续二

    6. **源码分析**:由于标签中有“源码”一词,博文可能深入讲解了 Acegi 源码的某个部分,帮助读者理解其内部工作原理,或者展示了如何根据需求自定义 Acegi 组件。 7. **工具使用**:标签中的“工具”可能指的是 ...

    Acegi 概述

    Acegi与Spring框架紧密集成,使得在Spring应用中实现安全性变得简单。 **身份验证**:Acegi支持多种身份验证机制,如基于表单的认证、HTTP基本认证和摘要认证。开发者可以根据项目需求选择合适的认证方式,并可以...

    实战Acegi

    Acegi是Spring Security的前身,它是一个强大的、可扩展的安全框架,专为基于Spring的应用程序设计。本实战Acegi的主题将深入探讨如何利用Acegi来实现Web应用的安全性,包括身份验证、授权、会话管理等多个关键领域...

    ssh天乙论坛6.0源码

    8. **扩展性与维护性**:良好的设计模式和规范编码使得源码具有较高的可读性和可维护性,方便后续功能的添加和修改。 通过研究天乙论坛6.0的源码,开发者不仅可以学习SSH框架的实际应用,还能了解到如何设计和实现...

    aceig构建基于内存的用户信息认证之Http Basic认证(1)

    Acegi Security是Spring框架早期的一个安全模块,它为Java Web应用程序提供了强大的安全性和认证机制。本篇将探讨如何利用Acegi Security实现基于内存的用户信息认证,并结合Http Basic认证进行详细阐述。 【描述】...

    aceig构建基于数据库的用户信息认证Http Basic认证(2)

    在IT行业中,安全是至关重要的一个领域,特别是对于基于数据库的用户信息认证系统。Acegi Security是Spring...在实际开发过程中,阅读Acegi Security的源码可以帮助我们更好地理解其工作原理,从而更好地利用这个工具。

    Spring 3.x企业应用开发实战光盘源码part02

    在本资源中,"Spring 3.x企业应用开发实战光盘源码part02" 提供了Spring框架3.x版本的企业级应用开发实例代码。...通过深入研究这些源码,开发者能够提升对Spring框架的理解,以及如何将其应用于实际的企业级开发场景。

    spring 英文api

    - **依赖注入(Dependency Injection, DI)**:Spring通过DI来管理对象之间的关系,避免了硬编码依赖,使得代码更加灵活和可测试。 - **面向切面编程(Aspect-Oriented Programming, AOP)**:Spring的AOP模块支持...

    Maven 搭建的简单项目

    对于源码解释,这意味着我们将深入理解Acegi或Spring Security的内部工作原理,学习如何配置和定制安全规则以满足特定的应用需求。 【标签】"struts2+spring"表明这个项目是基于Struts2和Spring框架的。Struts2是一...

    spring-framework-3.2.4.RELEASE

    DI允许开发者在运行时动态地将对象关联到其他对象,而非在编译时硬编码这些关联。AOP则允许程序员编写关注点分离的代码,比如日志、事务管理等,从而提高代码的可维护性和可重用性。 ### 3.2.4.RELEASE版本特性 - *...

    韩顺平 2011版 spring视频教程课堂源代码.zip

    依赖注入是Spring的核心特性之一,它允许组件之间的依赖关系通过外部容器进行管理,而不是在组件内部硬编码。这提高了代码的可测试性和可维护性。 3. **AOP概念** 面向切面编程是一种编程范式,Spring通过AOP支持...

    spring 安全文档 PDF

    Spring Security最初由Luke Taylor和Ben Alex开发,并于2004年作为Acegi Security的后续项目发布。随着Spring框架的发展,Spring Security也不断迭代升级,成为了一个成熟且广泛使用的安全框架。 ##### 1.3 发布...

    AppFuse1.x快速构建J2ee应用

    要使用 AppFuse 构建应用,首先你需要下载 AppFuse 的源码,并安装 Maven(一个项目管理和综合工具)。然后,通过运行 Maven 命令,你可以创建一个新的 AppFuse 项目。这个命令会生成一个包含所有必要文件和目录结构...

    java开源包8

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    SSH框架整合增、删、改、查、登录.zip

    IoC使得开发者可以将对象的创建和管理交给Spring,而不是在代码中硬编码。AOP则用于实现如日志记录、事务管理等横切关注点。 Struts2作为MVC(Model-View-Controller,模型-视图-控制器)框架,负责处理HTTP请求,...

    java开源包101

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包1

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包11

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

    java开源包2

    GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java.applet....

Global site tag (gtag.js) - Google Analytics