用户登录

登录流程

首先根据用户名密码对用户进行匹配,如果能匹配通过表示登录成功
由于密码是由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);
    }
posted @   RainbowMagic  阅读(798)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示