声明一下,这篇文章不是基于acegi spring security2.0写的, 我发现很多文章都是基于老版本写的, 并不适用最新版。
下面跟大家分享一下在spring security3.0里如何正宗的做法达到控制多个账号请求的经验。
步骤1
下面只贴出关键部分, 为了不影响阅读。
注意: 不需要配置 SessionRegistry 等bean( 假设你其他地方不用到的话, 如果用到需要在
<concurrency-control session-registry-ref="sessionRegistry" error-if-maximum-exceeded="true" max-sessions="1" />
加上一个属性
在做某个管理员踢出一个账号的时候, SessionRegistry 这个bean是需要用到的。 写法如下:
有时候按文档和网上配置出来是很华丽, 可事实有时候就是没有如期运行。
我打开火狐 360浏览器, 还是等两个账号同时登录。
无奈之下把源码下下载剖析(常干的事儿, 喜欢捣腾这些东西)
判断重复的类是ConcurrentSessionControlStrategy.java下的
checkAuthenticationAllowed这个函数的
最重要的一句话是:
sessionInformationList.get(j).expireNow();
这句强制T出了用户, (设置为过期)
如果想彻底删除, 加上
sessionRegistry.removeSessionInformation(sessionInformationList.get(j).getSessionId());
即可,
这样使用getAllPrincipals 则获取不到被T出的用户了, 其实原理不是直接删除User对象, 只结束了它的sessionId,
因为这个User可能不止对应着1个sessionId
我发现, 无论我怎么配置, sessionCount老是烦人的 0。 即使我手动配置了ConcurrentSessionControlStrategy这个bean也没用(默认会自己调的)
无奈中想自己写一个自定义的计数器控制, 但细想它这东西不至于这个小问题都出这么大的漏洞吧?
现在的问题是:
如何让 int sessionCount = sessions.size(); 这句在第二个账号登陆的时候不为0。
于是我进入了sessionRegistry.getAllSessions(authentication.getPrincipal(), false); 这个函数。
也就是SessionRegistryImpl.java
public List<SessionInformation> getAllSessions(Object principal, boolean includeExpiredSessions) {
final Set<String> sessionsUsedByPrincipal = principals.get(principal);
这个函数是通过在一个HashMap里拿到key value的。
而principals的声明这样写。
private final Map<Object,Set<String>> principals = Collections.synchronizedMap(new HashMap<Object,Set<String>>());
现在的问题变为了:
如何让两个principal, 也就是User, 也就是
public UserDetails loadUserByUsername(String username)
两次登陆的时候返回的是同一个对象。
那么如何做到两次在不同浏览器登陆的时候返回的是同一个User?
答案是java的基础, equal hashcode方法重写。
在User对象里添加以下方法:
涉及这方面的基础请参考 http://blog.csdn.net/willielee/archive/2010/08/11/5804463.aspx
我就不浪费CSDN的硬盘空间了, 不过还是得贴出最后一句话:
HashMap的key判断key是否相等也是从hashcode和equals是否相等判断
从上面可以看出, 我们之前登陆的用户是存在 Map<Object,Set<String>> principals 的。
这个存储结构是, 一个User 对应多个Set集合的sessionId。
所以要判断用户是否已存在登陆的了, 当然要重写这2个方法。
分享到:
相关推荐
spring security3.0权限控制方面的文档
早一段时间学习了springsecurity3.0 框架,在开始阶段不知道导入那些必需jar包,经过摸索,总结出来最精简的jar包
spring-security-web-3.0 spring-security-taglibs-3.0 spring-security-openid-3.0 spring-security-core-3.0 spring-security-config-3.0 spring-security-aspects-3.0 spring-security-acl-3.0
SpringSecurity3.0 教程 价值不错哦!
Spring Security 3.0 权限管理精通,该系统是spring提供的企业级权限系统解决方案,因其优越的特性被广泛应用
本实例包含SpringSecurity3.0的基本配置,包含所需的Jar包和mysql数据库文件,直接导入myeclipes中并导入数据库即可运行,配置文件简单易懂,适合SpringSecurity初学者配置入门。数据库密码为md5加密后的字符串,可...
SpringSecurity3.0实现
教你使用 SpringSecurity 3.0 一步一步教你使用SpringSecurity,从保护web应用到保护业务方法调用
Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架。
Spring-Security2.0 和3.0 的中文使用文档。
超级详细的spring security3.0教程,包含spring security安全框架的历史和来源,一步一步的教你如何实现项目的安全实现
Spring Security 3.0 安全权限管理手册(最新),可以作为公司权限管理资料用,权限管理将是系统中的非常重要的一个模块,权限的设计也是参考相关资料进行整理和补充。系统将通过数据库进行管理用户权限
英文版本,主要对spring security 3.0.x 进行了介绍, 以及如何使用spring 的 安全架构来进行 web 开发.
spring3.0中文帮助文档,CHM版,中文离线版,以及spring security3.1.4帮助文档
Spring-Security3.0自定义表结构
介绍一个基于Spring Boot 3.0、Spring Cloud 2022 & Alibaba的微服务RBAC权限管理系统。该系统可以实现微服务RBAC权限管理,通过RBAC权限管理机制对用户访问系统的权限进行限制,从而提高系统的安全性和可用性。同时...
SpringSecurity3.0.x官方参考文档(英文+中文双解版)
简单springsecurity3.0的例子 做了详细注释,另外集成了tiles 和conversion插件,希望对你有帮助,里面有不对的地方请给我留言,我加你QQ一起讨论..注:我是通过maven管理的,如果你不是的话可能无法运行起来,只能看代码
spring security3.0所有最新开发包及源码及文档 欢迎大家下载,祝大家学习愉快!。
一步一步教你使用spring Security3