• Spring Boot 整合 JWT


    1、JWT 是什么?

    JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名。

    简单来说,就是通过一定规范来生成 token,然后可以通过解密算法逆向解密 token,这样就可以获取用户信息。

    优点:

    1)生产的 token 可以包含基本信息,比如 id、用户昵称、头像等信息,避免再次查库

    2)存储在客户端,不占用服务端的内存资源

    缺点:

    token 是经过 base64 编码,所以可以解码,因此 token 加密前的对象不应该包含敏感信息,如用户权限,密码等

    2、JWT 格式组成:头部、负载、签名

    header+payload+signature

    头部:主要是描述签名算法

    负载:主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西,如 iss 签发者,exp 过期时间,sub 面向的用户

    签名:主要是把前面两部分进行加密,防止别人拿到 token 进行 base 解密后篡改 token

    3、关于jwt客户端存储

    可以存储在 Cookie,localStorage 和 sessionStorage 里面

    4、引入相关依赖并开发 JWT 工具类

    1)引入依赖

    <!-- JWT相关 -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.7.0</version>
    </dependency>

    2)开发生产 token 方法

    3)开发检验 token 方法

    package com.haitaiinc.clinicpathservice.utils;
    
    import com.haitaiinc.clinicpathservice.entity.UserInfo;
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    import org.springframework.util.StringUtils;
    
    import java.util.Date;
    
    public class JwtUtils {
        public static final String SUBJECT = "admin";
    
        /**
         * 过期时间,毫秒,一周
         */
        public static final long EXPIRE = 1000 * 60 * 60 * 24 * 7;
    
        /**
         * 秘钥
         */
        public static final String APPSECRET = "haitaiinc";
    
        /**
         * 生成jwt
         *
         * @param userInfo
         * @return
         */
        public static String geneJsonWebToken(UserInfo userInfo) {
    
            if (userInfo == null || StringUtils.isEmpty(userInfo.getUserId()) || StringUtils.isEmpty(userInfo.getUserName())) {
                return null;
            }
            String token = Jwts.builder().setSubject(SUBJECT)
                    .claim("id", userInfo.getUserId())
                    .claim("name", userInfo.getUserName())
                    .setIssuedAt(new Date())
                    .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                    .signWith(SignatureAlgorithm.HS256, APPSECRET).compact();
    
            return token;
        }
    
    
        /**
         * 校验token
         *
         * @param token
         * @return
         */
        public static Claims checkJWT(String token) {
    
            try {
                final Claims claims = Jwts.parser().setSigningKey(APPSECRET).
                        parseClaimsJws(token).getBody();
                return claims;
    
            } catch (Exception e) {
            }
            return null;
        }
    }

    4)测试

    package com.haitaiinc.clinicpathservice;
    
    import com.haitaiinc.clinicpathservice.entity.UserInfo;
    import com.haitaiinc.clinicpathservice.utils.JwtUtils;
    import io.jsonwebtoken.Claims;
    import org.junit.jupiter.api.Test;
    
    public class CommonTest {
    
        @Test
        public void testGeneJwt() {
            UserInfo user = new UserInfo();
            user.setUserId("admin");
            user.setUserName("管理员");
    
            String token = JwtUtils.geneJsonWebToken(user);
            System.out.println(token);
    
        }
    
    
        @Test
        public void testCheck() {
            String token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlkIjoiYWRtaW4iLCJuYW1lIjoi566h55CG5ZGYIiwiaWF0IjoxNTc3NTU3MDU1LCJleHAiOjE1NzgxNjE4NTV9.VrrKtCTnxVN76JhpyIusCGq9Wj89wLor0OqIJ6s0zXo";
            Claims claims = JwtUtils.checkJWT(token);
            if (claims != null) {
                String id = (String) claims.get("id");
                String name = (String) claims.get("name");
                System.out.println(id);
                System.out.println(name);
            } else {
                System.out.println("非法token");
            }
        }
    }
  • 相关阅读:
    JavaScript中split() 使用方法
    解决elementui中table表格rowstyle改变当前行样式
    vue项目中使用$.once(‘hook:beforeDestory‘,() => {})清理定时器问题
    js中split()方法和join()方法
    前端报各种提示错误400 等
    Linux 网络编程Socket
    C 语言数组名
    Checksum
    Gcc 编译过程
    Nodejs爬取壁纸接口数据
  • 原文地址:https://www.cnblogs.com/jwen1994/p/12113888.html
Copyright © 2020-2023  润新知