1. 程式人生 > 其它 >為Docker容器中的服務設定固定IP並訪問

為Docker容器中的服務設定固定IP並訪問

登入流程

首先根據使用者名稱密碼對使用者進行匹配,如果能匹配通過表示登入成功
由於密碼是由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);
    }