`

定制的Spring Security(Acegi)的并发会话过滤器(ConcurrentSessionFilter)的编码过程

 
阅读更多
上一帖述及使用ConcurrentSessionFilter限制同帐号登录多次的方法,同帐号多次登录限制是运行系统必需的功能,所以作者对其深入测试,在上一帖中也列举了Spring Security的ConcurrentSessionFilter和ConcurrentSessionControllerImpl类的几个限制。做一下简单的总结,下面假设同时使用DigestProcessingFilter和辅助类:

如果exceptionIfMaximumExceeded = true,即第二个发起的会话被禁止,如果一个用户重新启动浏览器,再次登录失败,因为前一个会话没有超时,被当成了多次登录。
如果exceptionIfMaximumExceeded = false,如果两个人使用同一个帐号登录,将出现交互将对方踢出去的现象,实际上并没有禁止任何人登录,只是每次要先将另一个人踢下去。

--------------------------------------------------------------------------------


需求
我想使用exceptionIfMaximumExceeded = true,同时允许同一个用户在同一台机器上连续登录多次,我采取了编写定制的ConcurrentSessionController实现类的方法。


--------------------------------------------------------------------------------


原理
ConcurrentSessionController是一个接口,有两个需要实现的方法:checkAuthenticationAllowed()和registerSuccessfulAuthentication(),Spring Security提供了一个实现类ConcurrentSessionControllerImpl,经过分析缺省的实现类,发现方法allowableSessionsExceeded()处理多次并发会话,在SecurityRegistry中保存每个会话的信息,主要是用户帐号对应的会话ID(sessionId)和最后发起时间,在并发发生时,从SecurityRegistry中取出关于某个用户帐号的所有会话,如果exceptionIfMaximumExceeded = false,找到最早一个会话,将其释放掉,腾出空间给新会话,如果exceptionIfMaximumExceeded = true,将发出一个异常。

所以,需要改进allowableSessionsExceeded(),如果exceptionIfMaximumExceeded = true让程序判断客户地址,如果同一个IP,则允许登录,将最早的会话释放掉,如果不是同一个IP在发出异常。

在SecurityRegistry中,用户帐号信息存在一个对象中,名字是principal,当前是一个Object对象,实际上只是存了一个字符串,所以需要扩展principal,写一个定制的类(我的类含有两个属性:username和userip),里面保存客户IP信息。allowableSessionsExceeded()只是使用SecurityRegistry,SecurityRegistry中的内容是由registerSuccessfulAuthentication()方法写入的,所以,在该方法中需要将原来的pricipal对象替换成定制的Principal类的对象。同时checkAuthenticationAllowed()方法也要修改,因为这个方法要查询SecurityRegistry,查询条件替换成定制的Principal类的对象。


--------------------------------------------------------------------------------


注意事项
定制的Principal类要实现equals()和hashCode()和toString()三个方法,在equals()方法中只要username相同就表示两个对象相同,而在hashCode()中只需要将username的hashcode计算在内,因为SecurityRegistry是以principal为关键字的Map容器,这两个方法决定了对Map的查询。toString()方法可以根据自己的需要写,我只是将username输出。


--------------------------------------------------------------------------------


测试
将定制的ConcurrentSessionController对象编制(wire)到应用系统中,经过测试,能够达到预想目的。


--------------------------------------------------------------------------------


存在的问题
原来想省点劲,只要继承ConcurrentSessionControllerImpl并重载上述三个方法就行了,但是不知道为什么securityRegistery属性一直注入不了,一气之下,写了一个直接实现ConcurrentSessionController接口的新类。实际上也不是从头写,将ConcurrentSessionControllerImpl代码改吧该吧即可,用不了几分钟,这就是开源的好处。




    转自 http://www.gooseeker.com/cn/node/517
分享到:
评论

相关推荐

    spring的acegi应用

    Acegi是Spring早期的一个安全组件,后来发展成为Spring Security,是Spring生态系统中的重要部分,用于提供全面的安全解决方案。 Spring Security(原名Acegi Security)是一个强大的框架,用于保护基于Spring的...

    spring_acegi精彩实例,带MYSQL数据库脚本,保证能运行

    spring_acegi精彩实例,带MYSQL数据库脚本,保证能运行 spring_acegi精彩实例,带MYSQL数据库脚本,保证能运行 spring_acegi精彩实例,带MYSQL数据库脚本,保证能运行 spring_acegi精彩实例,带MYSQL数据库脚本,...

    Spring源代码解析(十):Spring_Acegi框架授权的实现.doc

    在Spring框架中,Acegi(现在已经并入Spring Security)是一个强大的安全管理组件,它提供了认证和授权功能。在本文中,我们将深入探讨Spring_Acegi框架如何实现授权机制,特别是通过`FilterSecurityInterceptor`来...

    spring security3 中文版本

    - **配置 web.xml**:在 web.xml 文件中配置 Spring Security 的过滤器链。 - **最小 `<http>` 配置**:使用 `<http>` 元素可以轻松地配置 HTTP 认证和授权规则。 - **自动配置**:`auto-config` 属性可以自动配置...

    Spring Acegi权限控制

    Acegi Security(现已被Spring Security替代)是一个功能强大的安全框架,它主要解决了认证(Authentication)和授权(Authorization)这两个核心的安全问题。 首先,让我们理解认证和授权的基本概念: - **认证**...

    spring acegi 详细文档

    首先,Acegi的主要目标是保护Spring应用免受非法访问,它提供了丰富的功能来实现用户认证、会话管理、权限控制以及安全相关的异常处理。Acegi的核心组件包括`AuthenticationManager`、`AccessDecisionManager`和`...

    Spring的ACEGI的应用

    而在安全方面,Spring曾提供了一个名为Acegi Security的模块,它是Spring早期的一个安全解决方案,用于实现复杂的认证和授权需求。本文将深入探讨Spring的Acegi应用及其核心概念。 **1. Acegi Security简介** Acegi...

    spring-security 官方文档 中文版

    Spring Security 最初是由 Luke Taylor 和 Ray Ryan 开发的名为 Acegi Security 的项目,在 2005 年被并入 Spring 项目,并重新命名为 Spring Security。自那时起,Spring Security 经历了多个版本的迭代,不断地...

    springsecurity官方文档3.2

    - **添加自定义过滤器**: 如何向 Spring Security 添加自定义的安全过滤器。 - **设置自定义认证入口点**: 如何配置自定义的认证入口点。 - **方法安全**: - **`<global-method-security>` 元素**: 介绍该元素...

    spring Acegi例子,很简单的一个acegi实例,容易理解

    Acegi(现在已被Spring Security替代)在Spring应用程序中提供了身份验证、授权和会话管理等功能。 在Spring Acegi的例子中,我们首先需要了解的是基础概念: 1. **身份验证(Authentication)**:这是验证用户...

    spring security reference【洋文】

    Spring Security是一个功能强大且可高度定制的身份验证和访问控制框架,它是保护Java应用程序的事实标准。Spring Security Reference提供了该框架的官方文档,旨在帮助开发人员理解和应用Spring Security来保护他们...

    springsecurity电子书

    Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是保护基于 Spring 的应用程序的事实上的标准。在 SpringSecurity电子书中,作者Ben Alex和Luke Taylor提供了对Spring Security的全面介绍...

    Spring Security 中文教程.pdf

    - **发展历程**:Spring Security的发展历程可以追溯到早期的ACEGI Security项目,后来被集成到Spring框架中,并经过多次迭代更新,形成了如今功能强大且灵活的Spring Security框架。 - **获取方式**: - **项目...

    spring-security所需要的jar包,

    在使用这些库时,开发者需要确保他们的项目配置正确,包括Spring Security的配置文件(如 applicationContext-security.xml),以及对所需安全功能的定制,例如登录页面、权限控制、会话管理等。同时,源代码和测试...

    Spring Security学习总结一

    配置Spring Security涉及定义过滤器链、设置认证管理器、指定权限规则等步骤。通过这种方式,我们可以轻松地为Web应用添加强大的安全功能,而无需深入底层细节,Spring Security为我们处理了大部分繁重工作。 综上...

    acegi(Spring Security) 参考手册

    Spring Security的过滤器链是其工作流程的核心,手册会详细介绍每个过滤器的作用和配置方法。这些过滤器在HTTP请求到达控制器之前进行拦截,执行认证和授权等安全检查,如Remember-Me服务用于自动登录,...

    Spring+Acegi+ehcache安全框架常用jar包.rar

    Spring Security前身Acegi Security是Spring框架的一个扩展,它提供了一套全面的权限管理和认证机制,包括用户身份验证、访问控制、会话管理等功能。这个框架允许开发者通过声明式的方式来设置安全策略,使得代码...

Global site tag (gtag.js) - Google Analytics