SysRegisterService.java 4.5 KB

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