Spring Security 權限配置詳解

🌟Spring Security 權限配置詳解:從基礎到進階

Spring Security 是一個功能強大、可高度自定義的安全框架,主要用于為基于 Spring 的應用程序提供身份驗證和授權功能。
本篇文章將帶你深入理解 Spring Security 的權限配置機制,掌握從用戶認證到權限控制的核心配置方式。


一、Spring Security 的核心概念

在開始配置之前,先簡單了解幾個核心名詞:

名詞說明
Authentication認證,驗證用戶身份(用戶名+密碼)
Authorization授權,判斷當前用戶是否有訪問某資源的權限
SecurityContext安全上下文,保存當前用戶的認證信息
UserDetailsService加載用戶信息的接口
GrantedAuthority授權對象,表示用戶擁有的權限
SecurityFilterChainSpring Security 的過濾器鏈配置入口

二、Spring Security 權限配置方式概覽

權限控制一般包含以下幾種形式:

  1. 基于 URL 路徑 的權限控制(最常用)
  2. 基于 方法注解 的權限控制(如 @PreAuthorize
  3. 自定義 AccessDecisionManager 權限決策器

三、配置示例:Spring Boot + Spring Security 權限控制

1. 引入依賴

<!-- Spring Security 依賴 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 基礎配置類

使用 SecurityFilterChain 代替舊版 WebSecurityConfigurerAdapter

@Configuration
@EnableMethodSecurity  // 啟用方法級權限控制
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {return http.authorizeHttpRequests(auth -> auth.requestMatchers("/admin/**").hasRole("ADMIN").requestMatchers("/user/**").hasAnyRole("USER", "ADMIN").requestMatchers("/", "/login").permitAll().anyRequest().authenticated()).formLogin(login -> login.loginPage("/login").defaultSuccessUrl("/home").permitAll()).logout(logout -> logout.logoutUrl("/logout").logoutSuccessUrl("/login")).csrf(csrf -> csrf.disable()).build();}
}

3. 自定義用戶信息(UserDetailsService)

@Service
public class MyUserDetailsService implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) {// 模擬從數據庫中查詢if ("admin".equals(username)) {return User.withUsername("admin").password("{noop}admin123") // {noop}表示明文密碼.roles("ADMIN").build();} else if ("user".equals(username)) {return User.withUsername("user").password("{noop}user123").roles("USER").build();}throw new UsernameNotFoundException("用戶不存在");}
}

四、基于注解的權限控制(推薦)

Spring Security 支持通過注解方式對方法或類進行權限控制:

@RestController
@RequestMapping("/data")
public class DataController {@GetMapping("/admin")@PreAuthorize("hasRole('ADMIN')")public String adminData() {return "這是管理員數據";}@GetMapping("/user")@PreAuthorize("hasAnyRole('USER','ADMIN')")public String userData() {return "這是用戶數據";}
}

常用注解說明

