SpringSecurity配置(自定義認證過濾器)

文末有本篇文章的項目源碼文件可供下載學習

在這個案例中,我們已經實現了自定義登錄URI的操作,登錄成功之后,我們再次訪問后端中的API的時候要在請求頭中攜帶token,此時的token是jwt字符串,我們需要將該jwt字符串進行解析,查看解析后的User對象是否處于登錄狀態.登錄狀態下,將用戶信息封裝成Authentication對象用于后續過濾器驗證,并放行,未登錄狀態下直接拒絕訪問.

0.配置思路

  1. 在本案例基礎上,進行升級.
  2. 新建JwtAuthenticateFilter.java,實現認證過濾器.
  3. 配置SecurityConfig.java,將JwtAuthenticateFilter加入過濾器鏈.
  4. 進行相關測試.

1.新建JwtAuthenticateFilter.java

@Component
public class JwtAuthenticateFilter extends OncePerRequestFilter {@Autowiredprivate UserMapper userMapper;@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//        1.獲取tokenString token = request.getHeader("token");if (!StringUtils.hasText(token)) {filterChain.doFilter(request, response);return;}
//        2.解析tokenClaims claims = JwtUtil.parseJWT(token);String userId = claims.getId(); //獲取用戶IdString userDetailsString = claims.getSubject();UserDetailsImpl userDetails = JSON.parseObject(userDetailsString, UserDetailsImpl.class);
//        3.獲取用戶信息User user = userMapper.findById(userId);if (Objects.isNull(user) || user.getCurrentFlag().equals("logout")) {throw new RuntimeException("用戶未登錄");}
//        4.存入SecurityContextHolder//獲取權限信息封裝到authenticationToken對象中UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails,null,null);SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//        5.放行filterChain.doFilter(request, response);}
}

