為Docker容器中的服務設定固定IP並訪問
阿新 • • 發佈:2022-05-10
登入流程
首先根據使用者名稱密碼對使用者進行匹配,如果能匹配通過表示登入成功
由於密碼是由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); }