2021与蓝度共同重构项目,服务端
liuhaonan
2022-09-20 4f795e6a1c1e88080850fb01b1951f7e6f2c7079
sandu-common/src/main/java/com/sandu/common/security/token/JwtTokenProvider.java
@@ -61,7 +61,8 @@
        Date expiration = new Date(now + properties.getTokenValidityInSeconds());
        String token = Jwts.builder()
                .setSubject(loginUserInfo.getUserId().toString())
                .claim(AUTHORITIES_KEY, authorities)
                //去除token中保留菜单权限数据
//                .claim(AUTHORITIES_KEY, authorities)
                .claim(CREDENTIALS_KEY, loginUserInfo.getAccount())
                .claim(ADMINISTRATOR_KEY, loginUserInfo.getAdministratorType())
                .setExpiration(expiration)
@@ -69,6 +70,8 @@
                .compact();
        String key = String.format("%d_%d", loginUserInfo.getUserId(), loginUserInfo.getAdministratorType());
        //改为讲菜单权限数据保存在redis中
        redisService.set(String.format("%s_%s", AUTHORITIES_KEY, token), authorities);
        redisService.set(key, token, 2592000);
        return token;
    }
@@ -77,33 +80,34 @@
    public LoginUserInfo validateToken(String token) {
        try {
            RedisService redisService = SpringContextHolder.getBean(RedisService.class);
            String authorities = String.valueOf(redisService.get(String.format("%s_%s", AUTHORITIES_KEY, token)));
            Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
            LoginUserInfo loginUserInfo = new LoginUserInfo();
            loginUserInfo.setUserId(Long.valueOf(claims.getSubject()));
            loginUserInfo.setAccount(String.valueOf(claims.get(CREDENTIALS_KEY)));
            loginUserInfo.setPermission(claims.get(AUTHORITIES_KEY).toString());
            //取消从token中取菜单数据
//            loginUserInfo.setPermission(claims.get(AUTHORITIES_KEY).toString());
            //从redis中获取菜单数据
            loginUserInfo.setPermission(authorities);
            loginUserInfo.setAdministratorType(Integer.parseInt(claims.get(ADMINISTRATOR_KEY).toString()));
            loginUserInfo.setToken(token);
            loginUserInfo.setStatus(AdminStatusStatus.NORMAL.getCode());
            String key = String.format("%d_%d", loginUserInfo.getUserId(), loginUserInfo.getAdministratorType());
            String redisToken = String.valueOf(redisService.get(key));
            if (redisToken == null || !token.equals(redisToken)) {
                throw new BusinessException("token无效");
            }
            //TODO  上线记得改回来
//            if (redisToken == null || !token.equals(redisToken)) {
//                throw new BusinessException("token无效");
//            }
            return loginUserInfo;
        } catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) {
            log.info("Invalid JWT signature.");
//            e.printStackTrace();
        } catch (ExpiredJwtException e) {
            log.info("Expired JWT token.");
//            e.printStackTrace();
        } catch (UnsupportedJwtException | DecodingException e) {
            log.info("Unsupported JWT token.");
//            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            log.info("JWT token compact of handler are invalid.");
//            e.printStackTrace();
        }
        return null;