springboot集成jwt和ssm(springmvc)集成

2020-03-17  本文已影响0人  创奇

JWT官网: https://jwt.io/
JWT(Java版)的github地址:https://github.com/jwtk/jjwt

什么是JWT

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名

注意redis中存储的jwt过期时间要和jwt工具类生成的jwt过期时间一致

ssm版本的

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>3.3.0</version>
</dependency>

package com.tale.subject.util;

import java.io.UnsupportedEncodingException;
import java.util.*;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

public class JwtUtil {

    private static String SECRET = "token_666";  // 秘钥(公钥)

    /**
     * 生成token
     * @param id
     * @param username
     * @param type
     * @return
     * @expireTime
     */
    public static String createToken(String id, String username, String type, Date expireTime){
        // 签发时间
        Date iatDate = new Date();

        Map<String, Object> map = new HashMap<String, Object>();
        map.put("alg", "HS256");
        map.put("typ", "JWT");
        String token = null; // 加密
        try {
            System.out.println("token >>id" + id);
            token = JWT.create()
                    .withHeader(map)
                    .withClaim("username", username)
                    .withClaim("id", id)
                                    .withClaim("type", type)
                    .withExpiresAt(experiesDate)  // 设置过期的日期
                    .withIssuedAt(iatDate)        // 签发时间
                    .sign(Algorithm.HMAC256(SECRET));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return token;
    }

    /**
     * 解密
     * @param token
     * @return
     * @throws Exception
     */
    public static Map<String, Claim> verifyToken(String token) {
        JWTVerifier verifier = null;
        try {
            verifier = JWT.require(Algorithm.HMAC256(SECRET)).build();
        } catch (Exception e) {
            e.printStackTrace();
        }

        DecodedJWT jwt = null;

        jwt = verifier.verify(token);  // 核实token

        return jwt.getClaims();  // 这里解密jwt得到的是一个map
    }


}

springboot版本:

 <dependency>
      <groupId>io.jsonwebtoken</groupId>
      <artifactId>jjwt</artifactId>
      <version>0.9.0</version>
</dependency>
package com.gxuwz.spring.demo.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * jwt工具,用于生成jwt和解密jwt
 * jwt主要部分:1.claims(主要用于封装用户信息,及角色)
 * TODO 未处理角色,即对方知道路径但该角色没有权限应该拦截请求
 * 2.加密算法和秘钥
 * 3.过期时间
 */
public class JWTUtil {

    private static final String SECRET = "tale_secret";


    /**
     * 生成jwt
     * @param id 作为唯一标识
     * @param userName 用户名
     * @param role 角色
     * @expireTime 过期时间
     */
    public static String builderJWT(String id, String userName, String role, Date expireTime){
        Map<String, Object> jwtInfo = new HashMap<>();

        jwtInfo.put("id", id);
        jwtInfo.put("userName", userName);
        jwtInfo.put("role", role);

        String jwt = Jwts.builder().setClaims(jwtInfo)
                .setExpiration(expireTime)
                .signWith(SignatureAlgorithm.HS256, SECRET) // 加密算法及秘钥
                .compact();

        return jwt;

    }


    /**
     * 解密jwt
     * @param jwt
     * @return
     */
    public static Claims parseJWT(String jwt){
        Claims claim = Jwts.parser().setSigningKey(SECRET)
                .parseClaimsJwt(jwt).getBody();

        return claim;

    }

}


redis方法

/**
     * 存储jwt
     * @param key
     * @param value
     * @param expireTime
     */
    public boolean setToken(String key, Object value, long expireTime) {
        try {
            redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);

        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
        
        return true;
    }

在登录时生成jwt并存储jwt到redis,登录方法这里就不贴了

注意redis中存储的jwt过期时间要和生成的jwt过期时间一致

jwt拦截器验证

上一篇下一篇

猜你喜欢

热点阅读