首页 > 其他分享 >5、集成SpringSecurity安全框架---jwt工具类

5、集成SpringSecurity安全框架---jwt工具类

时间:2024-08-20 17:19:34浏览次数:12  
标签:return String jwt SpringSecurity --- static import subject ttlMillis

token

导入依赖

<!-- jwt -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
<!-- jdk 9 以后已经移除,使用时需要单独导包 -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>

 

package com.exam.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;

/**
 * JWT 工具类
 */
public class JwtUtil {
    // 有效期,1小时
    public static final Long JWT_TTL = 60 * 60 * 1000L;
    // 设置秘钥铭文(盐)
    public static final String JWT_KEY = "WDsv234s";

    // 生成令牌
    public static String getUUID() {
        String token = UUID.randomUUID().toString().replaceAll("-", "");
        return token;
    }

    /**
     * 生成 jwt
     *
     * @param subject   token中要存放的数据(json格式)
     * @param ttlMillis token超时时间
     * @return
     */
    public static String createJWT(String subject, Long ttlMillis) {
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, getUUID());
        String s = builder.compact();
        return s;
    }

    // 生成JWT 的业务逻辑代码
    private static JwtBuilder getJwtBuilder(String subject, Long ttlMillis, String uuid) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey secretKey = generalKey();
        // 获取到系统当前时间戳
        Long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        if (ttlMillis == null) {
            ttlMillis = JwtUtil.JWT_TTL;
        }
        Long expMillis = nowMillis + ttlMillis;
        Date expDate = new Date(expMillis);
        return Jwts.builder()
                .setId(uuid)        // 唯一的id
                .setSubject(subject)    // 主题 可以是JSON数据
                .setIssuer("xx")        // 签发者
                .setIssuedAt(now)       // 签发时间
                .signWith(signatureAlgorithm, secretKey)    // 使用HS256 加密算法签名,第二个参数为秘钥
                .setExpiration(expDate);
    }

    /**
     * 创建token
     * @param id
     * @param subject
     * @param ttlMillis
     * @return
     */
    public static String createJWT(String id, String subject, Long ttlMillis){
        JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);
        return builder.compact();
    }

    /**
     * 生成加密后的秘钥 secretKry
     * @return
     */
    public static SecretKey generalKey(){
        byte[] encodeKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);
        SecretKey key = new SecretKeySpec(encodeKey, 0, encodeKey.length, "AES");
        return key;
    }

    /**
     * 解析
     * @param jwt
     * @return
     */
    public static Claims parseJWT(String jwt) throws Exception{
        SecretKey secretKey = generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }
}

 

标签:return,String,jwt,SpringSecurity,---,static,import,subject,ttlMillis
From: https://www.cnblogs.com/wangdch/p/18369848

相关文章

  • 6、集成SpringSecurity安全框架---
    不使用自带密码校验,创建BCryptPasswordEncoder注入容器,密码加密1、创建loginUser类,实行 UserDetails接口packagecom.exam.entity;importlombok.AllArgsConstructor;importlombok.Data;importlombok.NoArgsConstructor;importorg.springframework.security.core.......
  • Effective-Java-Chapter9-通用程序设计
    https://github.com/clxering/Effective-Java-3rd-edition-Chinese-English-bilingual/blob/dev/Chapter-9/Chapter-9-Introduction.md准则一将局部变量的作用域最小化不要在变量使用之前就申明,在需要使用的时候进行申明。当然这条准则不是那么绝对,大部分时候遵守就好。......
  • 你是如何克服编程学习中的挫折感的?(-@-^-0-)
            在编程学习中遇到挫折感是极为常见且正常的现象,因为编程往往涉及解决复杂问题、理解抽象概念以及不断试错的过程。        以下是一些建议,帮助你在面对挫折时调整心态,继续前行:接受失败是成长的一部分:首先要认识到,无论是谁,在学习编程的过程中都会遇......
  • uni-app vue3 实现微信朋友圈和朋友分享功能
     1.新建share.jsexportdefault{data(){return{}},//1.配置发送给朋友onShareAppMessage(){return{title:'分享的标题',//分享的标题path:'pages/index',//点击分享链接之后进入的页面路径imageUrl:''//分享发......
  • 找两个单词规律-哈希表
     力扣的简单题目,来找单词的规律,下面我们用python的dict来解决,思路:同时遍历pattern和s,因为s是用空格进行分割的,因此用python的split()函数进行拆分即可。Step1:统计pattern和s的长度是否一致,不一致返回FalseStep2:遍历pattern和sStep3:构建p_dict和s_dict用于编码,......
  • 使用python-slim镜像遇到无法使用PostgreSQL的问题
    前言之前不是把DjangoStarter的docker方案重新搞好了吗一开始demo部署是使用SQLite数据库的,用着没问题,但很快切换到PostgreSQL的时候就遇到问题了…报错docker启动之后,app容器报错django.core.exceptions.ImproperlyConfigured:Errorloadingpsycopg2orpsycopg......
  • AP9195 7-24V高效率、高精度的升压型大功率 LED 照明灯与恒流驱动控制芯片方案
    概述AP9195是一款高效率、高精度的升压型大功率LED灯恒流驱动控制芯片。AP9195内置高精度误差放大器,固定关断时间控制电路,恒流驱动电路等,特别适合大功率、多个高亮度LED灯串的恒流驱动。AP9195通过调节外置的电流采样电阻,能控制高亮度LED灯的驱动电流,使LED灯亮度......
  • Android逆向题解-攻防世界-Ph0en1x-100
    jeb反编译apk主要代码是if那个判断,getFlag取字符串用getSecret加密,和输入字符串encrypt加密后再getSecret加密,进行比较,两边同样都是getSecret加密,那比较可以简化成this.getFlag()==this.encrypt(s)。也就是输入字符经过encrypt加密后等于getFlag的字符串即可。protec......
  • GPT-5 一年半后发布?对此你有何期待?
    GPT-5一年半后发布?对此你有何期待?IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉·穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的成长。“像GP......
  • mysql - 根据某经纬度 从区域列表内筛选符合条件的区域. 地图经纬度 坐标筛选
    作者原创.转载请注明来源我有一个区域列表.每个区域都有一堆经纬度坐标集合它们组成一个不规则图形.然后我有个经纬度坐标想筛选出这个坐标属于那个区域.mysql适合做这样的筛选吗?//创建区域坐标表CREATETABLEregions( idINTAUTO_INCREMENTPRIMARYKEY,......