Spring Boot 整合SpringSecurity后,实现JWT令牌颁发

简介: Spring Boot 整合SpringSecurity后,实现JWT令牌颁发

前言

接上次,整合SpringSecurity后,我们进行jwt的整合

JWT令牌颁发

导jar包

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

创建utils包,与JwtUtils类

)5BW4IN}B02VOJX{OV8`172.png

根据用户信息创建Jwt令牌

由于我们的JWT令牌需要在根据用户信息创建,所以我们要在Spring Security登录成功里面的处理器进行创建。

那用户信息怎么读呢?

在Spring Security中,认证成功后,会将用户的信息封装成Authentication对象,并存储在SecurityContextHolder中。 所以我们可以通过authentication.getPrincipal()authentication.getPrincipal()是用于获取当前认证成功的用户对象

authentication.getPrincipal()返回的是一个Principal对象,用户信息实际上是存储在该对象中的。在大多数情况下,Principal对象会实现UserDetails接口,因此可以将其强制转换为UserDetails类型以方便获取用户的详细信息,如用户名、过期时间、角色等。

I)%%35M5IM9XB]2%ADIQCQG.png

正式创建Jwt令牌

我们回到JwtUtils工具类中,因为我们用户信息是UserDetails类型,所以传入的对象也是这个类型,注意我们UserDetails里面是没有id的,而且有可能里面是存储的是邮箱不是用户名,所以id和用户名要另外传入

密钥与过期时间我们放在配置类中读取,过期时间不要太长,要不然就是永久的了

7Q%RWUH0~TY`~Z%]N{KE2FF.png

@BTWLWYTFS3`C`)65ZX621Q.pngTDLU)@XFA6X~QBVK]GZIG8A.png

     @Value("${spring.security.jwt.key}")
     private String key;
 ​
     @Value("${spring.security.jwt.expire}")
     private int expire;
 ​
     public String createJwt(UserDetails user, String username, int userId) {
 ​
         Algorithm algorithm = Algorithm.HMAC256(key); // 使用HMAC256算法生成JWT的签名
         Date expire = this.expireTime(); // 设置JWT的过期时间
         return JWT.create()
                 .withJWTId(UUID.randomUUID().toString()) // 设置JWT的唯一标识
                 .withClaim("id", userId) // 设置用户id
                 .withClaim("name", username) // 设置用户名
                 .withClaim("authorities", user.getAuthorities() // 设置用户权限,将他转为集合形式
                         .stream()
                         .map(GrantedAuthority::getAuthority)
                         .toList())
                 .withExpiresAt(expire) // 设置JWT的过期时间
                 .withIssuedAt(new Date()) // 设置JWT的发布时间
                 .sign(algorithm); // 使用算法进行签名
     }
     /**
      * 根据配置快速计算过期时间
      * @return 过期时间
      */
     public Date expireTime(){
         // 创建一个Calendar对象
         Calendar calendar = Calendar.getInstance();
         // 将当前时间加上过期时间的小时数
         calendar.add(Calendar.HOUR, expire);
         // 返回计算后的过期时间
         return calendar.getTime();
     }


目录
相关文章
|
1月前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
165 5
|
3月前
|
JSON 安全 算法
|
2月前
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
79 8
|
2月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
53 0
|
3月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
199 1
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
131 62
|
20天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
101 13
|
28天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
121 2
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。