shiro安全框架扩展教程--如何扩展实现集中式session管理

简介:         上一章节我和大家分享的是如何扩展异步请求分支处理,这一章节我准备分享如何实现集中式session管理,shiro一大特色就是有自己一套session机制,与原生的https...

        上一章节我和大家分享的是如何扩展异步请求分支处理,这一章节我准备分享如何实现集中式session管理,shiro一大特色就是有自己一套session机制,与原生的httpsession差不多风格的api,用起来比较顺手,我个人也比较喜欢;spring security是比较依赖与原生httpsession,所以比较难扩展这会话机制,但是我们shiro使用者就不用担心这个问题,请大家准备好鸡蛋壳,香蕉皮吧...


进入主题,我们先看看session管理器


<!-- 会话管理器 -->
	<bean id="sessionManager"
		class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
		<property name="sessionValidationSchedulerEnabled" value="false" />
		<property name="sessionDAO" ref="sessionDAO" />
		<property name="globalSessionTimeout" value="60000"/>
	</bean>

基本用到就三个参数sessionValidationSchedulerEnabled(扫描session线程,负责清理超时会话), sessionDao是进行会话读写的实现,globalSessionTimeout是会话存活时间(默认是30分钟)


其他参数可看源码配置,象session的cookie编号键之类的,有需要才去改


下面看看我们的读写会话实现类


public class MCSessionDAO extends AbstractSessionDAO {

	private final static Logger log = LoggerFactory.getLogger(MCSessionDAO.class);

	private MemcachedClient client;

	public MCSessionDAO(MemcachedClient client) {
		if (client == null) {
			throw new RuntimeException("必须存在memcached客户端实例");
		}
		this.client = client;
	}

	@Override
	protected Serializable doCreate(Session session) {
		Serializable sessionId = generateSessionId(session);
		assignSessionId(session, sessionId);
		try {
			client.set(sessionId.toString(), (int) session.getTimeout() / 1000, session);
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return sessionId;
	}

	@Override
	protected Session doReadSession(Serializable sessionId) {
		Session session = null;
		try {
			session = client.get(sessionId.toString());
		} catch (Exception e) {
			log.error(e.getMessage());
		}
		return session;
	}

	@Override
	public void delete(Session session) {
		try {
			client.delete(session.getId().toString());
		} catch (Exception e) {
			log.error(e.getMessage());
		}
	}

	@Override
	public Collection<Session> getActiveSessions() {
		return Collections.emptySet();
	}

	@Override
	public void update(Session session) throws UnknownSessionException {
		try {
			client.replace(session.getId().toString(), (int) session.getTimeout() / 1000, session);
		} catch (Exception e) {
			log.error(e.getMessage());
		}
	}

}


getActiveSessions这个方法是用来统计当前活动的session,但是memcached也没有特别好的方法能获取同一批键值对,暂时只能不支持方法,如果有朋友想到好的解决方案,望请告知下小弟



其实这个类跟普通的crud差不多,主要是通过设置memcached的过期时间来作为session的存活时间,如果返回为null则认为session是登录超时了,值得注意一个问题memcached应该需要评估足够多的初始化内存,不然可能用户量一上去,就可能有会话丢失的可能,毕竟内存不够了memcached会自动把旧的一些数据挤出去,这要看memcached的失效策略设置


很明显我们这里的sessionDao实现类已经完成,然后配置到文件里面


<!-- 会话读写实现类 -->
	<bean id="sessionDAO" class="com.silvery.security.shiro.session.MCSessionDAO">
		<constructor-arg ref="memcachedClient" />
	</bean>

如何配置memcached的客户端实例我就不啰嗦,百度一大堆,把这个sessionDAO的编号注入到我们的sessionManager管理器里面


然后我们的会话管理器又要配置到哪里呢


<!-- 安全管理器 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="sessionManager" ref="sessionManager" />
		<property name="cacheManager" ref="shiroCacheManager" />
		<property name="realm" ref="simpleUserRealm" />
	</bean>


然后就完工了,最后就配置个nginx+2个tomcat集群下访问测试下即可


欢迎拍砖...


目录
相关文章
|
6月前
|
缓存 NoSQL Java
Spring Boot如何优雅实现动态灵活可配置的高性能数据脱敏功能
在当下互联网高速发展的时代下,涉及到用户的隐私数据安全越发重要,一旦泄露将造成不可估量的后果。所以现在的业务系统开发中都会对用户隐私数据加密之后存储落库,同时还要求后端返回数据给前台之前进行数据脱敏。所谓脱敏处理其实就是将数据进行混淆隐藏,如将用户的手机号脱敏展示为`178****5939,采用 * 进行隐藏,以免泄露个人隐私信息
173 0
|
3月前
|
存储 缓存 数据库
Shiro【核心功能、核心组件、项目搭建 、配置文件认证、数据库认证 】(一)-全面详解(学习总结---从入门到深化)
Shiro【核心功能、核心组件、项目搭建 、配置文件认证、数据库认证 】(一)-全面详解(学习总结---从入门到深化)
40 1
|
5月前
|
存储 安全 Java
介绍Spring Security框架,以及如何使用它实现应用程序的安全性
Spring Security 是一个功能强大且灵活的框架,用于实现应用程序的安全性。它提供了身份验证、授权、会话管理、密码存储和攻击防护等核心功能,同时支持单点登录和与第三方身份提供者的集成。通过简单的配置和定制,您可以轻松地为您的应用程序添加多层安全性。
|
6月前
|
XML 存储 前端开发
“实战经验总结:构建灵活、可维护的自定义MVC应用程序”(上)
“实战经验总结:构建灵活、可维护的自定义MVC应用程序”
32 0
|
6月前
|
存储 设计模式 前端开发
“实战经验总结:构建灵活、可维护的自定义MVC应用程序”(下)
“实战经验总结:构建灵活、可维护的自定义MVC应用程序”
21 0
|
前端开发 安全 Java
集中式整合之编写SpringSecurity配置类|学习笔记
快速学习集中式整合之编写SpringSecurity配置类
135 0
集中式整合之编写SpringSecurity配置类|学习笔记
|
缓存 安全 JavaScript
shiro安全框架扩展教程--整合cas框架扩展自定义CasRealm
       这次我给大家讲讲如何在shiro中整合cas框架,以及扩展自定义的角色和资源体系,啰嗦话不多说了,直接上代码说明 第一步,搭建cas服务器,我也不说拉,这个大家用现有的cas服务就行了 第二步,先加入cas-client的包到我们的项目,然后再下载个shiro-cas.
1234 0
|
安全 Java
shiro安全框架扩展教程--验证码的安全(jcaptcha框架)
        我们看到很多网站上都有验证码的功能,因为他们需要防止机器人注册等等,导致数据膨胀,或者是暴力破解,但是验证码做的难以破解是比较困难的,因为现在机器识别 功能是灰常强大的;要做...
1042 0