redistoken的信息获取问题

redistoken的信息获取问题

1、我注意到老师代码里redistoken的部分如下,使用前缀+userId作为key,token(也就是UUID)作为值传输给前端。可是token的作用应该是用来拿到userId的吧,既然userId作为key了,而Redis中又没有按value查找key的接口,那么我们只有token的情况下,要怎么在服务端获取到用户信息或者userId呢?
2、还有一个问题就是后面老师在做JWT的时候,将数据库中的User对象查出来以后,没有做任何处理直接放入jwt了,可是jwt的payload是不安全的,用户随时可以解密出来,而这一部分信息里面包含了密码和盐,这是不是不太安全?

    @PostMapping("login")
    public GraceJSONResult login(@Valid @RequestBody RegistLoginBO registLoginBO,
                                      HttpServletRequest request) throws Exception {

        String mobile = registLoginBO.getMobile();
        String code = registLoginBO.getSmsCode();

        // 1. 从redis中获得验证码进行校验判断是否匹配
        String redisCode = redis.get(MOBILE_SMSCODE + ":" + mobile);
        if (StringUtils.isBlank(redisCode) || !redisCode.equalsIgnoreCase(code)) {
            return GraceJSONResult.errorCustom(ResponseStatusEnum.SMS_CODE_ERROR);
        }

        // 2. 根据mobile查询数据库,判断用户是否存在
        Users user = usersService.queryMobileIsExist(mobile);
        if (user == null) {
            // 2.1 如果查询的用户为空,则表示没有注册过,则需要注册信息入库
            user = usersService.createUsers(mobile);
        }

         //3. 保存用户token,分布式会话到redis中
        String uToken = TOKEN_USER_PREFIX + SYMBOL_DOT + UUID.randomUUID().toString();
        redis.set(REDIS_USER_TOKEN + ":" + user.getId(), uToken);
        

        // 4. 用户登录注册以后,删除redis中的短信验证码
        redis.del(MOBILE_SMSCODE + ":" + mobile);

        // 5. 返回用户的信息给前端
        UsersVO usersVO = new UsersVO();
        BeanUtils.copyProperties(user, usersVO);
        usersVO.setUserToken(uToken);

        return GraceJSONResult.ok(usersVO);
    }

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

这里是没有存的,以前别的实战是存的用户信息。

你可以存一下的。

这边我的设计是这样的: 因为用户端是手机端,他的本地缓存要强于浏览器,所以用户一部分数据直接缓存在手机上的。如果要最新用户数据则可以后端查询一下。

另外浏览器的运营平台和企业后台是通过jwt中放的用户信息,也是可以拿到的。

另外用户会话不是一定要存用户信息,他不像httpsession那样的,存一个加密的或者随机的字符窜其实都可以的~~哈哈哈哈

  • 曹学习 提问者 #1

    这样的话就是userId直接在UserVO中返回给前端,被前端缓存下来了。下一次如果要获取的话,就用缓存中的userId+header中的redistoken去请求后端,后端通过userId拼接完redis的key之后,从redis中根据key拿到value,也就是token值,然后对比和header中的是否一样。如果一样的话就确认身份,如果不一样就返回错误吗?

    还有就是前面提到的jwt的问题,也希望老师解答一下😁

    2022-11-22 10:22:09
  • 嗯是的。 Jwt那个最好可以自己做个加密在放到jwt里。我是偷懒了,哈哈哈哈。另外密码我记得没有放,非必要属性字段可以忽略的
    2022-11-22 12:09:49
  • 曹学习 提问者 回复 风间影月 #3

    另外密码我记得没有放,非必要属性字段可以忽略的

    这个我看错了,app端是没有的,admin管理端是把密码和salt放在token里面了,不知道在admin端这样做会不会有风险

    2022-11-22 19:12:43
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java高级工程师
  • 参与学习       412    人
  • 解答问题       306    个

通过一个大型项目贯穿,掌握主流技术栈,提升技术广度与深度 实现复杂度极高的招聘业务,用户端+企业端+SaaS平台全覆盖 构建技术+业务+工程实战+就业服务闭环,实现从初中级到高级工程师的跨越!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师