SpringBoot——JWTtoken

1.JWT

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

2.优点

1.无状态
2.有效避免了CSRF 攻击(跨站请求伪造,属于网络攻击领域范围)
3.适合移动端应用
4.单点登录友好(SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。)

@Slf4j
public class JwtUtil {


    //过期时间 30min
    private static final int EXPIRE_TIME = 30;
    //私钥
    private static final String TOKEN_SECRET = "privateKey";
    //可以自定义

    /**
     *      签发对象:这个用户的id
     *      签发时间:现在
     *      有效时间:30分钟
     *      载荷内容:暂时设计为:这个人的名字
     *      加密密钥:这个人的id加上一串字符串
     * @param userId
     * @return
     */
    public static String createToken(Long userId,List<String> authStrList) {

        // 算出一个超时的时间
        Calendar nowTime = Calendar.getInstance();
        nowTime.add(Calendar.MINUTE,EXPIRE_TIME);
        Date expiresDate = nowTime.getTime();

        return JWT.create()
                .withAudience(userId+"")   //签发对象
                .withIssuedAt(new Date())    //发行时间
                .withExpiresAt(expiresDate)  //有效时间
                // authStrList=> 转json 存储   => 尝试fastjson(阿里开源的一个json转化工具)
//                .withClaim(USER_NAME, userName)    //载荷,随便写几个都可以
                .sign(Algorithm.HMAC256(userId+TOKEN_SECRET));   //加密
    }
    /**
     * 检验合法性,其中secret参数就应该传入的是用户的id
     * @param token
     */
    public static boolean verifyToken(String token, String secret){
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secret+TOKEN_SECRET)).build();
            verifier.verify(token);
        } catch (Exception e) {
            //效验失败
            //自定义的一个异常
            log.error("token校验失败",e);
            return false;
        }
        return true;
    }
    /**
     * 获取签发对象 => userId
     */
    public static String getAudience(String token){
        String audience = null;
        try {
            audience = JWT.decode(token).getAudience().get(0);
        } catch (JWTDecodeException j) {
            //这里是token解析失败
            log.error("token解析失败",j);
            return null;
        }
        return audience;
    }

    /**
     * 获取签发对象 => userId
     */
    public static List<String> getClaim(String token, String key){
        try {
            Claim claim = JWT.decode(token).getClaim("key");
            // 转化成对应类型  。。。

        } catch (JWTDecodeException j) {
            //这里是token解析失败
            log.error("token解析失败",j);
            return null;
        }
        return null;
    }

}

3.使用

在登录controller中,其中要注意你的user必须有token这个属性

  // 视图字段:用户令牌信息
    @TableField(exist=false)
    private String token;
    // 视图字段:权限信息
     @TableField(exist=false)
    private List<String> authStrList;

        List<String> authStrList = userService.getAuthStrListByUserId(userDb.getId());
        // 权限信息存储到用户信息中
        userDb.setAuthStrList(authStrList);
        String token = JwtUtil.createToken(userDb.getId(),authStrList);
        userDb.setToken(token);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值