code review 修改密码等的单元测试

This commit is contained in:
YunaiV
2021-11-21 12:05:34 +08:00
parent 42ce5c75fd
commit e2b76ee0e5
12 changed files with 25 additions and 20 deletions

View File

@@ -70,6 +70,7 @@ public class SysUserProfileController {
@PreAuthenticated
public CommonResult<Boolean> updateMobile(@RequestBody @Valid MbrUserUpdateMobileReqVO reqVO) {
// 校验验证码
// TODO @宋天:统一到 userService.updateMobile 方法里
smsCodeService.useSmsCode(reqVO.getMobile(),SysSmsSceneEnum.CHANGE_MOBILE_BY_SMS.getScene(), reqVO.getCode(),getClientIP());
userService.updateMobile(getLoginUserId(), reqVO);

View File

@@ -25,9 +25,9 @@ public class MbrUserUpdateMobileReqVO {
@Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字")
private String code;
@ApiModelProperty(value = "手机号",required = true,example = "15823654487")
@NotBlank(message = "手机号不能为空")
// TODO @宋天:手机校验,直接使用 @Mobile 哈
@Length(min = 8, max = 11, message = "手机号码长度为 8-11 位")
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式错误")
private String mobile;

View File

@@ -126,8 +126,10 @@ public class MbrUserServiceImpl implements MbrUserService {
// 检测用户是否存在
MbrUserDO userDO = checkUserExists(userId);
// 检测手机与验证码是否匹配
// TODO @宋天:修改手机的时候。应该要校验,老手机 + 老手机 code新手机 + 新手机 code
sysAuthService.checkIfMobileMatchCodeAndDeleteCode(userDO.getMobile(),reqVO.getCode());
// 更新用户手机
// TODO @宋天:更新的时候,单独创建对象。直接全量更新,会可能导致属性覆盖。可以看看打印出来的 SQL 哈
userDO.setMobile(reqVO.getMobile());
userMapper.updateById(userDO);
}

View File

@@ -98,6 +98,7 @@ public class SysAuthController {
@ApiOperation(value = "校验验证码是否正确")
@PreAuthenticated
public CommonResult<Boolean> checkSmsCode(@RequestBody @Valid SysAuthSmsLoginReqVO reqVO) {
// TODO @宋天check 的时候,不应该使用 useSmsCode 哈这样验证码就直接被使用了。另外check 开头的方法,更多是校验的逻辑,不会有 update 数据的动作。这点,在方法命名上,也是要注意的
smsCodeService.useSmsCode(reqVO.getMobile(),SysSmsSceneEnum.CHECK_CODE_BY_SMS.getScene(),reqVO.getCode(),getClientIP());
return success(true);
}

View File

@@ -8,7 +8,6 @@ import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
@@ -29,4 +28,5 @@ public class MbrAuthResetPasswordReqVO {
@Length(min = 4, max = 6, message = "手机验证码长度为 4-6 位")
@Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字")
private String code;
}

View File

@@ -285,6 +285,7 @@ public class SysAuthServiceImpl implements SysAuthService {
MbrUserDO userDO = checkOldPassword(userId, reqVO.getOldPassword());
// 更新用户密码
// TODO @宋天:不要更新整个对象哈
userDO.setPassword(passwordEncoder.encode(reqVO.getPassword()));
userMapper.updateById(userDO);
}
@@ -300,6 +301,8 @@ public class SysAuthServiceImpl implements SysAuthService {
// TODO @芋艿 这一步没必要检验验证码与手机是否匹配因为是根据验证码去redis中查找手机号然后根据手机号查询用户
// 也就是说 即便黑客以其他方式将验证码发送到自己手机上,最终还是会根据手机号查询用户然后进行重置密码的操作,不存在安全问题
// TODO @宋天:这块微信在讨论下哈~~~
// 校验验证码
smsCodeService.useSmsCode(userDO.getMobile(), SysSmsSceneEnum.FORGET_MOBILE_BY_SMS.getScene(), reqVO.getCode(),getClientIP());

View File

@@ -58,10 +58,14 @@ public class SysSmsCodeServiceImpl implements SysSmsCodeService {
// 创建验证码
String code = this.createSmsCode(mobile, scene, createIp);
// 发送验证码
// TODO @宋天:这里可以拓展下 SysSmsSceneEnum支持设置对应的短信模板编号不同场景的短信文案是不同的)、是否要校验手机号已经注册。这样 Controller 就可以收口成一个接口了。相当于说,不同场景,不同策略
smsCoreService.sendSingleSmsToMember(mobile, null, SysSmsTemplateCodeConstants.USER_SMS_LOGIN,
MapUtil.of("code", code));
// 存储手机号与验证码到redis用于标记
// TODO @宋天SysSmsCodeDO 表应该足够,无需增加额外的 redis 存储哇
// TODO @宋天Redis 相关的操作,不要散落到业务层,而是写一个它对应的 RedisDAO。这样实现业务与技术的解耦
// TODO @宋天:直接使用 code 作为 key会存在 2 个问题1code 可能会冲突多个手机号之间2缺少前缀。例如说 sms_code_${code}
stringRedisTemplate.opsForValue().set(code,mobile,CODE_TIME, TimeUnit.MINUTES);
}