使用Spring Boot和Spring Security结合JWT实现安全的RESTful API

使用Spring Boot和Spring Security结合JWT实现安全的RESTful API

引言

在现代Web应用中,安全性是至关重要的。Spring Boot和Spring Security提供了强大的工具来保护我们的应用程序,而JWT(JSON Web Token)则是一种轻量级的认证和授权机制。本文将详细介绍如何结合这三者来实现一个安全的RESTful API。

技术栈

  • 核心框架: Spring Boot, Spring Security
  • 认证机制: JWT
  • 数据库: 可选(本文使用H2内存数据库)
  • 构建工具: Maven

实现步骤

1. 创建Spring Boot项目

首先,使用Spring Initializr创建一个新的Spring Boot项目,添加以下依赖:

  • Spring Web
  • Spring Security
  • H2 Database(可选)
  • JWT库(如jjwt)

2. 配置Spring Security

application.propertiesapplication.yml中配置Spring Security的基本设置,例如:

spring:security:user:name: adminpassword: password

3. 实现JWT认证

生成JWT Token

创建一个服务类来生成和验证JWT Token。以下是一个简单的实现:

@Service
public class JwtTokenProvider {private String jwtSecret = "your-secret-key";private long jwtExpirationInMs = 3600000; // 1 hourpublic String generateToken(Authentication authentication) {UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal();Date now = new Date();Date expiryDate = new Date(now.getTime() + jwtExpirationInMs);return Jwts.builder().setSubject(Long.toString(userPrincipal.getId())).setIssuedAt(new Date()).setExpiration(expiryDate).signWith(SignatureAlgorithm.HS512, jwtSecret).compact();}public Long getUserIdFromJWT(String token) {Claims claims = Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody();return Long.parseLong(claims.getSubject());}public boolean validateToken(String authToken) {try {Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken);return true;} catch (Exception ex) {// Handle exceptions}return false;}
}
配置JWT过滤器

创建一个过滤器来拦截请求并验证JWT Token:

public class JwtAuthenticationFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {try {String jwt = getJwtFromRequest(request);if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) {Long userId = tokenProvider.getUserIdFromJWT(jwt);// Load user details and set authentication}} catch (Exception ex) {// Handle exceptions}filterChain.doFilter(request, response);}private String getJwtFromRequest(HttpServletRequest request) {String bearerToken = request.getHeader("Authorization");if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {return bearerToken.substring(7);}return null;}
}

4. 保护API端点

使用@PreAuthorize注解来保护API端点:

@RestController
@RequestMapping("/api")
public class ApiController {@GetMapping("/public")public String publicEndpoint() {return "This is a public endpoint.";}@GetMapping("/private")@PreAuthorize("hasRole('USER')")public String privateEndpoint() {return "This is a private endpoint.";}
}

5. 测试API

使用Postman或类似的工具测试API的安全性:

  1. 获取JWT Token。
  2. 使用Token访问受保护的端点。

总结

通过本文,我们学习了如何使用Spring Boot和Spring Security结合JWT来实现安全的RESTful API。这种方法不仅简单易用,而且具有高度的灵活性和扩展性。

扩展阅读

  • Spring Security官方文档
  • JWT官方文档
  • Spring Boot官方文档

常见问题

  1. 如何刷新Token?

    • 可以实现一个刷新Token的机制,通常是通过一个单独的端点来生成新的Token。
  2. 如何存储用户信息?

    • 可以使用数据库(如MySQL或PostgreSQL)来存储用户信息。
  3. 如何扩展安全性?

