Java新手村 2024-12-09 14:40 采纳率: 50%
浏览 39

用户登录redis中缓存token还是username

今天写了一个登录接口,jwt生成token后对于在redis中存入token还是username有点疑惑,想请工作后的程序员给我解答一下这个问题,大家看过代码后我再叙述我的问题,首先是服务层


public String login(User user) {
        //参数验证
        if (ObjectUtils.isEmpty(user)) {
            return "请输入账号密码";
        }
        String username = user.getUserName();
        String password = user.getPassword();
        if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) {
            return "账号或密码为空";
        }

        //验证账号密码,密码使用MD5加密
        String md5String = JwtHelper.getMd5String(password);

        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getUserName, username)
                .eq(User::getPassword, md5String);
        User users = this.getBaseMapper().selectOne(wrapper);
        if (ObjectUtils.isEmpty(users)){
            return "账号密码错误或用户不存在";
        }
        //生成token
        String token = JWT.create()
                .withSubject(username)
                .withExpiresAt(new Date(System.currentTimeMillis() + expirationTime))
                .sign(Algorithm.HMAC256(secretKey));

//        String token = JwtHelper.createToken(username,secretKey, expirationTime);
        //缓存用户信息到redis
        redisUtil.setEx(token,users,expirationTime);
        //响应token到前端
        return token;
    }

然后是JwtHelper工具类

 //生成token
    public static String createToken(String username,String tokenSignKey,long tokenExpiration) {

        //过期时间和加密算法设置
        Date date=new Date(System.currentTimeMillis()+tokenExpiration);
        Algorithm algorithm = Algorithm.HMAC256(tokenSignKey);


        //头部信息
        Map<String,Object> header=new HashMap<>(2);
        header.put("typ","JWT");
        header.put("alg","HS256");

        return JWT.create()
                .withHeader(header)
                .withClaim("username",username)
                .withExpiresAt(date)
                .sign(algorithm);
    }

    public static String getUserName(String token,String tokenSignKey){
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(tokenSignKey)).build().verify(token);
        return verify.getClaim("username").asString();
    }


    public static String getMd5String(String string) {
        if (StringUtils.isEmpty(string)) {
            return null;
        }
        return MD5.create().digestHex(string);
    }
}

我的问题是为什么我的一个程序员朋友建议我在redis中存入token而不是存入username呢?
我理解的意思是使用jwt来生成token,此时要前端或者说客户端在登录过后会在客户端保存有这个token的。 同时存一个token到redis,这样客户端在使用其他请求时携带这个token和redis中的token进行比对来授权。 但是这里我就有疑问了,因为客户端是有token的,假设我redis中存入的是username字段,这样再写一个token解析的方法,这样客户端在使用其他请求时,需要先将客户端的token通过解密算法拿到username,再和redis中存入的username进行比对,这样做多了一个解密的过程,不是更安全吗,为什么开发中一般不这样写呢,我不明白。 我问ai将的是在redis中存入token而不是username,少写那个解析token的方法,可以节省性能。 但是我认为在这个过程中不是更应该注重安全性吗,而不是为了哪一点性能? 对此不是很懂,请大家工作过的能给我解答一下这个疑问,谢谢大家

  • 写回答

1条回答 默认 最新

  • bingbingyihao 2024-12-09 21:20
    关注

    回答:JWT生成的token本身就是有一定的安全性的,不可被修改,其次,这个token相当于是一种身份凭证,一般是不能给别人的,还有最后一点,那就是这个token是有时效的,安全性更多的会在业务方面去限制,单从token来说,目前的JWT已经够用了

    评论

报告相同问题?

问题事件

  • 创建了问题 12月9日