15| 高并发下账号唯一性及解密过程

2024-08-05 · · 原创 · · 本文共 151个字,预计阅读需要 1分钟。

高并发下账号唯一性安全保证方案

同个时刻注册,需要保证账号在数据库里唯一

  • Redis:先看redis是否有,然后没的话则是新的注册
    • key -value 存储, 配置60秒过期
    • 非原子性操作,存在不一致
  • 数据库唯一索引(建表的时间已经添加)
  1. ALTER TABLE user ADD unique(`mail`)

登录解密过程

核心逻辑

  • 通过mail找数据库记录
  • 获取盐,和当前传递的密码就行加密后匹配
  • 生成token令牌
  1. // 请求参数对象
  2. @Data
  3. @ApiModel(value = "登录对象",description = "用户登录请求对象")
  4. public class UserLoginRequest {
  5. @ApiModelProperty(value = "邮箱", example = "794666918@qq.com")
  6. private String mail;
  7. @ApiModelProperty(value = "密码", example = "123456")
  8. private String pwd;
  9. }
  10. // 控制器
  11. @ApiOperation("用户登录")
  12. @PostMapping("login")
  13. public JsonData login(@ApiParam("用户登录对象") @RequestBody UserLoginRequest userLoginRequest){
  14. return userService.login(userLoginRequest);
  15. }
  16. // 解密逻辑
  17. @Override
  18. public JsonData login(UserLoginRequest loginRequest) {
  19. List<UserDO> list = userMapper.selectList(
  20. new QueryWrapper<UserDO>().eq("mail", loginRequest.getMail()));
  21. if (list != null && list.size() == 1) {
  22. UserDO userDO = list.get(0);
  23. String cryptPwd = Md5Crypt.md5Crypt(loginRequest.getPwd().getBytes(), userDO.getSecret());
  24. if (cryptPwd.equals(userDO.getPwd())) {
  25. //生成token令牌
  26. return JsonData.buildSuccess();
  27. }
  28. //密码错误
  29. return JsonData.buildResult(BizCodeEnum.ACCOUNT_PWD_ERROR);
  30. } else {
  31. //未注册
  32. return JsonData.buildResult(BizCodeEnum.ACCOUNT_UNREGISTER);
  33. }
  34. }