ManageService.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package com.fdkankan.manage.service.impl;
  2. import cn.dev33.satoken.stp.SaLoginConfig;
  3. import cn.dev33.satoken.stp.StpUtil;
  4. import cn.hutool.extra.servlet.ServletUtil;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.fdkankan.manage.common.ResultCode;
  7. import com.fdkankan.common.util.Base64Converter;
  8. import com.fdkankan.common.util.SecurityUtil;
  9. import com.fdkankan.manage.common.RedisKeyUtil;
  10. import com.fdkankan.manage.common.ResultCode;
  11. import com.fdkankan.manage.entity.User;
  12. import com.fdkankan.manage.exception.BusinessException;
  13. import com.fdkankan.manage.service.ISysUserService;
  14. import com.fdkankan.manage.service.IUserService;
  15. import com.fdkankan.manage.vo.request.ManageLoginRequest;
  16. import com.fdkankan.manage.vo.response.ManageLoginResponse;
  17. import com.fdkankan.redis.constant.RedisKey;
  18. import com.fdkankan.redis.util.RedisUtil;
  19. import org.apache.commons.lang3.StringUtils;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import javax.servlet.http.HttpServletRequest;
  23. import java.util.List;
  24. @Service
  25. public class ManageService {
  26. @Autowired
  27. ISysUserService sysUserService;
  28. @Autowired
  29. IUserService userService;
  30. @Autowired
  31. RedisUtil redisUtil;
  32. public ManageLoginResponse login(String ip,String userName, String password) {
  33. this.checkLoginNum(ip,userName);
  34. if(StringUtils.isBlank(userName) || StringUtils.isBlank(password)){
  35. throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS);
  36. }
  37. //对前端传的密码解密
  38. String passwordMd5 = SecurityUtil.MD52(Base64Converter.decode(Base64Converter.subText(password)));
  39. ManageLoginResponse result = sysUserService.getUserByUserNameAndPassword(userName, passwordMd5);
  40. if(result == null){
  41. this.addLoginErrorNum(ip,userName);
  42. throw new BusinessException(ResultCode.PASSWORD_ERROR);
  43. }
  44. if(result.getStatus() == 0){
  45. throw new BusinessException(ResultCode.USERNAME_ERROR);
  46. }
  47. List<User> byUserName = userService.getByUserName(result.getUserName());
  48. if(byUserName.size() <=0){
  49. throw new BusinessException(ResultCode.USERNAME_ERROR);
  50. }
  51. User user = byUserName.get(0);
  52. StpUtil.login(result.getId(), SaLoginConfig
  53. .setExtra("id",result.getId())
  54. .setExtra("userId",user.getId())
  55. .setExtra("isAdmin",1)
  56. .setExtra("userName",result.getUserName())
  57. .setExtra("nickName",result.getNickName()));
  58. result.setToken(StpUtil.getTokenValue());
  59. result.setUserId(user.getId());
  60. redisUtil.set(String.format(RedisKeyUtil.loginToken ,result.getToken()), JSONObject.toJSONString(result), 2*60*60);
  61. String redisUserNameKey = String.format(RedisKeyUtil.loginUserName, userName);
  62. redisUtil.lRightPush(redisUserNameKey,result.getToken());
  63. return result;
  64. }
  65. public void logout() {
  66. redisUtil.del(String.format(RedisKeyUtil.loginToken ,StpUtil.getTokenValue()));
  67. StpUtil.logout();
  68. }
  69. public void checkLoginNum(String ip, String userName) {
  70. if(StringUtils.isNotBlank(userName)){
  71. String redisKey = String.format(RedisKeyUtil.loginNum,userName,ip);
  72. if(redisUtil.hasKey(redisKey)){
  73. String value = redisUtil.get(redisKey);
  74. if("5".equals(value)){
  75. throw new BusinessException(ResultCode.LOGIN_NUM_MUCH);
  76. }
  77. }
  78. }
  79. }
  80. public void addLoginErrorNum(String ip, String userName) {
  81. if(StringUtils.isNotBlank(userName)){
  82. String redisKey = String.format(RedisKeyUtil.loginNum,userName,ip);
  83. if(redisUtil.hasKey(redisKey)){
  84. String value = redisUtil.get(redisKey);
  85. if("5".equals(value)){
  86. throw new BusinessException(ResultCode.LOGIN_NUM_MUCH);
  87. }
  88. Integer num = Integer.parseInt(value) + 1;
  89. redisUtil.set(redisKey,num.toString(),60 * 5);
  90. }else {
  91. redisUtil.set(redisKey,"1",60 * 5);
  92. }
  93. }
  94. }
  95. public void updateLoginUserStatus(String userName,Integer status) {
  96. String redisUserNameKey = String.format(RedisKeyUtil.loginUserName, userName);
  97. List<String> list = redisUtil.hgetValues(redisUserNameKey);
  98. if(list != null && list.size() >0){
  99. for (String token : list) {
  100. String redisKey = String.format(RedisKeyUtil.loginToken, token);
  101. String userStr = redisUtil.get(redisKey);
  102. ManageLoginResponse result = JSONObject.parseObject(userStr,ManageLoginResponse.class);
  103. result.setStatus(status);
  104. redisUtil.set(redisKey,JSONObject.toJSONString(result), 2*60*60);
  105. }
  106. }
  107. }
  108. }