Commit a134d96e96436e3c6b9f5e8191b3a2f672a740e8

Authored by 李泰瑜
1 parent d8c9c10b

同一用户只能一处登录 注销改为通过key进行校验

jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/LoginController.java
@@ -24,9 +24,11 @@ import org.jeecg.modules.system.entity.SysUser; @@ -24,9 +24,11 @@ import org.jeecg.modules.system.entity.SysUser;
24 import org.jeecg.modules.system.model.SysLoginModel; 24 import org.jeecg.modules.system.model.SysLoginModel;
25 import org.jeecg.modules.system.service.*; 25 import org.jeecg.modules.system.service.*;
26 import org.jeecg.modules.system.util.RandImageUtil; 26 import org.jeecg.modules.system.util.RandImageUtil;
  27 +import org.jeecg.modules.system.vo.SysUserOnlineVO;
27 import org.jeecg.utils.StringUtils; 28 import org.jeecg.utils.StringUtils;
28 import org.springframework.beans.BeanUtils; 29 import org.springframework.beans.BeanUtils;
29 import org.springframework.beans.factory.annotation.Autowired; 30 import org.springframework.beans.factory.annotation.Autowired;
  31 +import org.springframework.data.redis.core.RedisTemplate;
30 import org.springframework.web.bind.annotation.*; 32 import org.springframework.web.bind.annotation.*;
31 33
32 import javax.annotation.Resource; 34 import javax.annotation.Resource;
@@ -56,6 +58,8 @@ public class LoginController { @@ -56,6 +58,8 @@ public class LoginController {
56 @Autowired 58 @Autowired
57 private ISysTenantService sysTenantService; 59 private ISysTenantService sysTenantService;
58 @Autowired 60 @Autowired
  61 + public RedisTemplate redisTemplate;
  62 + @Autowired
59 private ISysDictService sysDictService; 63 private ISysDictService sysDictService;
60 @Resource 64 @Resource
61 private BaseCommonService baseCommonService; 65 private BaseCommonService baseCommonService;
@@ -430,6 +434,32 @@ public class LoginController { @@ -430,6 +434,32 @@ public class LoginController {
430 obj.put("tenantList", tenantList); 434 obj.put("tenantList", tenantList);
431 } 435 }
432 } 436 }
  437 +
  438 + //删除相同用户名称对应的key
  439 + Collection<String> keys = redisTemplate.keys(CommonConstant.PREFIX_USER_TOKEN + "*");
  440 + List<SysUserOnlineVO> onlineList = new ArrayList<SysUserOnlineVO>();
  441 + for (String key : keys) {
  442 + String token = (String) redisUtil.get(key);
  443 + LoginUser loginUser = sysBaseAPI.getUserByName(JwtUtil.getUsername(token));
  444 + if (loginUser != null) {
  445 + if(oConvertUtils.isNotEmpty(username) && loginUser.getUsername().contains(username)){
  446 + log.info(" 强制 "+sysUser.getRealname()+"退出成功! ");
  447 + //清空用户登录Token缓存
  448 + redisUtil.del(token);
  449 + redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + token);
  450 + //清空用户登录Shiro权限缓存
  451 + redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
  452 + //清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>
  453 + redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
  454 + //调用shiro的logout
  455 + SecurityUtils.getSubject().logout();
  456 + //
  457 + redisUtil.del(key);
  458 + }
  459 + }
  460 + }
  461 +
  462 +
