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();
     }


目录
相关文章
|
2月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
178 0
|
15天前
|
安全 Java 关系型数据库
springboot整合springsecurity,从数据库中认证
本文介绍了如何在SpringBoot应用中整合Spring Security,并从数据库中进行用户认证的完整步骤,包括依赖配置、数据库表创建、用户实体和仓库接口、用户详情服务类、安全配置类、控制器类以及数据库初始化器的实现。
50 3
springboot整合springsecurity,从数据库中认证
|
11天前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
18天前
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
32 0
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
|
1月前
|
安全 Java 数据安全/隐私保护
|
2月前
|
NoSQL 关系型数据库 MySQL
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘
120 2
|
2月前
|
安全 Java 数据安全/隐私保护
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
本文介绍了一个基于SpringBoot、Spring Security和JPA开发的校园图书管理系统,包括系统的核心控制器`LoginController`的代码实现,该控制器处理用户登录、注销、密码更新、角色管理等功能,并提供了系统初始化测试数据的方法。
47 0
基于SpringBoot+Spring Security+Jpa的校园图书管理系统
|
2月前
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
|
2月前
|
安全 Java 关系型数据库
SpringBoot SpringSecurity 介绍(基于内存的验证)
SpringBoot SpringSecurity 介绍(基于内存的验证)
36 0
|
5月前
|
安全 数据安全/隐私保护
Springboot+Spring security +jwt认证+动态授权
Springboot+Spring security +jwt认证+动态授权
196 0