`

用Spring Security实现HTTP Digest认证和同帐号多次登录限制

 
阅读更多
Spring Security的前身是Acegi,实际上要实现HTTP Digest认证可以不必采用Spring Security,而是直接使用Tomcat 容器提供的HTTP Digest认证功能即可,只是考虑到系统的扩展性和更多的可控性,最终决定采用Spring Security,在Javascript XMLHttpRequest与Spring Security配合实现具有鉴权认证功能的系统一帖中讲述了怎样使用HTTP Basic认证方式,本贴是上帖的续文,主要考虑到开发的系统是一个在线商业运营系统,足够的安全性是必须的。

目标系统是一个采用Javascript XMLHttpRequest对象的HTTP/XML通信系统,通信消息内容几乎全部是XML,所以采用Form based(基于表单提交)的认证并不方便,也不够安全。

在HTTP Digest方式下,服务器要保存session信息,而在HTTP Basic方式下,每次发起通信都可以携带用户帐号和口令信息,所以,在服务器上不必保存session状态,可以做一个测试,用上一帖的配置,客户端和服务器进行一次通信后,服务器虽然给客户端发下了一个JSESSIONID类的cookie,删掉后没有任何影响,本人没有深入研究服务器上哪个过程执行了cookie的下发。

由于HTTP Digest方式需要服务器维护session状态,所以需要考虑更多一些问题。而为了实现同帐号多次登录限制,需要使用ConcurrentSessionFilter,更加使session状态问题复杂化了。

在调试过程中一直在跟下面的异常作斗争:

[ERROR] 18:03:39 [metacamp] - Servlet.service() for servlet servlet名称 threw exception
java.lang.IllegalArgumentException: SessionIdentifierAware did not return a Session ID
(org.springframework.security.ui.WebAuthenticationDetails@3bcc: RemoteIpAddress: 127.0.0.1; SessionId: null)

起初,该异常发生在系统运行之初,第一次通信时,根据一些资料和实验,发现ConcurrentSessionFilter放在所有过滤器的前面,它内部需要使用SessionID作为关键字访问和修改状态信息,例如,查看和记录某个用户登录过几次。第一次通信当然是找不到这个信息的,很多网友也曾经跟这个异常战斗过,以前主要是为了解决ConcurrentSessionFilter(控制并发)和Remember me的冲突问题,也有人建议在发起安全保护的通信前先发一个普通的通信,使session能够预先建立好。

实际上,我遇到这个异常是对Spring Security使用不当,应该在web.xml中增加一个listener:

<listener>
<listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener>
这个bean能够发现当前没有可用的session并将该事件通知给能够创建session的其它bean,这样通信之初出现异常的问题解决了



Tomcat 容器的session超时时间缺省是30分钟,30分钟过后,再进行通信,上述异常又出现了,经过测试,发现HttpSessionContextIntegrationFilter.forceEagerSessionCreation=true应该设置,否则缺省是false,Spring 论坛上有对这个属性的解释,根据解释,如果session已经存在了,即使这个属性设置成true也不会重复创建(其英文有点难懂,是否理解有误?)。至此,系统已经安预期运行了。

以上总结主要来自于实践,未对Spring Security作深入的分析,可能理解有误。

‹ Java正则表达式典型用例 怎样设置Vista用户环境变量 ›.程序员之家Login or register to post comments.Mon, 03/01/2010 - 17:20 — sherrymathew93
Initially, the exception
Initially, the exception occurred in the system is running at the beginning, the first communication, in accordance with some information and experiments, ConcurrentSessionFilter placed in front of all the filters, its internal need to use the SessionID as a keyword to access and modify the state information, for example, view, and records a user log on several times. microsoft training The first communication of course can not find this information, many Internet users have fought with the anomaly, previously mainly to solve the ConcurrentSessionFilter (concurrency control), and Remember me in conflict, it was suggested that security of communications initiated before made an ordinary communication, so that session to advance the establishment of a good.
.Login or register to post comments
Tue, 10/28/2008 - 18:41 — Fuller
ConcurrentSessionFilter的判断有点生硬
使用一个帐号登录以后,推出系统,重新启动浏览器,再次登录,被禁止,估计原来的session没有超时,本帐号用一个新的session登录,不能成功。要是能够判断客户端IP地址是否变化就好了。还想了一个替代解决方案:使用rememberMe,如果能够在客户端留下一个保存在硬盘中的cookie,也许能够解决这个问题,但是没有试成功。
分享到:
评论

相关推荐

    Spring Security权限管理开发手册

    - **使用ajax实现digest认证:** 使用JavaScript/Ajax技术实现客户端的Digest认证。 - **编程实现digest客户端:** 编写客户端代码来支持Digest认证。 - **第21章:通过LDAP获取用户信息** - **配置LDAP:** ...

    Spring Security3技术手册

    - 学习如何在Spring Security的配置文件中定义数据源,并使用JDBC来管理用户和权限。 - **示例代码**: 在`spring-security.xml`中配置`&lt;authentication-manager&gt;`和`&lt;authentication-provider&gt;`。 - **2.2 数据库...

    spring security2 安全手册(牛人写的)

    - **后登陆的将先登录的踢出系统**:设置会话控制策略,当同一用户多次登录时,最新的登录将覆盖之前的会话。 - **后面的用户禁止登陆**:实现一种策略,禁止同一用户同时拥有多个活动会话。 #### 10. 单点登录 ...

    acegi-security-jetty-0.8.1.1.jar.zip

    Acegi Security是一个已弃用的安全框架,它在Java企业级应用程序中用于身份验证和授权管理。这个特定的压缩包文件 "acegi-security-jetty-0.8.1.1.jar.zip" 包含了Acegi Security的一个版本,该版本是为Jetty服务器...

    acegi的详细配置实现

    Acegi Security的版本号遵循一定的规则:主版本号、次版本号和补丁版本号,例如1.0.0表示主要版本1,次要版本0,补丁版本0。 #### 二、技术概述 ##### 2.1 运行环境 Acegi Security的设计考虑到了与Spring框架的...

    Practical Quick Start with Acegi Security

    它在项目中的使用已经超过两年半的时间,并且在1.0.0版本发布前已有超过70,000次下载记录。此外,该项目拥有14名贡献者以及一个活跃的开发者社区,这确保了框架的持续发展和完善。Acegi安全框架采用Apache 2.0许可证...

    Java帐号管理系统(MD5加密).rar

    该系统可能使用了Spring框架来构建业务逻辑,Spring Security来处理权限控制和认证,以及Hibernate或MyBatis作为持久层框架,以方便数据库操作。 账号管理系统的核心功能包括用户注册、登录验证、密码修改和权限...

    shiro用户教程pdf

    这包括了如何配置Shiro、实现登录认证、实现权限控制等。 ### 第十七章:OAuth2集成 #### 17.1 服务器端 OAuth2是一种开放标准授权协议,用于实现授权流程。Shiro可以与OAuth2结合使用,实现在服务器端的认证和...

    java开源包3

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包4

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    MD5加密算法(java)

    MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的信息映射为固定长度的输出,通常是一个128位的二进制数,以32位十六进制数的形式表示。在Java中,MD5加密算法常用于数据校验、密码...

    java开源包1

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包8

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    jwlogin:睡不着,瞎写着玩

    常见的哈希算法有MD5和SHA系列,但现在更推荐使用加盐(Salting)和多次迭代的哈希算法如bcrypt或scrypt,以增加破解难度。 登录页面的交互设计也很重要,需要考虑用户体验和安全性。表单提交通常使用POST方法,...

    java开源包11

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包2

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包6

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包5

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

    java开源包10

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

Global site tag (gtag.js) - Google Analytics