SysRegisterService.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package org.eco.web.service;
  2. import cn.dev33.satoken.secure.BCrypt;
  3. import org.eco.common.core.constant.Constants;
  4. import org.eco.common.core.constant.GlobalConstants;
  5. import org.eco.common.core.core.domain.model.RegisterBody;
  6. import org.eco.common.core.enums.UserType;
  7. import org.eco.common.core.exception.user.CaptchaException;
  8. import org.eco.common.core.exception.user.CaptchaExpireException;
  9. import org.eco.common.core.exception.user.UserException;
  10. import org.eco.common.core.utils.MessageUtils;
  11. import org.eco.common.core.utils.ServletUtils;
  12. import org.eco.common.core.utils.SpringUtils;
  13. import org.eco.common.core.utils.StringUtils;
  14. import org.eco.common.log.event.LogininforEvent;
  15. import org.eco.common.redis.utils.RedisUtils;
  16. import org.eco.common.web.config.properties.CaptchaProperties;
  17. import org.eco.system.domain.bo.SysUserBo;
  18. import org.eco.system.service.ISysConfigService;
  19. import org.eco.system.service.ISysUserService;
  20. import jakarta.annotation.Resource;
  21. import lombok.RequiredArgsConstructor;
  22. import org.springframework.stereotype.Service;
  23. /**
  24. * 注册校验方法
  25. *
  26. * @author wgk
  27. */
  28. @RequiredArgsConstructor
  29. @Service
  30. public class SysRegisterService {
  31. private final CaptchaProperties captchaProperties;
  32. @Resource
  33. private ISysUserService userService;
  34. @Resource
  35. private ISysConfigService configService;
  36. /**
  37. * 注册
  38. */
  39. public void register(RegisterBody registerBody) {
  40. Long tenantId = registerBody.getTenantId();
  41. String username = registerBody.getUsername();
  42. String password = registerBody.getPassword();
  43. // 校验用户类型是否存在
  44. String userType = UserType.getUserType(registerBody.getUserType()).getUserType();
  45. boolean captchaEnabled = captchaProperties.getEnable();
  46. // 验证码开关
  47. if (captchaEnabled) {
  48. validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid());
  49. }
  50. SysUserBo sysUser = new SysUserBo();
  51. sysUser.setUserName(username);
  52. sysUser.setNickName(username);
  53. sysUser.setPassword(BCrypt.hashpw(password));
  54. sysUser.setUserType(userType);
  55. if (!userService.checkUserNameUnique(sysUser)) {
  56. throw new UserException("user.register.save.error", username);
  57. }
  58. boolean regFlag = userService.registerUser(sysUser, tenantId);
  59. if (!regFlag) {
  60. throw new UserException("user.register.error");
  61. }
  62. recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
  63. }
  64. /**
  65. * 校验验证码
  66. *
  67. * @param tenantId 租户ID
  68. * @param username 用户名
  69. * @param code 验证码
  70. * @param uuid 唯一标识
  71. */
  72. public void validateCaptcha(Long tenantId, String username, String code, String uuid) {
  73. String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, "");
  74. String captcha = RedisUtils.getCacheObject(verifyKey);
  75. RedisUtils.deleteObject(verifyKey);
  76. if (captcha == null) {
  77. recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.expire"));
  78. throw new CaptchaExpireException();
  79. }
  80. if (!code.equalsIgnoreCase(captcha)) {
  81. recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.jcaptcha.error"));
  82. throw new CaptchaException();
  83. }
  84. }
  85. /**
  86. * 记录登录信息
  87. *
  88. * @param tenantId 租户ID
  89. * @param username 用户名
  90. * @param status 状态
  91. * @param message 消息内容
  92. * @return
  93. */
  94. private void recordLogininfor(Long tenantId, String username, String status, String message) {
  95. LogininforEvent logininforEvent = new LogininforEvent();
  96. logininforEvent.setTenantId(tenantId);
  97. logininforEvent.setUsername(username);
  98. logininforEvent.setStatus(status);
  99. logininforEvent.setMessage(message);
  100. logininforEvent.setRequest(ServletUtils.getRequest());
  101. SpringUtils.context().publishEvent(logininforEvent);
  102. }
  103. }