SpringBoot 如何使用 JWT 实现身份认证和授权

Spring Boot 使用 JWT 实现身份认证和授权

JSON Web Token(JWT)是一种用于在网络应用之间安全传递信息的开放标准。它使用了一种紧凑且独立于语言的方式在各方之间传递信息,通常用于在客户端和服务器之间验证用户身份和授权访问资源。本文将介绍如何在Spring Boot中使用JWT实现身份认证和授权。

在这里插入图片描述

什么是JWT?

JWT是一个轻量级的令牌(token)协议,它使用JSON对象作为负载(payload)来传递信息,并使用数字签名(digital signature)来验证其真实性。JWT通常包括以下三个部分:

  1. Header(头部):包含了令牌的类型和使用的签名算法。
  2. Payload(负载):包含了一些声明(claims),例如用户ID、过期时间等。
  3. Signature(签名):用于验证令牌的真实性,确保它未被篡改。

JWT的主要优势在于它的轻量性、易于使用以及可扩展性。它可以在不同的应用程序之间安全传递信息,无需每次都访问数据库或使用其他形式的验证。

Spring Boot 中使用JWT的步骤

要在Spring Boot应用程序中使用JWT,需要执行以下步骤:

步骤1:添加依赖项

首先,您需要在pom.xml文件中添加以下依赖项以使用JWT库:

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version>
</dependency>
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.2</version>
</dependency>

步骤2:创建JWT工具类

接下来,您需要创建一个JWT工具类,用于生成和验证JWT令牌。以下是一个示例的JWT工具类:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;import java.util.Date;
import java.util.HashMap;
import java.util.Map;@Component
public class JwtUtils {private final String secret = "your_secret_key";private final long expirationTime = 86400000; // 1 day in milliseconds// 生成JWT令牌public String generateToken(String username) {Date now = new Date();Date expirationDate = new Date(now.getTime() + expirationTime);Map<String, Object> claims = new HashMap<>();claims.put("sub", username);return Jwts.builder().setClaims(claims).setIssuedAt(now).setExpiration(expirationDate).signWith(SignatureAlgorithm.HS512, secret).compact();}// 从JWT令牌中提取用户名public String extractUsername(String token) {Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();return claims.getSubject();}// 验证JWT令牌public boolean validateToken(String token) {try {Jwts.parser().setSigningKey(secret).parseClaimsJws(token);return true;} catch (Exception e) {return false;}}
}

在上述代码中,JwtUtils类负责生成、解析和验证JWT令牌。

步骤3:创建身份认证和授权逻辑

您需要创建身份认证和授权逻辑以确保只有合法用户可以访问受保护的资源。可以使用Spring Security等安全框架来实现这些功能。以下是一个示例的Spring Security配置类,用于使用JWT进行身份认证和授权:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {private final JwtRequestFilter jwtRequestFilter;private final UserDetailsService userDetailsService;public SecurityConfig(JwtRequestFilter jwtRequestFilter, UserDetailsService userDetailsService) {this.jwtRequestFilter = jwtRequestFilter;this.userDetailsService = userDetailsService;}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Bean@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception {return super.authenticationManagerBean();}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/authenticate").permitAll() // 放行认证接口.anyRequest().authenticated() // 所有其他请求需要认证.and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);http.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);}
}

在上述代码中,SecurityConfig类配置了哪些端点需要进行身份认证,以及如何使用JWT进行认证。

步骤4:创建认证控制器

创建一个认证控制器,它负责生成JWT令牌并将其返回给客户端。以下是一个示例的认证控制器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;@RestController
public class AuthController {private final AuthenticationManager authenticationManager;private final JwtUtils jwtUtils;private final UserDetailsService userDetailsService;@Autowiredpublic AuthController(AuthenticationManager authenticationManager, JwtUtils jwtUtils, UserDetailsService userDetailsService) {this.authenticationManager = authenticationManager;this.jwtUtils = jwtUtils;this.userDetailsService =userDetailsService;}@PostMapping("/authenticate")public ResponseEntity<?> createAuthenticationToken(@RequestBody AuthRequest authenticationRequest) throws Exception {authenticate(authenticationRequest.getUsername(), authenticationRequest.getPassword());final UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequest.getUsername());final String jwt = jwtUtils.generateToken(userDetails.getUsername());return ResponseEntity.ok(new AuthResponse(jwt));}private void authenticate(String username, String password) throws Exception {try {authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));} catch (Exception e) {throw new Exception("Invalid username or password");}}
}

在上述代码中,AuthController类包含了生成JWT令牌的逻辑。

步骤5:创建受保护的资源和授权逻辑

最后,您可以创建受保护的资源和相应的授权逻辑。在Spring Security配置中,您可以使用@PreAuthorize注解来限制访问资源的权限。以下是一个示例:

