【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的安全性:使用 Spring Security 實現認證與授權

??<前文回顧>

點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、開篇整活兒

今兒個咱嘮嘮 Spring Boot 里頭的安全性。這玩意兒吧,說大不大,說小不小,整好了是錦上添花,整不好就是火上澆油。你要是剛入門,那可得悠著點兒,別一上來就整得自己“翻車”了。

二、安全性是啥玩意兒?

安全性是系統開發里頭的一個核心問題,說白了就是保證系統的數據和操作不被非法訪問。Spring Boot 里頭默認就集成了安全性,用起來賊方便。

1. 認證與授權

安全性里頭有兩個核心概念:認證(Authentication)和授權(Authorization)。

  • 認證:就是驗證用戶的身份,比如說用戶名和密碼。
  • 授權:就是驗證用戶的權限,比如說某個用戶能不能訪問某個資源。

2. Spring Security 是啥玩意兒?

Spring Security 是 Spring 里頭的一個安全性框架,專門用來實現認證和授權。Spring Boot 里頭默認就集成了 Spring Security,用起來賊方便。

三、Spring Boot 集成 Spring Security

Spring Boot 里頭集成 Spring Security 很簡單,只要加個依賴,配個安全性配置就行了。

1. 添加依賴

首先,你得在?pom.xml?里頭加個 Spring Security 的依賴。

XML Code

<dependency>

????<groupId>org.springframework.boot</groupId>

????<artifactId>spring-boot-starter-security</artifactId>

</dependency>

這段代碼里頭,spring-boot-starter-security?是 Spring Boot 里頭的 Spring Security 依賴。

2. 配置安全性

然后,你得在?application.properties?里頭配個安全性配置。

Properties Code

spring.security.user.name=admin

spring.security.user.password=admin

這段代碼里頭,spring.security.user.name?是默認的用戶名,spring.security.user.password?是默認的密碼。

3. 使用 Spring Security

最后,你可以在代碼里頭用 Spring Security 來實現認證和授權。

Java Code

@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

????@Override

????protected void configure(HttpSecurity http) throws Exception {

????????http.authorizeRequests()

????????????????.antMatchers("/public/**").permitAll()

????????????????.anyRequest().authenticated()

????????????????.and()

????????????????.formLogin();

????}

}

這段代碼里頭,SecurityConfig?類繼承了?WebSecurityConfigurerAdapter,重寫了?configure?方法,配置了安全性。

四、Spring Boot 使用 JWT 實現認證

JWT(JSON Web Token)是一種開放標準(RFC 7519),用來在各方之間安全地傳輸信息。Spring Boot 里頭使用 JWT 實現認證很簡單,只要加個依賴,配個 JWT 配置就行了。

1. 添加依賴

首先,你得在?pom.xml?里頭加個 JWT 的依賴。

Java Code

<dependency>

????<groupId>io.jsonwebtoken</groupId>

????<artifactId>jjwt</artifactId>

????<version>0.9.1</version>

</dependency>

這段代碼里頭,jjwt?是 JWT 的依賴。

2. 配置 JWT

然后,你得在?application.properties?里頭配個 JWT 配置。

Properties Code

jwt.secret=mySecret

jwt.expiration=86400

這段代碼里頭,jwt.secret?是 JWT 的密鑰,jwt.expiration?是 JWT 的過期時間。

3. 生成 JWT

最后,你可以在代碼里頭生成 JWT。

Java Code

@Service

public class JwtService {

????@Value("${jwt.secret}")

????private String secret;

????@Value("${jwt.expiration}")

????private long expiration;

????public String generateToken(String username) {

????????return Jwts.builder()

????????????????.setSubject(username)

????????????????.setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))

????????????????.signWith(SignatureAlgorithm.HS512, secret)

????????????????.compact();

????}

}

這段代碼里頭,generateToken?方法用?Jwts.builder?生成了一個 JWT。

五、Spring Boot 使用 JWT 實現授權

Spring Boot 里頭使用 JWT 實現授權很簡單,只要加個過濾器,配個授權配置就行了。

1. 添加過濾器

