当前位置: 首页 > news >正文

八、创建JWT工具类

     JWTToken 要经过加密才能返回给客户端,包括客户端上传的 Token ,后端项目需要验证核

实。于是我们需要一个 JWT 工具类,用来 加密 Token 验证 Token 的有效性.
1、导入依赖项
1. <dependency>
2. <groupId>org.apache.shiro</groupId>
3. <artifactId>shiro-web</artifactId>
4. <version>1.5.3</version>
5. </dependency>
6. <dependency>
7. <groupId>org.apache.shiro</groupId>
8. <artifactId>shiro-spring</artifactId>
9. <version>1.5.3</version>
10. </dependency>
11. <dependency>
12. <groupId>com.auth0</groupId>
13. <artifactId>java-jwt</artifactId>
14. <version>3.10.3</version>
15. </dependency>
16. <dependency>
17. <groupId>org.springframework.boot</groupId>
18. <artifactId>spring-boot-configuration-processor</artifactId>
19. <optional>true</optional>
20. </dependency>
21. <dependency>
22. <groupId>org.apache.commons</groupId>
23. <artifactId>commons-lang3</artifactId>
24. <version>3.11</version>
25. </dependency>
26. <dependency>
27. <groupId>org.apache.httpcomponents</groupId>
28. <artifactId>httpcore</artifactId>
29. <version>4.4.13</version>
30. </dependency>
31. <dependency>
32. <groupId>org.springframework.boot</groupId>
33. <artifactId>spring-boot-starter-aop</artifactId>
34. </dependency>

二、定义密钥和过期时间

     我建议大家把密钥和过期时间定义到SpringBoot配置文件中,然后再值注入到JavaBean中,这样维护起来比较方便。

 

 emos: 2. jwt: 3. #密钥
4. secret: abc123456
5. #令牌过期时间(天)
6. expire: 5 7. #令牌缓存时间(天数)
8. cache-expire: 10

三、创建JWT工具类

 

package com.example.emos.wx.config.shiro;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component

@SpringBootApplication
@Slf4j
public class JwtUtil {
    @Value("${emos.jwt.secret}")
    private String secret;

    @Value("${emos.jwt.expire}")
    private int expire;

    public String createToken(int userId){
        Date date=DateUtil.offset(new Date(), DateField.DAY_OF_YEAR,5);
        Algorithm algorithm=Algorithm.HMAC256(secret);
        JWTCreator.Builder builder= JWT.create();
        String token=builder.withClaim("userId",userId).withExpiresAt(date).sign(algorithm);
        return token;
    }

    public int getUserId(String token){
        DecodedJWT jwt=JWT.decode(token);
        int userId=jwt.getClaim("userId").asInt();
        return userId;
    }

    public void verifierToken(String token){
        Algorithm algorithm=Algorithm.HMAC256(secret);
        JWTVerifier verifier=JWT.require(algorithm).build();
        verifier.verify(token);
    }
}

四、把令牌封装成认证对象

我们通过JwtUtil类可以生成 Token ,这个 Token 我们是要返回给客户端的。接下来 我们要把 JWT Shiro框架 对接起来,这样 Shiro框架 就会拦截所有的Http请求,然后验证请求 提交的 Token 是否有效。

  客户端提交的Token不能直接交给Shiro框架,需要先封装成 AuthenticationToken 类型的对象,

所以我们我们需要先创建 AuthenticationToken 的实现类。

 

package com.example.emos.wx.config.shiro;

import org.apache.shiro.authc.AuthenticationToken;

public class OAuth2Token implements AuthenticationToken {
    private String token;

    public OAuth2Token(String token) {
        this.token = token;
    }

    @Override
    public Object getPrincipal() {
        return token;
    }

    @Override
    public Object getCredentials() {
        return token;
    }
}

相关文章:

  • 这家公司只有1个人,年赚一个亿
  • 【前端攻城师之JS基础】02JS对象基础
  • 【C/C++】程序环境,探索程序的执行过程(习得无上内功《易筋经》的第一步)
  • 计算机网络——基于UDP与TCP网络编程
  • 中兴设备18种命令模式总结大全,全网第一篇,强烈建议收藏!
  • 【学生管理系统】权限管理
  • NLP学习之:Bert 模型复现(1)任务分析 + 训练数据集构造
  • 【PTA】《数据结构与算法》线性结构复习题
  • Java利用工具类提升写报表效率
  • RFSoC应用笔记 - RF数据转换器 -14- RFSoC自动增益控制与NCO跳频功能
  • 大数据Hadoop之——Apache Hudi 数据湖实战操作(Spark,Flink与Hudi整合)
  • 智能机器人项目,安装人脸识别face_recognition报错解决
  • EMQX(emqtt)安装与入门
  • ansible常用模块的用法和ansible基于模块方式实现LNMP
  • ArcGIS || ENVI:如何将彩色影像拆分为R、G、B以及H、S、I(B/V)影像?
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【mysql】环境安装、服务启动、密码设置
  • Codepen 每日精选(2018-3-25)
  • const let
  • ES6简单总结(搭配简单的讲解和小案例)
  • HashMap ConcurrentHashMap
  • HTML中设置input等文本框为不可操作
  • JavaScript DOM 10 - 滚动
  • Linux链接文件
  • npx命令介绍
  • Vue2 SSR 的优化之旅
  • 从0到1:PostCSS 插件开发最佳实践
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 思考 CSS 架构
  • 线上 python http server profile 实践
  • 用element的upload组件实现多图片上传和压缩
  • 再次简单明了总结flex布局,一看就懂...
  • Spring Batch JSON 支持
  • ​VRRP 虚拟路由冗余协议(华为)
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (多级缓存)缓存同步
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (论文阅读40-45)图像描述1
  • (七)Java对象在Hibernate持久化层的状态
  • (转)nsfocus-绿盟科技笔试题目
  • ... 是什么 ?... 有什么用处?
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net 使用ajax控件后如何调用前端脚本
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NetCore项目nginx发布
  • @Builder用法
  • @synthesize和@dynamic分别有什么作用?
  • @test注解_Spring 自定义注解你了解过吗?
  • [ Algorithm ] N次方算法 N Square 动态规划解决
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解