牛骨文教育服务平台(让学习变的简单)
博文笔记

关于shiro同一帐号同一时刻多处登录问题

创建时间:2017-12-08 投稿人: 浏览次数:124

这段时间做项目遇到一个关于shiro登录的问题。同一帐号不能同时登录,如果同时登录的话前面一个人的session就失效。百转千回,因为shiro登录到权限控制没有任何问题,就把问题点转移到存储端。去检查redis,检查reids的配置相关,结果也没发现什么毛病。后来在网上查阅文章,多看了看shiro相关的东西。问题锁定在shiro控制同一用户不能在同一时刻多处登录,然后修改程序:


1.shiro配置文件一下代码,由配置文件去到shiroDbRealm:


<!-- Shiro"s main business-tier object for web-enabled applications -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="realm" ref="shiroDbRealm" />
		<property name="cacheManager" ref="cacheManager" />
		<!-- shiro session管理器 -->  
        <property name="sessionManager" ref="sessionManager"></property> 
	</bean>

	<!-- 項目自定义的Realm, 所有accountService依赖的dao都需要用depends-on声明 -->
	<bean id="shiroDbRealm" class="com.swm.web.service.system.ShiroDbRealm" />

	<!-- Shiro Filter -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" depends-on="rolesOrFilter">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/login.html" />
		<property name="successUrl" value="/" />
		<property name="unauthorizedUrl" value="/unauthorized.html"></property>
		<property name="filterChainDefinitions" value="#{myFilterChainService.getValue()}"/>
		 <property name="filters">
        	<map>
            	<entry key="rolesOrFilter" value-ref="rolesOrFilter" />
        	</map>
        </property>
	</bean>

2.

if(loginUser.getLoginFlag().equals("1")){
	Subject currentUser = SecurityUtils.getSubject();
	Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();
	if(sessions != null && sessions.size()>0){
		for(Session session:sessions){ 
		// 获得session中已经登录用户的名字
		PubUser mUser = (PubUser) session.getAttribute("LOGINUSER");
		if(mUser != null){
			String loginUsername = mUser.getLoginName();
			/*if(token.getUsername().equals(loginUsername)){
				//这里就把session清除,  
				sessionManager.getSessionDAO().delete(session);
			}*/
		}
	}
	}
		Session session = currentUser.getSession();
		session.setAttribute("LOGINUSER", loginUser);
		return new SimpleAuthenticationInfo(principal, loginUser.getPassword().substring(16), ByteSource.Util.bytes(salt), getName());
}

注释中的代码就是问题的根本原因。校验当前session有没有相同用户名的,如果有就删除。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。