    • 可以结合OAuth2或其他安全框架来增强安全性。

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

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

相关文章

对神经正切核的理解和推导(1)

声明: 本文是对Neural Tangent Kernel (NTK)基础推导 - Gearlesskai - 博客园文章内容的理解与推导,里面很多东西对我这种新手来说不太好理解,所以我力求通过这种方式理解文章的大部分内容。希望我的理解可以帮助你更…

基于 STC89C52 的养殖场智能温控系统设计与实现

摘要 本文提出一种基于 STC89C52 单片机的养殖场环境温度智能控制系统,通过集成高精度温度传感器、智能执行机构及人机交互模块,实现对养殖环境的实时监测与自动调控。系统具备温度阈值设定、超限报警及多模式控制功能,可有效提升养殖环境稳定性,降低能耗与人工成本。 一…

微信小程序调试

一、寻找答案 1. 创建小程序 https://zhuanlan.zhihu.com/p/1906013675883561860 2. 若有后端接口,需要调试 https://blog.csdn.net/animatecat/article/details/126949749 3. 比较细教程, 搭建修改配置 https://zhuanlan.zhihu.com/p/1893281527112136235 4. 查找…

使用DeepSeek实现数据处理

一、核心能力全景图 Ctrl+/ 唤醒智能助手,支持以下数据处理场景: 🧹 数据清洗与预处理📈 统计分析与可视化🤖 机器学习建模🚀 大数据性能优化📊 自动化报告生成⚡ 实时流数据处理二、高频场景实战(附魔法口令) 场景1:数据清洗自动化(Python示例) 口令: 处…

符合Python风格的对象(使用 __slots__ 类属性节省空间)

使用__slots__ 类属性节省空间 默认情况下,Python 在各个实例中名为__dict__ 的字典里存储实例属 性。如 3.9.3 节所述,为了使用底层的散列表提升访问速度,字典会消 耗大量内存。如果要处理数百万个属性不多的实例,通过__slots__…

民宿管理系统5

管理员管理&#xff1a; 新增管理员信息&#xff1a; 前端效果&#xff1a; 前端代码&#xff1a; <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-form-i…

​腾讯地图轨迹云:重构位置管理的数字神经中枢

——从轨迹追踪到智能决策&#xff0c;开启产业互联网新篇章 在数字经济与实体经济深度融合的今天&#xff0c;位置服务已成为企业数字化转型的核心基础设施。无论是物流运输中的车辆调度、共享经济中的设备管理&#xff0c;还是智慧城市中的交通优化&#xff0c;精准的轨迹数…

rce命令执行原理及靶场实战(详细)

2. 原理 在根源上应用系统从设计上要给用户提供一个指定的远程命令操作的接口。漏洞主要出现在常见的路由器、防火墙、入侵检测等设备的web管理界面上。在管理界面提供了一个ping服务。提交后&#xff0c;系统对该IP进行ping&#xff0c;并且返回结果。如果后台服务器并没有对…

GeoTools 将 Shp 导入PostGIS 空间数据库

前言 ❝ GeoTools 在空间数据转换处理方面具有强大的能力&#xff0c;能够高效、简洁的操纵 Shp 数据。特别是与空间数据库PostGIS 相结合&#xff0c;更能展示出其空间数据处理的优势&#xff0c;借助 GeoTools&#xff0c;我们可以实现 Shp 数据高效入库。 本文上接系列文章 …

基于SpringBoot+Vue的家政服务系统源码适配H5小程序APP

市场前景 随着社会经济的发展和人口老龄化的加剧&#xff0c;家政服务需求不断增长。我国65岁及以上人口增长较快&#xff0c;2022年我国65岁及以上老年人数量达2.1亿人&#xff0c;占比较2016年增长4.1个百分点&#xff0c;达14.9%。我国65岁及以上人口数量庞大&#xff0c;老…

《企业级日志该怎么打?Java日志规范、分层设计与埋点实践》

大家好呀&#xff01;&#x1f44b; 今天我们要聊一个Java开发中超级重要但又经常被忽视的话题——日志系统&#xff01;&#x1f4dd; 不管你是刚入门的小白&#xff0c;还是工作多年的老司机&#xff0c;日志都是我们每天都要打交道的"好朋友"。那么&#xff0c;如…

1Panel vs 宝塔面板:现代化运维工具的全方位对比

1Panel vs 宝塔面板对比分析 1Panel 和 宝塔面板&#xff08;BT-Panel&#xff09;都是服务器管理工具&#xff0c;旨在简化 Linux 服务器的运维工作&#xff0c;但它们在设计理念、功能侧重点和技术实现上有明显差异。以下从多个维度对两者进行对比分析&#xff1a; 1. 定位与…

怎么开发一个网络协议模块(C语言框架)之(四) 信号量初始化

// 原始代码 /* gVrrpInstance.sem = OsixCreateBSem(OSIX_SEM_Q_PRIORITY, OSIX_SEM_FULL); */ gVrrpInstance.sem = OsixCreateMSem(OSIX_SEM_Q_FIFO | OSIX_SEM_DELETE_SAFE); if (gVrrpInstance.sem == NULL) {printf("[VRRP]:vrrp init error, failed to create vrrp…

电脑C盘清理技巧:释放空间,提升性能

文章目录 一、使用系统自带的磁盘清理工具&#xff08;一&#xff09;打开磁盘清理工具&#xff08;二&#xff09;清理临时文件&#xff08;三&#xff09;清理系统文件 二、使用第三方清理工具&#xff08;一&#xff09;CCleaner&#xff08;极力推荐&#xff09;&#xff0…

ARM笔记-ARM处理器及系统结构

第二章 ARM处理器及系统结构 2.1 ARM处理器简介 采用RISC架构的ARM微处理器的特点&#xff1a; 体积小、功耗低、低成本、高性能&#xff1b;支持 Thumb&#xff08;16位&#xff09;/ARM&#xff08;32位&#xff09;双指令集&#xff0c;能很好地兼容 8位/16位 器件&#x…

关于如何在Springboot项目中通过excel批量导入数据

接口文档 2.5 批量导入学生账号 2.5.1 基本信息 请求路径:/admin/students/batch-import 请求方式:POST 接口描述:通过上传Excel文件批量导入学生账号信息。 2.5.2 请求参数 参数格式:multipart/form-data 参数说明: 参数名称参数类型是否必须备注filefile是包含学…

【TypeScript】知识点梳理(四)

#没事去翻翻官网文档&#xff0c;其实有很多用法是我们还不知道的&#xff0c;官方资料总是最权威的&#xff0c;也推荐大家无聊看看各个官网hhh&#xff0c;不一定是记忆&#xff0c;但在某种场景下我们或许能想到还有多一种解决方式# noImplicitAny 当我们没有表明类型时&…

Python匿名函数(lambda)全面详解

文章目录 Python匿名函数(lambda)全面详解一、lambda函数基础1. 什么是lambda函数&#xff1f;2. lambda函数语法3. 与普通函数的区别 二、lambda函数使用场景1. 作为函数参数2. 在数据结构中使用3. 作为返回值4. 立即调用(IIFE) 三、lambda函数高级用法1. 多参数lambda2. 条件…

Qt Widgets模块功能详细说明,基本控件:QCheckBox(三)

一、基本控件&#xff08;Widgets&#xff09; Qt 提供了丰富的基本控件&#xff0c;如按钮、标签、文本框、复选框、单选按钮、列表框、组合框、菜单、工具栏等。 1、QCheckBox 1.1、概述 (用途、状态、继承关系) QCheckBox 是 Qt 框架中的复选框控件&#xff0c;用于表示二…

HarmonyOS 鸿蒙应用开发基础:转换整个PDF文档为图片功能

在许多应用场景中&#xff0c;将PDF文档的每一页转换为单独的图片文件是非常有帮助的。这可以用于文档的分享、扫描文档的电子化存档、或者进行进一步的文字识别处理等。本文将介绍如何使用华为HarmonyOS提供的PDF处理服务将整个PDF文档转换为图片&#xff0c;并将这些图片存放…