首先,你得在代碼里頭加個 JWT 過濾器。

Java Code

@Component

public class JwtFilter extends OncePerRequestFilter {

????@Autowired

????private JwtService jwtService;

????@Override

????protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

????????String token = request.getHeader("Authorization");

????????if (token != null && jwtService.validateToken(token)) {

????????????String username = jwtService.getUsernameFromToken(token);

????????????UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());

????????????SecurityContextHolder.getContext().setAuthentication(authentication);

????????}

????????filterChain.doFilter(request, response);

????}

}

這段代碼里頭,JwtFilter?類繼承了?OncePerRequestFilter,重寫了?doFilterInternal?方法,實現了 JWT 過濾器。

2. 配置授權

然后,你得在?SecurityConfig?里頭配個授權配置。

Java Code

@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

????@Autowired

????private JwtFilter jwtFilter;

????@Override

????protected void configure(HttpSecurity http) throws Exception {

????????http.authorizeRequests()

????????????????.antMatchers("/public/**").permitAll()

????????????????.anyRequest().authenticated()

????????????????.and()

????????????????.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);

????}

}

這段代碼里頭,addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)?表示在?UsernamePasswordAuthenticationFilter?之前添加?JwtFilter。

六、Spring Boot 使用 Spring Security 的坑點

1. 安全性配置不對

Spring Boot 里頭,安全性配置不對,那認證和授權就不起作用了。你要是沒配好,那可得好好檢查檢查。

Java Code

@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

????@Override

????protected void configure(HttpSecurity http) throws Exception {

????????http.authorizeRequests()

????????????????.antMatchers("/public/**").permitAll()

????????????????.anyRequest().authenticated()

????????????????.and()

????????????????.formLogin();

????}

}

