使用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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82189.shtml
英文地址,請注明出處:http://en.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;并將這些圖片存放…