高并发下账号唯一性安全保证方案
同个时刻注册,需要保证账号在数据库里唯一
- Redis:先看redis是否有,然后没的话则是新的注册
- key -value 存储, 配置60秒过期
- 非原子性操作,存在不一致
- 数据库唯一索引(建表的时间已经添加)
ALTER TABLE user ADD unique(`mail`)
登录解密过程
核心逻辑
- 通过mail找数据库记录
- 获取盐,和当前传递的密码就行加密后匹配
- 生成token令牌
// 请求参数对象
@Data
@ApiModel(value = "登录对象",description = "用户登录请求对象")
public class UserLoginRequest {
@ApiModelProperty(value = "邮箱", example = "794666918@qq.com")
private String mail;
@ApiModelProperty(value = "密码", example = "123456")
private String pwd;
}
// 控制器
@ApiOperation("用户登录")
@PostMapping("login")
public JsonData login(@ApiParam("用户登录对象") @RequestBody UserLoginRequest userLoginRequest){
return userService.login(userLoginRequest);
}
// 解密逻辑
@Override
public JsonData login(UserLoginRequest loginRequest) {
List<UserDO> list = userMapper.selectList(
new QueryWrapper<UserDO>().eq("mail", loginRequest.getMail()));
if (list != null && list.size() == 1) {
UserDO userDO = list.get(0);
String cryptPwd = Md5Crypt.md5Crypt(loginRequest.getPwd().getBytes(), userDO.getSecret());
if (cryptPwd.equals(userDO.getPwd())) {
//生成token令牌
return JsonData.buildSuccess();
}
//密码错误
return JsonData.buildResult(BizCodeEnum.ACCOUNT_PWD_ERROR);
} else {
//未注册
return JsonData.buildResult(BizCodeEnum.ACCOUNT_UNREGISTER);
}
}