這段代碼里頭,antMatchers("/public/**").permitAll()?表示?/public/**?路徑下的資源不需要認證。

2. JWT 配置不對

Spring Boot 里頭,JWT 配置不對,那認證和授權就不起作用了。你要是沒配好,那可得好好檢查檢查。

Properties Code

jwt.secret=mySecret

jwt.expiration=86400

這段代碼里頭,jwt.secret?和?jwt.expiration?是 JWT 的配置。

3. 過濾器順序不對

Spring Boot 里頭,過濾器順序不對,那認證和授權就不起作用了。你要是沒配好,那可得好好調整調整。

Java Code

@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

????@Autowired

????private JwtFilter jwtFilter;

????@Override

????protected void configure(HttpSecurity http) throws Exception {

????????http.authorizeRequests()

????????????????.antMatchers("/public/**").permitAll()

????????????????.anyRequest().authenticated()

????????????????.and()

????????????????.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);

????}

}

這段代碼里頭,addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)?表示在?UsernamePasswordAuthenticationFilter?之前添加?JwtFilter。

專有名詞解釋

  1. 安全性:系統開發里頭的一個核心問題,保證系統的數據和操作不被非法訪問。
  2. 認證:驗證用戶的身份,比如說用戶名和密碼。
  3. 授權:驗證用戶的權限,比如說某個用戶能不能訪問某個資源。
  4. Spring Security:Spring 里頭的一個安全性框架,專門用來實現認證和授權。
  5. JWT:JSON Web Token,一種開放標準,用來在各方之間安全地傳輸信息。
  6. Jwts.builder:JWT 的一個類,用來生成 JWT。
  7. OncePerRequestFilter:Spring 里頭的一個類,用來實現過濾器。
  8. UsernamePasswordAuthenticationToken:Spring Security 里頭的一個類,用來表示用戶名和密碼的認證信息。
  9. SecurityContextHolder:Spring Security 里頭的一個類,用來保存安全性上下文。
  10. addFilterBefore:Spring Security 里頭的一個方法,用來添加過濾器。

=======================================================================

寫在最后

身為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),已經在找朋友內測了,比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算有用,大家基本都能拿到想要的offer...

我深刻意識到,能自由做自己喜歡的事情是有多么不容易,又是多么有成就感。所以我拉了兩三個志同道合的好友,開了一間公司,繼續朝著“自由”的目標前進。

當下呢,我們希望有更多的朋友能夠參與到產品的測試中來,體驗并且給出更好的建議。未來可能會在博客po更多關于我們產品的內容,包括使用場景、說明、課程等,希望能對大家有所幫助。

另外,想整個花活兒,每天花個1-2小時,來幫助我素未謀面的老朋友們看看簡歷,提提意見啥的,純屬為愛發電。我在線時間不固定,但是不要米,咱就別要自行車兒了唄~如果您有興趣,可以點擊文章底部卡片一起交流(人工回復,比較慢,請擔待)。

最后,請大家持續關注我們的博客,未來還有很多欄目,一起發掘~!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75189.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百元不入耳藍牙耳機哪個品牌好用?2025百元不入耳耳機品牌推薦

在選擇藍牙耳機時&#xff0c;許多用戶開始關注不入耳式設計&#xff0c;不僅能避免耳道不適&#xff0c;還能保持對環境音的感知&#xff0c;提升運動、通勤或日常使用的安全性。而在百元價位中&#xff0c;不入耳式耳機的品牌眾多&#xff0c;產品質量參差不齊&#xff0c;如…

如何加強 SSH 安全:內網和專用網絡環境下的防護策略

文章目錄 如何加強 SSH 安全&#xff1a;內網和專用網絡環境下的防護策略限制訪問來源通過防火墻或安全組限制網絡策略&#xff08;Network Policy&#xff09; 禁用密碼登錄&#xff0c;使用密鑰認證啟用 Fail2ban 或 SSH 防爆破限制 SSH 用戶更改 SSH 端口使用跳板機&#xf…

ngx_monotonic_time

Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_monotonic_time函數-CSDN博客 定義在 src\core\ngx_times.c static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)struct timespec ts;#if defined(CLOCK_MONOTONIC_FAST)clock_get…

【Trick】論文畫圖的icon來源

0&#xff1a;起因 群友在群里發了這種很好看的論文主圖 其中不乏有很多icon&#xff0c;比如open-ai、機器人的 于是想知道應該如何找到&#xff0c;便有了后文 1&#xff1a;網址 阿里巴巴矢量圖標庫&#xff1a;iconfont-阿里巴巴矢量圖標庫 2&#xff1a;使用方法 可…

前端 技術棧

前端 技術棧 ChatGPT 說&#xff1a; 好咧&#xff0c;說到前端技術棧&#xff0c;這一塊現在確實百花齊放&#xff0c;有點卷&#xff0c;但也超靈活。下面我來給你梳理一套2025年主流、實用、好上手的前端技術棧組合&#xff0c;按層級分類&#xff0c;一目了然&#xff1a;…

vue3 根據城市名稱計算城市之間的距離

<template><div class"distance-calculator"><h1>城市距離計算器</h1><!-- 城市輸入框 --><div class"input-group"><inputv-model"city1"placeholder"請輸入第一個城市"keyup.enter"cal…

Java安全-FastJson反序列化分析

FastJson介紹 Fastjson 是阿里巴巴推出的一款高性能 JSON 序列化/反序列化庫&#xff0c;由于其便捷性被廣泛應用于 Java 項目中 FastJson使用 package org.example;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;public class FastjsonDemo {…

查看npm安裝了哪些全局依賴

查看npm安裝了哪些全局依賴 在macOS上&#xff0c;如果你想要查看通過npm全局安裝的依賴包&#xff0c;你可以使用以下幾種方法&#xff1a; 方法1&#xff1a;使用命令行 打開你的終端&#xff08;Terminal&#xff09;&#xff0c;然后輸入以下命令&#xff1a; npm list -…

告別代碼Bug,GDB調試工具詳解

在軟件開發的漫漫長路上&#xff0c;Bug 就像隱藏在黑暗中的 “小怪獸”&#xff0c;時不時跳出來給開發者們制造麻煩。曾經&#xff0c;歐洲航天局&#xff08;ESA&#xff09;首次發射阿麗亞娜 5 號火箭&#xff0c;這本是太空探索史上的重要時刻&#xff0c;卻因一行代碼導致…

LangChain4j(2):整合SpringBoot

1 新建Springboot項目 1.1 引入依賴 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0…

移動端六大語言速記:第2部分 - 控制結構

移動端六大語言速記&#xff1a;第2部分 - 控制結構 本文繼續對比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift這六種移動端開發語言的控制結構&#xff0c;幫助開發者快速掌握各語言的語法差異。 2. 控制結構 2.1 條件語句 各語言條件語句的語法對比&#xff1a; …

Linux-線程概念與線程控制的常用操作

一.Linux線程概念 1-1.線程是什么 在Linux中&#xff0c;線程是基于Linux原有的進程實現的。本質是輕量級進程(LWP)。在?個程序?的?個執?路線就叫做線程&#xff08;thread&#xff09;。更準確的定義是&#xff1a;線程是“?個進程內部的控制序列”。 我們之前所學習的進…

dfs記憶化搜索刷題 + 總結

文章目錄 記憶化搜索 vs 動態規劃斐波那契數題解代碼 不同路徑題解代碼 最長遞增子序列題解代碼 猜數字大小II題解代碼 矩陣中的最長遞增路徑題解代碼 總結 記憶化搜索 vs 動態規劃 1. 記憶化搜索&#xff1a;有完全相同的問題/數據保存起來&#xff0c;帶有備忘錄的遞歸 2.記憶…

【HTML】驗證與調試工具

個人主頁&#xff1a;Guiat 歸屬專欄&#xff1a;HTML CSS JavaScript 文章目錄 1. HTML 驗證工具概述1.1 驗證的重要性1.2 常見 HTML 錯誤類型 2. W3C 驗證服務2.1 W3C Markup Validation Service2.2 使用 W3C 驗證器2.3 驗證結果解讀 3. 瀏覽器開發者工具3.1 Chrome DevTools…

認識rand, srand, time函數,生成隨機數

要完成猜數字游戲&#xff0c;首先要生成隨機數&#xff0c;那么該怎么生成隨機數&#xff1f;、 1.rand函數 rand函數是庫函數&#xff0c;使用的時候要使用頭文件stdlib.h c語言中&#xff0c;提供了rand函數來生成隨機數&#xff0c;來看一下函數使用&#xff1a; 但是r…

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多變量時序預測(Matlab)

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多變量時序預測&#xff08;Matlab&#xff09; 目錄 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多變量時序預測&#xff08;Matlab&#xff09;預測效果基本介紹程序設計參考資料 預測效果 基本介紹 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…

Go語言從零構建SQL數據庫引擎(2)

SQL標準與數據庫系統實現差異 在上一節中&#xff0c;我們了解了關系型數據庫的基礎概念。現在&#xff0c;讓我們深入探討SQL語言標準以及不同數據庫系統之間的實現差異。 SQL語言的誕生與演進 想象你經營的咖啡店生意蒸蒸日上&#xff0c;需要一個更強大的系統來管理數據。…

智能導診系統的技術體系組成

智能導診系統的技術體系由基礎支撐技術、核心交互技術、應用場景技術及安全保障技術構成&#xff0c;具體可歸納為以下六個維度&#xff1a; 一、基礎支撐技術 1、AI大模型與深度學習 醫療大模型&#xff1a;如騰訊醫療AI、DeepSeek等&#xff0c;通過海量醫學文獻和病例訓…

QML輸入控件: TextField(文本框)的樣式定制

目錄 引言示例簡介示例代碼與關鍵點示例1&#xff1a;基礎樣式定制示例2&#xff1a;添加圖標示例3&#xff1a;交互式元素&#xff08;清除按鈕&#xff09; 實現要點總結完整工程下載 引言 在Qt Quick應用程序開發中&#xff0c;文本輸入是最常見的用戶交互方式之一。TextFi…

leetcode hot100 多維動態規劃

1??2?? 多維動態規劃&#xff08;區間 DP、狀態機 DP&#xff09; 62. 不同路徑 一個機器人位于一個 m x n 網格的左上角 &#xff08;起始點在下圖中標記為 “Start” &#xff09;。機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角&#xff08;在下圖…