@RestController
public class ResourceController {@GetMapping("/hello")@PreAuthorize("hasRole('USER')")public String helloUser() {return "Hello, User!";}@GetMapping("/admin")@PreAuthorize("hasRole('ADMIN')")public String helloAdmin() {return "Hello, Admin!";}
}

在上述代码中,@PreAuthorize注解确保只有具有相应角色的用户可以访问/hello/admin端点。

测试JWT认证和授权

现在,您可以测试JWT认证和授权功能。首先,您可以使用/authenticate端点来获取JWT令牌,然后将该令牌包含在请求的Authorization头中,以访问受保护的资源。如果令牌有效并且用户具有所需的权限,将允许访问资源。

结论

JWT是一种强大的工具,可用于实现身份认证和授权功能。在Spring Boot中使用JWT可以简化安全性的实现,使您能够轻松地保护应用程序的资源。通过遵循本文中的步骤,您可以在Spring Boot应用程序中成功使用JWT。

希望本文对您理解如何在Spring Boot中使用JWT有所帮助。祝您的应用程序安全可靠!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/127321.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依分离版-前端使用

1 执行 npm install --registryhttps://registry.npm.taobao.org&#xff0c;报错信息如下 npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: ktg-mes-ui3.8.2 npm ERR! Found: vue2.6.12 npm ERR! node_modu…

第81步 时间序列建模实战:Adaboost回归建模

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们介绍AdaBoost回归。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndr…

基于SpringBoot的植物健康系统

目录 前言 一、技术栈 二、系统功能介绍 系统首页 咨询专家 普通植物检查登记 珍贵植物检查登记 植物救治用料登记 植物救治材料管理 植物疾病案例管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&am…

Elasticsearch:使用 ELSER 文本扩展进行语义搜索

在今天的文章里&#xff0c;我来详细地介绍如何使用 ELSER 进行文本扩展驱动的语义搜索。 安装 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasticsearch 及 Kibana&#xff0c;请参考如下的链接来进行安装&#xff1a; 如何在 Linux&#xff0c;MacOS 及 Windows 上…

机器学习7:pytorch的逻辑回归

一、说明 逻辑回归模型是处理分类问题的最常见机器学习模型之一。二项式逻辑回归只是逻辑回归模型的一种类型。它指的是两个变量的分类&#xff0c;其中概率用于确定二元结果&#xff0c;因此“二项式”中的“bi”。结果为真或假 — 0 或 1。 二项式逻辑回归的一个例子是预测人…

《低代码指南》——低代码维格云服务菜单

简介​ 快速了解付费客户能够获得维格服务团队哪些服务,本篇内容不包含使用免费试用版本的客户。 了解维格表产品价格与功能权益:戳我看价格与权益​ 客户付费后能得到哪些服务项目?​ 常规服务项目:

Covert Communication 与选择波束(毫米波,大规模MIMO,可重构全息表面)

Covert Communication for Spatially Sparse mmWave Massive MIMO Channels 2023 TOC abstract 隐蔽通信&#xff0c;也称为低检测概率通信&#xff0c;旨在为合法用户提供可靠的通信&#xff0c;并防止任何其他用户检测到合法通信的发生。出于下一代通信系统安全链路的强烈…

数据结构P46(2-1~2-4)

2-1编写算法查找顺序表中值最小的结点&#xff0c;并删除该结点 #include <stdio.h> #include <stdlib.h> typedef int DataType; struct List {int Max;//最大元素 int n;//实际元素个数 DataType *elem;//首地址 }; typedef struct List*SeqList;//顺序表类型定…

基于遗传算法的新能源电动汽车充电桩与路径选择(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

如何用ChatGPT学或教英文?5个使用ChatGPT的应用场景!

原文&#xff1a;百度安全验证 AI工具ChatGPT的出现大幅改变许多领域的运作方式&#xff0c;就连「学英文」也不例外&#xff01;我发现ChatGPT应用在英语的学习与教学上非常有意思。 究竟ChatGPT如何改变英文学习者(学生)与教学者(老师)呢&#xff1f; 有5个应用场景我感到…

docker部署Vaultwarden密码共享管理系统

Vaultwarden是一个开源的密码管理器&#xff0c;它是Bitwarden密码管理器的自托管版本。它提供了类似于Bitwarden的功能&#xff0c;允许用户安全地存储和管理密码、敏感数据和身份信息。 Vaultwarden的主要特点包括&#xff1a; 1. 安全的数据存储&#xff1a;Vaultwarden使…

SAP-MM-委外订单合并有什么不同?

计划下了两个委外采购申请&#xff0c;用ME59N合并时会有哪些不同&#xff1f; 1、采购申请2个都是委外采购申请&#xff0c;有BOM组件 因为两个采购申请的条件一致&#xff0c;所以在转采购订单ME59时&#xff0c;会被合并 但是合并之后&#xff0c;BOM组件却不显示了