用户登录
登录流程
首先根据用户名密码对用户进行匹配,如果能匹配通过表示登录成功
由于密码是由MD5加密算法进行加密的, 所以校验时要对用户密码进行加密然后再进行匹配
登录成功之后将使用UUID生成token用于标识用户已登录状态
之后将token与用户昵称返回到前端中, 前端将token存储到cookie中便于其他服务使用
最后将缓存前缀 + 用户token作为key 将用户id作为value存储到redis中 当其他服务进行访问时 根据传入的token向redis中进行检索,如果检索不到表示未登录或token不合法
为了避免恶意用户盗取token进行伪装访问系统服务, 所以要将登录用户ip保存到redis中, 如果ip不匹配 那么则登录失败
保存用户id的原因是 如果前端存储的用户昵称失效的话, 可以根据缓存中存储的用户id查找到用户信息 之后返回到前端即可
@PostMapping("/login")
public Result login(@RequestBody UserInfo userInfo, HttpServletRequest request) {
UserInfo login = userInfoService.login(userInfo);
if (login != null) {
// 将ip存储至redis中以此来避免恶意用户伪装token
String ip = IpUtil.getIpAddress(request);
HashMap<String, String> resultMap = new HashMap<>();
String token = UUID.randomUUID().toString();
Map<String, Object> tokenValueMap = new HashMap<>();
tokenValueMap.put("ip", ip);
tokenValueMap.put("userId", login.getId());
String tokenValueJson = null;
try {
tokenValueJson = objectMapper.writeValueAsString(tokenValueMap);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
String userToken = UserConstant.USER_TOKEN_CACHE + token;
redisTemplate.opsForValue().set(userToken, tokenValueJson, 30, TimeUnit.DAYS);
resultMap.put("nickName", login.getNickName());
resultMap.put("token", token);
return Result.ok(resultMap);
}
return null;
}
@Override
public UserInfo login(UserInfo userInfo) {
String md5Passwd = DigestUtils.md5DigestAsHex(userInfo.getPasswd().getBytes(StandardCharsets.UTF_8));
QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("login_name", userInfo.getLoginName());
queryWrapper.eq("passwd", md5Passwd);
return userInfoMapper.selectOne(queryWrapper);
}
虽然道路是曲折的,但前途是光明的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律