shiro解决一个账号异地登录的问题

如下,找到session中的信息删除即可

 /**
      * 登录认证
      * @param token
      * @return
      * @throws AuthenticationException
      */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        //获取用户的输入的账号.
        String username = (String)token.getPrincipal();
        //通过username从数据库中查找 User对象,如果找到,没找到.
        //实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
        LoginUser userInfo = loginUserBiz.getByName(username);
        if(null==userInfo){
            return null;
        }
        //处理一个账号异地登录的问题,后期用户量上来需要做优化,比如登录用cas
        DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
        DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();
        //获取当前已登录的用户session列表
        Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();
        for(Session session:sessions){
            //查找是否有当前登录账户的记录,有就清除该用户以前登录时保存的session
            if(userInfo.getNickName().equals(String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY)))) {
                sessionManager.getSessionDAO().delete(session);
            }
        }
        //创建认证
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
                userInfo, //用户信息
                userInfo.getPassword(), //密码
                ByteSource.Util.bytes(userInfo.getSalt()),//passsword=MD5(pass+salt)
                getName()  //realm name
        );
        return authenticationInfo;
    }

猜你喜欢

转载自www.cnblogs.com/zeussbook/p/10882426.html