Browse Source

fix(login): 解决用户重复登录验证问题

- 添加了SysUserTokenEntity实体类导入
- 实现了前端token与数据库token的一致性验证
- 增加了对请求头中token的检查逻辑
- 添加了多地登录场景的判断和处理
- 实现了自动清理旧token并允许重新登录的功能
- 优化了重复登录错误提示的触发条件
master
常熟吴彦祖 5 days ago
parent
commit
568c6a6a74
  1. 19
      src/main/java/com/gaotao/modules/sys/controller/SysLoginController.java

19
src/main/java/com/gaotao/modules/sys/controller/SysLoginController.java

@ -6,6 +6,7 @@ import com.gaotao.common.constant.SysMsgConstant;
import com.gaotao.common.utils.Constant; import com.gaotao.common.utils.Constant;
import com.gaotao.common.utils.R; import com.gaotao.common.utils.R;
import com.gaotao.modules.sys.entity.SysUserEntity; import com.gaotao.modules.sys.entity.SysUserEntity;
import com.gaotao.modules.sys.entity.SysUserTokenEntity;
import com.gaotao.modules.sys.form.SysLoginForm; import com.gaotao.modules.sys.form.SysLoginForm;
import com.gaotao.modules.sys.service.SysCaptchaService; import com.gaotao.modules.sys.service.SysCaptchaService;
import com.gaotao.modules.sys.service.SysUserService; import com.gaotao.modules.sys.service.SysUserService;
@ -113,7 +114,23 @@ public class SysLoginController extends AbstractController {
} }
// 检查用户是否已登录超级管理员跳过检查- rqrq // 检查用户是否已登录超级管理员跳过检查- rqrq
if(user.getUserId() != Constant.SUPER_ADMIN && sysUserTokenService.isUserLoggedIn(user.getUserId())){ if(user.getUserId() != Constant.SUPER_ADMIN && sysUserTokenService.isUserLoggedIn(user.getUserId())){
return R.error("用户已经登录,请先退出后再登录");
// 检查请求中是否携带token - rqrq
String oldToken = request.getHeader("token");
if(oldToken != null && !oldToken.isEmpty()) {
// 验证前端token是否与数据库中的token一致 - rqrq
SysUserTokenEntity tokenEntity = sysUserTokenService.getById(user.getUserId());
if(tokenEntity != null && tokenEntity.getToken().equals(oldToken)) {
// Token一致说明是真的多地登录 - rqrq
return R.error("用户已经登录,请先退出后再登录");
}
}
// 以下情况允许登录
// 1. 前端没有tokenCookie丢失或浏览器关闭后重新打开
// 2. 前端token与数据库不一致可能是旧token
// 自动清理旧token允许重新登录 - rqrq
sysUserTokenService.forceLogout(user.getUserId());
} }
session.setAttribute("user", user); session.setAttribute("user", user);

Loading…
Cancel
Save