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


目录
相关文章
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2206 5
|
10月前
|
JSON 安全 Java
什么是用于REST API的JWT Bearer令牌以及如何通过代码和工具进行调试
在Web开发中,保护REST API至关重要,而JSON Web令牌(JWT)特别是JWT Bearer令牌,是一种高效方法。它通过紧凑、自包含的结构实现安全信息交换,提升用户体验。本文探讨JWT Bearer的基本概念、结构与实现,包括在Java中的应用步骤,以及使用Apipost和cURL进行测试的方法。JWT优势明显:无状态、互操作性强,适用于分布式系统。掌握JWT Bearer,可助开发者构建更安全、高效的API解决方案。
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
899 11
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
1372 8
|
安全 Java 关系型数据库
springboot整合springsecurity,从数据库中认证
本文介绍了如何在SpringBoot应用中整合Spring Security,并从数据库中进行用户认证的完整步骤,包括依赖配置、数据库表创建、用户实体和仓库接口、用户详情服务类、安全配置类、控制器类以及数据库初始化器的实现。
1456 3
springboot整合springsecurity,从数据库中认证
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
1073 1
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
|
安全 Java 数据安全/隐私保护
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
172 2

热门文章

最新文章