转载 https://www.cnblogs.com/zeussbook/p/10882426.html
/** * 登录认证 * @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; } //2.处理一个账号异地登录的问题,后期用户量上来需要做优化,比如登录用cas DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager(); DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager(); //获取当前已登录的用户session列表 Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions(); for(Session session:sessions){ //查找是否有当前登录账户的记录,有就清除该用户以前登录时保存的session Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); if(null!=obj){ if(obj instanceof SimplePrincipalCollection){ //强转 SimplePrincipalCollection spc = (SimplePrincipalCollection)obj; LoginUser user = new LoginUser(); BeanUtils.copyProperties(spc.getPrimaryPrincipal(),user); //判断用户,匹配用户ID。 if(userInfo.getId().equals(user.getId())){ 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; }