CustomAuthenticationSuccessHandler.java 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package com.jiayue.ssi.handler;
  2. import java.io.IOException;
  3. import java.util.Date;
  4. import java.util.List;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  9. import com.jiayue.ssi.config.SendMailUtil;
  10. import com.jiayue.ssi.constant.CacheConstants;
  11. import com.jiayue.ssi.constant.Constants;
  12. import com.jiayue.ssi.constant.LoginConstants;
  13. import com.jiayue.ssi.constant.SecretKeyConstants;
  14. import com.jiayue.ssi.dto.UserVisitInfoDto;
  15. import com.jiayue.ssi.entity.SysAlarm;
  16. import com.jiayue.ssi.entity.SysPolicy;
  17. import com.jiayue.ssi.factory.LoginFactory;
  18. import com.jiayue.ssi.service.SysAlarmService;
  19. import com.jiayue.ssi.service.SysPolicyService;
  20. import com.jiayue.ssi.service.SysUserService;
  21. import com.jiayue.ssi.util.*;
  22. import eu.bitwalker.useragentutils.UserAgent;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.security.core.Authentication;
  25. import org.springframework.security.core.context.SecurityContextHolder;
  26. import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
  27. import org.springframework.stereotype.Component;
  28. import com.jiayue.ssi.entity.SysUser;
  29. import cn.hutool.json.JSONUtil;
  30. /**
  31. * 成功认证处理
  32. * @author xsl
  33. * @date 2023/2/16
  34. */
  35. @Component("customAuthenticationSuccessHandler")
  36. public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
  37. @Autowired
  38. JwtTokenUtil jwtTokenUtil;
  39. @Autowired
  40. SysUserService sysUserService;
  41. @Autowired
  42. SysPolicyService sysPolicyService;
  43. @Autowired
  44. SendMailUtil sendMailUtil;
  45. @Autowired
  46. SysAlarmService sysAlarmService;
  47. @Override
  48. public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
  49. final UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
  50. // 验证码验证
  51. String username = request.getParameter("username");
  52. // 删除缓存邮箱口令
  53. LocalCache.remove(CacheConstants.MAIL_CODE_KEY + username);
  54. LocalCache.remove(CacheConstants.PREVENT_MAIL_CODE + username);
  55. SysUser sysUser = (SysUser) authentication.getPrincipal();
  56. sysUser.setErrNum(0);
  57. sysUser.setLockTime(0L);
  58. sysUser.setStatus("0");
  59. // 加入登录IP和时间
  60. String ip = IPUtils.getIpAddr(request);
  61. sysUser.setLoginIp(ip);
  62. sysUser.setLoginDate(new Date());
  63. sysUserService.updateUser(sysUser);
  64. SecurityContextHolder.getContext().setAuthentication(authentication);
  65. CacheConstants.usernamePasswordMap.put(username,request.getParameter("password"));
  66. // 记录用户登录日志
  67. LoginFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
  68. String token = jwtTokenUtil.generateToken(sysUser);
  69. // token加入缓存,用于并发会话处理
  70. UserVisitInfoDto userVisitInfoDto = new UserVisitInfoDto();
  71. userVisitInfoDto.setUsername(username);
  72. userVisitInfoDto.setVtime(System.currentTimeMillis());
  73. userVisitInfoDto.setIp(ip);
  74. userVisitInfoDto.setLoginLocation(AddressUtils.getRealAddressByIP(ip));
  75. // 获取客户端操作系统
  76. String os = userAgent.getOperatingSystem().getName();
  77. // 获取客户端浏览器
  78. String browser = userAgent.getBrowser().getName();
  79. userVisitInfoDto.setBrowser(browser);
  80. userVisitInfoDto.setOs(os);
  81. LoginConstants.sessionMap.put(username,userVisitInfoDto);
  82. // 将token存储内存中,便于重复登录比对
  83. if (CacheConstants.LOGIN_TOKEN_MAP.get(username)!=null){
  84. // 之前有用户登录过,本次将上次用户踢出下线。并通知管理员
  85. String noticeWay = "";
  86. SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
  87. if ("0".equals(sysPolicy.getExcLevelSameUser())){
  88. noticeWay = sysPolicy.getExcNoticeWayA();
  89. } else if ("1".equals(sysPolicy.getExcLevelSameUser())){
  90. noticeWay = sysPolicy.getExcNoticeWayB();
  91. }
  92. // 通知系统管理员
  93. if ("0".equals(noticeWay)){
  94. List<SysUser> sysUserList = sysUserService.selectUserByRole("1");
  95. if (sysUserList.size()>0){
  96. String[] mailArray = new String[sysUserList.size()];
  97. for (int i=0;i<sysUserList.size();i++){
  98. // 邮箱解密
  99. mailArray[i] = AesUtils.decryptStr(sysUserList.get(i).getMailbox());
  100. }
  101. try {
  102. // 发送邮件
  103. sendMailUtil.executeSendMail(mailArray,"账号【"+sysUser.getUsername()+"】多点登录","本次登录时间:"+DateUtils.getTime()+",登录IP:"+IPUtils.getIpAddr(request));
  104. } catch (Exception ex) {
  105. System.out.println("邮箱验证码发送失败!");
  106. }
  107. }
  108. }
  109. else if ("1".equals(noticeWay)){
  110. // 告警
  111. SysAlarm sysAlarm = new SysAlarm();
  112. sysAlarm.setAlarmContent("账号【"+sysUser.getUsername()+"】多点登录");
  113. sysAlarm.setReadSign("0");
  114. // 低于策略设定值则告警
  115. sysAlarmService.save(sysAlarm);
  116. }
  117. }
  118. CacheConstants.LOGIN_TOKEN_MAP.put(username,token);
  119. String obj = JSONUtil.toJsonStr(ResponseVO.success(token));
  120. // token加密处理
  121. String encrypt = SM2CryptUtils.encrypt(obj, SecretKeyConstants.CLIENT_PUBLIC_KEY);
  122. // token签名
  123. String signStr = SM2CryptUtils.sign(SecretKeyConstants.SERVER_PRIVATE_KEY,obj);
  124. String secretResult = "jy="+encrypt+"&jySign="+signStr;
  125. response.addHeader("Access-Control-Allow-Origin", "*");
  126. response.setStatus(200);
  127. response.setContentType("text/html;charset=UTF-8");
  128. response.getWriter().write(secretResult);
  129. }
  130. }