2.配置SecurityConfig.java

    @Overrideprotected void configure(HttpSecurity http) throws Exception {http
//                關閉csrf.csrf().disable()
//                不通過session獲取SecurityContext.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()
//                放行登錄接口,允許匿名訪問.antMatchers("/security/login").anonymous()
//                登錄不登錄的都可以訪問,放行
//                .antMatchers("/hello").permitAll()
//                除上面外的所有請求全部需要認證授權.anyRequest().authenticated();//        配置認證jwt過濾器http.addFilterBefore(jwtAuthenticateFilter, UsernamePasswordAuthenticationFilter.class);}

3.相關測試

3.1未登錄測試

我們發現返回403狀態碼,被拒絕訪問.

3.2登錄之后訪問測試

我們發現返回了token值,將token值復制下來,放到自定義訪問的請求頭中,之后進行訪問測試.

我們發現就能正常訪問了.

本篇文章的項目源碼文件,可點擊下載學習

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

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

相關文章

《UNIX網絡編程卷1:套接字聯網API》第1章 簡介

《UNIX網絡編程卷1:套接字聯網API》第1章 簡介 1.1 網絡編程的核心價值與挑戰 網絡編程是實現跨設備通信的技術基礎,其核心目標是通過協議棧實現數據的可靠傳輸與高效交換。在嵌入式系統、云計算、物聯網等領域,網絡編程能力直接決定了系統的…

D-Wave專用量子計算機登頂Science 率先展示在真實場景中的量子優勢(內附下載)

內容來源:量子前哨(ID:Qforepost) 文丨浪味仙 排版丨浪味仙 行業動向:4200字丨16分鐘閱讀 摘要:加拿大專用量子計算機公司 D-Wave 在 Science 期刊發表了論文,題為《Beyond-Classical Compu…

在Ubuntu上安裝MEAN Stack的4個步驟

在Ubuntu上安裝MEAN Stack的4個步驟為:1.安裝MEAN;2.安裝MongoDB;3.安裝NodeJS,Git和NPM;4.安裝剩余的依賴項。 什么是MEAN Stack? 平均堆棧一直在很大程度上升高為基于穩健的基于JavaScript的開發堆棧。…

jmeter將返回的數據寫入csv文件

舉例說明,我需要接口返回體中的exampleid與todoid的數據信息(使用邊界提取器先將其提取),并將其寫入csv文件進行保存 使用后置處理器BeanShell 腳本實例如下 import java.io.*;// 設置要寫入的文件路徑 String filePath "…

Linux下Redis哨兵集群模式搭建(1主2從+3哨兵)

Linux下Redis哨兵集群模式搭建(1主2從3哨兵) 一、Redis哨兵模式搭建 1.安裝包下載 鏈接: https://pan.baidu.com/s/1_n2rCMi5MHX-mVkkyMo4LA 提取碼: gbra 2.新建redis目錄 mkdir -p /app/redis3.解壓到/app/redis目錄下 tar -zxvf redis-6.2.16.ta…

Debian 系統命令集合 |Debian 和 CentOS常見命令的異同

Debian 系統命令集合 Debian 是一個非常流行且穩定的 Linux 發行版,廣泛用于服務器、桌面和工作站環境。 Debian 和 CentOS常見命令 使用方式的對比 注: 部分人(比如我)先學的centos,其實centos和debian 就記住幾十個有區別命…

20250319在榮品的PRO-RK3566開發板的buildroot系統下使用集成的QT應用調試串口UART3

stty -F /dev/ttyS3 115200 -echo cat /dev/ttyS3 & echo serialdata > /dev/ttyS3 20250319在榮品的PRO-RK3566開發板的buildroot系統下使用集成的QT應用調試串口UART3 2025/3/19 14:17 緣起:在榮品的PRO-RK3566開發板的buildroot系統下,在命令…

深入理解 C# 反射 的使用

總目錄 前言 反射是.NET框架中一個強大的特性,允許程序在運行時檢查和操作類型信息。通過反射,開發者可以動態地創建對象、調用方法、訪問屬性等,為程序提供了極大的靈活性。本文將詳細講解C#反射的使用方法及其應用場景。 一、什么是反射&a…

YOLO+OpenCV強強聯手:高精度跌倒檢測技術實戰解析

目錄 關于摔倒檢測 摔倒檢測核心邏輯 摔倒檢測:聯合多種邏輯判斷 原理詳細解釋 1. 導入必要的庫 2. 定義函數和關鍵點連接關系 3. 篩選有效關鍵點并計算邊界框 4. 計算人體上下半身中心點和角度 5. 繪制關鍵點和連接線 6. 繪制角度標注和檢測跌倒 7. 返回處理后的圖…

AI入門7:python三種API方式調用本地Ollama+DeepSeek

回顧 書接上篇:各種方式搭建了本地知識庫: AI入門:AI模型管家婆ollama的安裝和使用-CSDN博客 AI入門2:本地AI部署,用ollama部署deepseek(私有化部署)-CSDN博客 AI入門3:給本地d…

內網安全-橫向移動Kerberos 攻擊SPN 掃描WinRMWinRSRDP

1.WinRM&WinRS 條件: 雙方開啟winrm winrs服務 2008版本以上默認開啟,win 7默認關閉 檢測使用cs內置端口掃描5985開放情況 進行連接 winrs -r:http://192.168.93.30:5985 -u:administrator -p:Whoami2021 whoami 2.內網-spn shell setspn -T …

LoRA中黑塞矩陣、Fisher信息矩陣是什么

LoRA中黑塞矩陣、Fisher信息矩陣是什么 1. 三者的核心概念 黑塞矩陣(Hessian) 二階導數矩陣,用于優化問題中判斷函數的凸性(如牛頓法),或計算參數更新方向(如擬牛頓法)。 Fisher信息矩陣(Fisher Information Matrix, FIM) 統計學中衡量參數估計的不確定性,反映數據…

高級java每日一道面試題-2025年3月04日-微服務篇[Eureka篇]-Eureka是什么?

如果有遺漏,評論區告訴我進行補充 面試官: Eureka是什么? 我回答: 在Java高級面試中,關于Eureka的討論通常會涵蓋其基本概念、組件與架構、工作原理、高級特性以及與其他服務發現工具的比較等多個方面。以下是結合提供的內容對Eureka進行的詳細解析和…

YZi Labs 談對 Plume 的投資:利用區塊鏈創造現實價值的典范項目

3 月 17 日,YZi Labs 宣布投資 RWAfi 賽道項目 Plume,引發市場廣泛關注。本輪融資是 Plume 在 去年 5 月和 12 月 連續兩輪融資后的第三輪融資,代表著市場資本市場對于 Plume RWAfi 敘事以及其發展潛力的高度認可。 本次融資不僅提升了市場對…

互功率譜 cpsd

互功率譜(Cross-Power Spectral Density, CPSD)是信號處理中用于描述兩個信號在頻域中相關性的工具。它表示兩個信號在不同頻率下的功率分布及其相位關系,廣泛應用于模態分析、系統辨識和信號匹配等領域。 matlab 實現 MATLAB 提供了 cpsd 函數來計算互功率譜。以下是使用 …

RocketMQ 架構

一、RocketMQ 核心架構概述 ?1. 主要組件 ?Name Server: 集群的「中樞神經」,負責 Topic 元數據管理(如 Topic 分區分布、Broker 節點狀態監控)。 ?Broker: 消息存儲與流轉的核心節點,負責消息的持久化…

單片機學完開發板,如何繼續提升自己的技能?

很多人學完開發板后都會卡在一個尷尬的階段:覺得自己會的東西不少,但又不知道下一步該干啥。會點C語言,能燒錄程序,能點亮LED,玩轉按鍵,搞定串口等等,能用開發板做點小玩意兒,但面對…

olmOCR大模型:支持結構化精準提取復雜PDF文件內容

基于streamlit與olmOCR大模型實現的pdf提取工具 import os import json import subprocess import pandas as pd from pathlib import Path import shutil import time import re import streamlit as st# 創建工作目錄 WORKSPACE_DIR "olmocr_workspace" os.maked…

五模型對比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量時間序列預測

目錄 預測效果基本介紹程序設計參考資料 預測效果 基本介紹 光伏功率預測!五模型對比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多變量時間序列預測(Matlab2023b 多輸入單輸出) 1.程序已經調試好,替換數據集后,僅運…

druid開啟防火墻之后的bug

bug以及解決方案 不允許執行多個語句不允許有注釋部分數據有誤識別,拋出異常,導致原本正常執行的語句被中斷 解決方案 application.yaml中對于druid配置如下: wall:enabled: true # 開啟防火墻config:multi-statement-allow: true # 允許多個…