433 // update-end--Author:sunjianlei Date:20210802 for:获取用户租户信息 463 // update-end--Author:sunjianlei Date:20210802 for:获取用户租户信息
434 // 生成token 464 // 生成token
435 String token = JwtUtil.sign(username, syspassword, warehouseCode); 465 String token = JwtUtil.sign(username, syspassword, warehouseCode);
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/controller/SysUserOnlineController.java
@@ -61,7 +61,7 @@ public class SysUserOnlineController { @@ -61,7 +61,7 @@ public class SysUserOnlineController {
61 String token = (String)redisUtil.get(key); 61 String token = (String)redisUtil.get(key);
62 if (StringUtils.isNotEmpty(token)) { 62 if (StringUtils.isNotEmpty(token)) {
63 SysUserOnlineVO online = new SysUserOnlineVO(); 63 SysUserOnlineVO online = new SysUserOnlineVO();
64 - online.setToken(token); 64 + online.setToken(key);
65 //TODO 改成一次性查询 65 //TODO 改成一次性查询
66 LoginUser loginUser = sysBaseAPI.getUserByName(JwtUtil.getUsername(token)); 66 LoginUser loginUser = sysBaseAPI.getUserByName(JwtUtil.getUsername(token));
67 if (loginUser != null) { 67 if (loginUser != null) {
@@ -112,22 +112,38 @@ public class SysUserOnlineController { @@ -112,22 +112,38 @@ public class SysUserOnlineController {
112 if(oConvertUtils.isEmpty(online.getToken())) { 112 if(oConvertUtils.isEmpty(online.getToken())) {
113 return Result.error("退出登录失败!"); 113 return Result.error("退出登录失败!");
114 } 114 }
115 - String username = JwtUtil.getUsername(online.getToken());  
116 - LoginUser sysUser = sysBaseAPI.getUserByName(username);  
117 - if(sysUser!=null) {  
118 - baseCommonService.addLog("强制: "+sysUser.getRealname()+"退出成功!", CommonConstant.LOG_TYPE_1, null,sysUser);  
119 - log.info(" 强制 "+sysUser.getRealname()+"退出成功! ");  
120 - //清空用户登录Token缓存  
121 - redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + online.getToken());  
122 - //清空用户登录Shiro权限缓存  
123 - redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());  
124 - //清空用户的缓存信息(包括部门信息),例如sys:cache:user::<username>  
125 - redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));  
126 - //调用shiro的logout  
127 - SecurityUtils.getSubject().logout();  
128 - return Result.ok("退出登录成功!");  
129 - }else {  
130 - return Result.error("Token无效!"); 115 + Collection<String> keys = redisTemplate.keys(CommonConstant.PREFIX_USER_TOKEN + "*");
  116 + List<SysUserOnlineVO> onlineList = new ArrayList<SysUserOnlineVO>();
  117 + for (String key : keys) {
  118 + if (key.equals(online.getToken()))
  119 + {
  120 + String tokenValue = (String)redisUtil.get(online.getToken());
  121 + String username = JwtUtil.getUsername(tokenValue);
  122 + LoginUser sysUser = sysBaseAPI.getUserByName(username);
  123 + if(sysUser!=null) {
  124 + //update-begin--Author:wangshuai Date:20200714 for:登出日志没有记录人员
  125 + baseCommonService.addLog("用户名: "+sysUser.getRealname()+",退出成功!", CommonConstant.LOG_TYPE_1, null,sysUser);
  126 + //update-end--Author:wangshuai Date:20200714 for:登出日志没有记录人员
  127 + log.info(" 用户名: "+sysUser.getRealname()+",退出成功! ");
  128 +
  129 + //以下两个清空测试无效 保留在这吧
  130 + //清空用户登录Token缓存/用户登录Shiro权限缓存
  131 + redisUtil.del(CommonConstant.PREFIX_USER_TOKEN + tokenValue);
  132 + redisUtil.del(CommonConstant.PREFIX_USER_SHIRO_CACHE + sysUser.getId());
  133 +
  134 + //真*清空Token
  135 + redisUtil.del(key);
  136 +
  137 + //清空用户的缓存信息
  138 + redisUtil.del(String.format("%s::%s", CacheConstant.SYS_USERS_CACHE, sysUser.getUsername()));
  139 + //调用shiro的logout
  140 + SecurityUtils.getSubject().logout();
  141 + return Result.ok("退出登录成功!");
  142 + }else {
  143 + return Result.error("Token无效!");
  144 + }
  145 + }
131 } 146 }
  147 + return Result.error("Token无效!");
132 } 148 }
133 } 149 }