注解說明
@PreAuthorize方法執行前權限判斷
@PostAuthorize方法執行后權限判斷
@Secured("ROLE_ADMIN")只允許指定角色訪問(默認需加 ROLE_

五、自定義權限判斷表達式

假如你想用業務邏輯判斷權限,可以這樣:

@PreAuthorize("@authService.canAccess(#userId)")
public String getUserData(Long userId) {return "業務數據";
}

AuthService 中定義權限邏輯:

@Component
public class AuthService {public boolean canAccess(Long userId) {// 獲取當前登錄用戶的 IDAuthentication auth = SecurityContextHolder.getContext().getAuthentication();String currentUsername = auth.getName();// 自定義邏輯,比如根據用戶名判斷是否有權限查看這個 userIdreturn true;}
}

六、權限控制最佳實踐

  • 權限與角色分離:不要把角色當權限用,系統更復雜時建議獨立權限表。
  • 接口權限控制+方法權限控制雙保險
  • 菜單權限與接口權限綁定,提升用戶體驗。
  • 使用數據庫動態加載權限,支持多角色多權限靈活管理。

七、總結

Spring Security 提供了強大且靈活的權限控制機制,支持從 URL 到方法粒度的精細化配置。通過自定義 UserDetailsServiceSecurityFilterChain 和注解控制權限,我們可以輕松實現企業級權限管理。

? 核心關鍵詞回顧:

  • SecurityFilterChain
  • UserDetailsService
  • @PreAuthorize
  • hasRole / hasAuthority
  • 動態權限 + 自定義判斷邏輯

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

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

相關文章

pycharm中安裝Charm-Crypto

一、安裝依賴 1、安裝gcc、make、perl sudo apt-get install gcc sudo apt-get install make sudo apt-get install perl #檢查版本 gcc -v make -v perl -v 2、安裝依賴庫m4、flex、bison(如果前面安裝過pypbc的話,應該已經裝過這些包了) sudo apt-get update sudo apt…

【MCAL】AUTOSAR架構下基于SPI通信的驅動模塊詳解-以TJA1145為例

目錄 前言 正文 1.TJA1145驅動代碼中的SPI協議設計 1.1 對SPI Driver的依賴 1.2 對SPI配置的依賴 1.2.1 SpiExternalDevice 1.2.2 Channel_x 1.2.3 Job_x 1.2.4 Sequence N 1.2.5 Sequence M 1.2.6 Sequence L 1.2.7 小結 2.基于Vector驅動代碼的SPI配置 2.1 SPI引…

JavaScript:BOM編程

今天我要介紹的是JS中有關于BOM編程的知識點內容&#xff1a;BOM編程&#xff1b; 介紹&#xff1a;BOM全名&#xff08;Browser Object Model&#xff08;瀏覽器對象模型&#xff09;&#xff09;。 是瀏覽器提供的與瀏覽器窗口交互的接口&#xff0c;其核心對象是 window。與…

Memcached緩存系統:從部署到實戰應用指南

#作者&#xff1a;獵人 文章目錄 一、安裝libevent二、安裝配置memcached三、安裝Memcache的PHP擴展四、使用libmemcached的客戶端工具五、Nginx整合memcached:六、php將會話保存至memcached Memcached是一款開源、高性能、分布式內存對象緩存系統&#xff0c;可應用各種需要緩…

解決前后端時區不一致問題

前后端時區不一致導致&#xff1a; 》數據不顯示在前端 》頁面顯示時間有誤 》一些對時間有要求的方法&#xff0c;無法正確執行&#xff0c;出現null值&#xff0c;加上我們對null值有判斷/注解&#xff0c;程序就會報錯中斷&#xff0c;以為是業務邏輯問題&#xff0c;其實…

35.Java線程池(線程池概述、線程池的架構、線程池的種類與創建、線程池的底層原理、線程池的工作流程、線程池的拒絕策略、自定義線程池)

一、線程池概述 1、線程池的優勢 線程池是一種線程使用模式&#xff0c;線程過多會帶來調度開銷&#xff0c;進而影響緩存局部性和整體性能&#xff0c;而線程池維護著多個線程&#xff0c;等待著監督管理者分配可并發執行的任務&#xff0c;這避免了在處理短時間任務時創建與…

驅動開發硬核特訓 · Day 6 : 深入解析設備模型的數據流與匹配機制 —— 以 i.MX8M 與樹莓派為例的實戰對比

&#x1f50d; B站相應的視屏教程&#xff1a; &#x1f4cc; 內核&#xff1a;博文視頻 - 從靜態綁定驅動模型到現代設備模型 主題&#xff1a;深入解析設備模型的數據流與匹配機制 —— 以 i.MX8M 與樹莓派為例的實戰對比 在上一節中&#xff0c;我們從驅動框架的歷史演進出…

Blender安裝基礎使用教程

本博客記錄安裝Blender和基礎使用&#xff0c;可以按如下操作來繪制標靶場景、道路標識牌等。 目錄 1.安裝Blender 2.創建面板資源 步驟 1: 設置 Blender 場景 步驟 2: 創建一個平面 步驟 3: 將 PDF 轉換為圖像 步驟 4-方法1: 添加材質并貼圖 步驟4-方法2&#xff1a;創…

智能手機功耗測試

隨著智能手機發展,用戶體驗對手機的續航功耗要求越來越高。需要對手機進行功耗測試及分解優化,將手機的性能與功耗平衡。低功耗技術推動了手機的用戶體驗。手機功耗測試可以采用powermonitor或者NI儀表在功耗版上進行測試與優化。作為一個多功能的智能終端,手機的功耗組成極…

從代碼學習深度學習 - 多頭注意力 PyTorch 版

文章目錄 前言一、多頭注意力機制介紹1.1 工作原理1.2 優勢1.3 代碼實現概述二、代碼解析2.1 導入依賴序列掩碼函數2.2 掩碼 Softmax 函數2.3 縮放點積注意力2.4 張量轉換函數2.5 多頭注意力模塊2.6 測試代碼總結前言 在深度學習領域,注意力機制(Attention Mechanism)是自然…

學術版 GPT 網頁

學術版 GPT 網頁 1. 學術版 GPT 網頁非盈利版References https://academic.chatwithpaper.org/ 1. 學術版 GPT 網頁非盈利版 arXiv 全文翻譯&#xff0c;免費且無需登錄。 更換模型 System prompt: Serve me as a writing and programming assistant. 界面外觀 References …

MarkDown 輸出表格的方法

MarkDown用來輸出表格很簡單&#xff0c;比Word手搓表格簡單多了&#xff0c;而且方便修改。 MarkDown代碼&#xff1a; |A|B|C|D| |:-|-:|:-:|-| |1|b|c|d| |2|b|c|d| |3|b|c|d| |4|b|c|d| |5|b|c|d|顯示效果&#xff1a; ABCD1bcd2bcd3bcd4bcd5bcd A列強制左對齊&#xf…

MetaGPT深度解析:重塑AI協作開發的智能體框架實踐指南

一、框架架構與技術突破 1.1 系統架構設計 graph TBA[自然語言需求] --> B(需求解析引擎)B --> C{角色路由系統}C --> D[產品經理Agent]C --> E[架構師Agent]C --> F[工程師Agent]D --> G[PRD文檔]E --> H[架構圖]F --> I[代碼文件]G --> J[知識共…

自用:在使用SpringBoot做學生信息管理系統時遇到的問題

1、在做完查詢測試時&#xff0c;一直報出404找不到錯誤&#xff0c;原因是沒有為各個層的實現類添加注解 2、改完之后發現測試沒有數據&#xff0c;是因為我寫的返回值類型為空&#xff0c;應該返回一個List< Student > 3、我沒有想到要寫Result實體類&#xff0c;因為不…

SQLite + Redis = Redka

Redka 是一個基于 SQLite 實現的 Redis 替代產品&#xff0c;實現了 Redis 的核心功能&#xff0c;并且完全兼容 Redis API。它可以用于輕量級緩存、嵌入式系統、快速原型開發以及需要事務 ACID 特性的鍵值操作等場景。 功能特性 Redka 的主要特點包括&#xff1a; 使用 SQLi…

202529 | RocketMQ 簡介 + 安裝 + 集群搭建 + 消費模式 + 消費者組

RocketMQ簡介 RocketMQ 簡介 Apache RocketMQ 是一款開源的 分布式消息中間件&#xff08;Message Queue, MQ&#xff09;&#xff0c;由阿里巴巴團隊研發并捐贈給 Apache 基金會&#xff0c;現已成為頂級項目。它專為 高吞吐、低延遲、高可靠 的分布式場景設計&#xff0c;廣…

Go語言--語法基礎4--基本數據類型--整數類型

整型是所有編程語言里最基礎的數據類型。 Go 語言支持如下所示的這些整型類型。 需要注意的是&#xff0c; int 和 int32 在 Go 語言里被認為是兩種不同的類型&#xff0c;編譯器也不會幫你自動做類型轉換&#xff0c; 比如以下的例子會有編譯錯誤&#xff1a; var value2 in…

競拍商城:電商創新的博弈場與未來趨勢

競拍商城&#xff1a;電商創新的博弈場與未來趨勢 在傳統電商趨于同質化的今天&#xff0c;競拍商城憑借其獨特的交易機制和用戶激勵模式&#xff0c;成為電商領域的新寵。通過結合拍賣的博弈屬性與電商的便捷性&#xff0c;競拍商城不僅重塑了消費體驗&#xff0c;更催生了全…

Linux : 多線程互斥

目錄 一 前言 二 線程互斥 三 Mutex互斥量 1. 定義一個鎖&#xff08;造鎖&#xff09; 2. 初始化鎖 3. 上鎖 4. 解鎖 5. 摧毀鎖 四 鎖的使用 五 鎖的宏初始化 六 鎖的原理 1.如何看待鎖&#xff1f; 2. 如何理解加鎖和解鎖的本質 七 c封裝互斥鎖 八 可重入…

論文閱讀筆記——Reactive Diffusion Policy

RDP 論文 通過 AR 提供實時觸覺/力反饋&#xff1b;慢速擴散策略&#xff0c;用于預測低頻潛在空間中的高層動作分塊&#xff1b;快速非對稱分詞器實現閉環反饋控制。 ACT、 π 0 \pi_0 π0? 采取了動作分塊&#xff0c;在動作分塊執行期間處于開環狀態&#xff0c;無法及時響…