关于shiro同一帐号同一时刻多处登录问题
这段时间做项目遇到一个关于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有没有相同用户名的,如果有就删除。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
