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

来源:互联网 发布:怎么做 数据质量管控 编辑:程序博客网 时间:2024/06/02 12:53

这段时间做项目遇到一个关于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有没有相同用户名的,如果有就删除。

阅读全文
0 0
原创粉丝点击