From 08f1b1f1804a8bd833d42f257908d80e88387b55 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期五, 14 三月 2025 11:27:47 +0800 Subject: [PATCH] 3.5增加登录验证、修改密码、人员列表调整 --- springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java | 83 +++++++++++++++++++++++++++++++---------- 1 files changed, 63 insertions(+), 20 deletions(-) diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java index 834a67b..49e23eb 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java @@ -12,6 +12,7 @@ import com.panzhihua.sangeshenbian.model.entity.SystemRoleMenu; import com.panzhihua.sangeshenbian.model.entity.SystemUser; import com.panzhihua.sangeshenbian.model.vo.RegionVO; +import com.panzhihua.sangeshenbian.model.vo.UpdatePasswordDTO; import com.panzhihua.sangeshenbian.service.ISystemMenuService; import com.panzhihua.sangeshenbian.service.ISystemRoleMenuService; import com.panzhihua.sangeshenbian.service.ISystemUserService; @@ -27,9 +28,11 @@ import org.springframework.beans.BeanUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.util.ObjectUtils; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.validation.Valid; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; @@ -41,6 +44,7 @@ */ @Api @Slf4j +@Valid @RestController @RequestMapping("/systemUser") public class SystemUserController extends BaseController { @@ -54,7 +58,10 @@ @Resource private TokenService tokenService; - private final Integer max_err = 5; + // 添加错误次数和冻结时间常量 + private static final Integer LOCK_ERR = 5; // 锁定账号的错误次数 + private static final Integer FREEZE_ERR = 3; // 冻结账号的错误次数 + private static final Integer FREEZE_MINUTES = 3; // 冻结时间(分钟) @Resource private ISystemRoleMenuService systemRoleMenuService; @@ -71,31 +78,60 @@ @OperLog(operModul = "三个身边后台",operType = 0,businessType = "登录") public R<TokenVo> login(@RequestBody LoginVo vo){ String key = "login:" + vo.getPhone(); - Integer size = (Integer) redisTemplate.opsForValue().get(key); - if(null != size && max_err.equals(size)){ - return R.fail("连续登录失败,请稍后重试。"); - } - if(null == size){ - size = 0; - } + SystemUser systemUser = systemUserService.getOne(new LambdaQueryWrapper<SystemUser>() - .eq(SystemUser::getPhone, vo.getPhone()).ne(SystemUser::getStatus, 3)); + .eq(SystemUser::getPhone, vo.getPhone()) + .ne(SystemUser::getStatus, 3)); + if(null == systemUser){ - size++; - redisTemplate.opsForValue().set(key, size, 5, TimeUnit.MINUTES); return R.fail("登录失败,手机号/密码错误。"); } - if(!vo.getPassword().equals(systemUser.getPassword())){ - size++; - redisTemplate.opsForValue().set(key, size, 5, TimeUnit.MINUTES); - return R.fail("登录失败,手机号/密码错误。"); + + // 检查用户是否已被锁定 + if(4 == systemUser.getStatus()){ + return R.fail("密码连续输入错误五次,账号已被锁定,请联系管理员解锁。"); } + + // 检查用户是否已被冻结 if(2 == systemUser.getStatus()){ return R.fail("当前账号已冻结。"); } - //创建token + + // 检查是否在临时冻结期 + Integer errorCount = (Integer) redisTemplate.opsForValue().get(key); + if(null != errorCount && FREEZE_ERR <= errorCount && errorCount < LOCK_ERR){ + return R.fail("密码连续输入错误三次,账号已被冻结" + FREEZE_MINUTES + "分钟。"); + } + + if(null == errorCount){ + errorCount = 0; + } + + if(!vo.getPassword().equals(systemUser.getPassword())){ + errorCount++; + + // 达到锁定次数,更新用户状态为锁定 + if(errorCount >= LOCK_ERR) { + systemUser.setStatus(4); // 4表示账号锁定 + systemUserService.updateById(systemUser); + redisTemplate.delete(key); // 清除redis中的错误计数 + return R.fail("密码连续输入错误五次,账号已被锁定,请联系管理员解锁。"); + } + // 达到冻结次数 + else if(errorCount == FREEZE_ERR) { + redisTemplate.opsForValue().set(key, errorCount, FREEZE_MINUTES, TimeUnit.MINUTES); + return R.fail("密码连续输入错误三次,账号已被冻结" + FREEZE_MINUTES + "分钟。"); + } + // 普通错误 + else { + redisTemplate.opsForValue().set(key, errorCount, 5, TimeUnit.MINUTES); + return R.fail("登录失败,手机号/密码错误。"); + } + } + + //登录成功,创建token R<LoginReturnVO> reult = tokenService.loginThreeAround(systemUser.getId()); - redisTemplate.delete(key); + redisTemplate.delete(key); // 清除错误计数 LoginReturnVO loginReturnVO = reult.getData(); TokenVo tokenVo = new TokenVo(); BeanUtils.copyProperties(loginReturnVO, tokenVo); @@ -273,14 +309,14 @@ @PutMapping("/unfreeze/{id}") - @ApiOperation(value = "解冻账号", tags = {"三个身边后台-人员管理"}) - @OperLog(operModul = "三个身边后台",operType = 2,businessType = "解冻账号") + @ApiOperation(value = "解冻/解锁账号", tags = {"三个身边后台-人员管理"}) + @OperLog(operModul = "三个身边后台",operType = 2,businessType = "解冻/解锁账号") public R unfreeze(@PathVariable("id") Integer id){ SystemUser systemUser = systemUserService.getById(id); if(1 == systemUser.getStatus()){ return R.fail("不能重复操作"); } - systemUser.setStatus(1); + systemUser.setStatus(1); // 将冻结(2)或锁定(4)状态恢复为正常状态(1) systemUserService.updateById(systemUser); return R.ok(); } @@ -333,4 +369,11 @@ log.info("获取行政区划层级联动数据:{}", list); return R.ok(list); } + @ApiOperation(value = "修改密码",tags = {"三个身边后台-人员管理"}) + @PostMapping("/updatePassword") + public R<?> updatePassword(@RequestBody @Validated UpdatePasswordDTO dto) { + SystemUserVo loginUserInfoSanGeShenBian = getLoginUserInfoSanGeShenBian(); + systemUserService.updatePassword(dto,loginUserInfoSanGeShenBian); + return R.ok(); + } } -- Gitblit v1.7.1