【Spring Security + OAuth2】授權

Spring Security + OAuth2

第一章 Spring Security 快速入門
第二章 Spring Security 自定義配置
第三章 Spring Security 前后端分離配置
第四章 Spring Security 身份認證
第五章 Spring Security 授權
第六章 OAuth2


文章目錄

  • Spring Security + OAuth2
  • 1、基于request的授權
    • 1.1、用戶-權限-資源
      • 需求
      • 配置權限
      • 授權權限
      • 請求未授權的接口
    • 1.2、用戶-角色-資源
      • 配置角色
      • 授權角色
    • 1.3、用戶-角色-權限-資源
  • 2、基于方法的授權
    • 2.1、開啟方法授權
    • 2.2、給用戶授予角色和權限
    • 2.3、常用授權注解


授權管理的實現在SpringSecurity中非常靈活,可以幫助應用程序實現以下兩種常見的授權需求:

  • 用戶-權限-資源:例如張三的權限是添加用戶、查看用戶列表、李四的權限是查看用戶列表
  • 用戶-角色-權限-資源:例如張三是角色是管理員、李四的角色是普通用戶,管理員能做所有操作,普通用戶只能查看信息

1、基于request的授權

1.1、用戶-權限-資源

需求

  • 具有USER_LIST權限的用戶可以訪問/user/list
  • 具有USER_ADD權限的用戶可以訪問/user/add

配置權限

SecurityFilterChain

package com.security.demo.config;
import ...@Configuration //配置類
public class WebSecurityConfig {@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {// authorizeHttpRequests() 開啟授權保護// anyRequest() 對所以請求開啟授權保護// authenticated()已認證請求會自動授權。http.authorizeHttpRequests(authorize -> authorize//具有USER_LIST權限的用戶可以訪問/user/list                   .requestMatchers("/user/list").hasAnyAuthority("USER_LIST")//具有USER_ADD權限的用戶可以訪問/user/addd.requestMatchers("/user/add").hasAnyAuthority("USER_ADD")//對所有請求開啟授權保護.anyRequest()//已認證的請求會被自動授權.authenticated());...
}

授權權限

DBUserDetailsManager中的loadUserByUsername方法:

 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {QueryWrapper<User> queryWrapper = new QueryWrapper();queryWrapper.eq("username",username);User user = userMapper.selectOne(queryWrapper);if (user==null){throw  new UsernameNotFoundException(username);}else{Collection<GrantedAuthority> authorities = new ArrayList<>();//模擬權限authorities.add(()->"USER_LIST");authorities.add(()->"USER_ADD");return   new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(),user.getEnabled(),true,//用戶賬號是否過期。true,//用戶憑證是否過期true,//未被鎖定authorities//權限列表);}}

請求未授權的接口

實現AccessDeniedHandler 接口

package com.security.demo.config;public class MyAccessDeniedHandler implements AccessDeniedHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException, ServletException {//創建結果對象HashMap result = new HashMap();result.put("code",-1);result.put("message","沒有權限");//轉換成json字符串String json = JSON.toJSONString(result);//返回響應response.setContentType("application/json;charset=UTF-8");response.getWriter().println(json);}
}

SecurityFilterChain添加配置請求未授權的處理。

package com.security.demo.config;
import ...@Configuration //配置類
public class WebSecurityConfig {@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {...http.exceptionHandling(exception -> {exception.accessDeniedHandler(new MyAccessDeniedHandler());//請求未授權的處理});...
}

1.2、用戶-角色-資源

配置角色

package com.security.demo.config;
import ...@Configuration //配置類
public class WebSecurityConfig {@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> authorize.requestMatchers("/user/**").hasRole("ADMIN").anyRequest().authenticated());...
}

授權角色

@Component
public class DBUserDetailsManager implements UserDetailsManager, UserDetailsPasswordService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {QueryWrapper<User> queryWrapper = new QueryWrapper();queryWrapper.eq("username",username);User user = userMapper.selectOne(queryWrapper);if (user==null){throw  new UsernameNotFoundException(username);}else{//模擬授權return org.springframework.security.core.userdetails.User.withUsername(user.getUsername()).password(user.getPassword()).disabled(!user.getEnabled())//用戶是否禁用.credentialsExpired(false)//是否過期.accountLocked(false).roles("ADMIN").build();}}
}

1.3、用戶-角色-權限-資源

RBAC(Role-Based Access Control,基于角色的訪問控制)是一種常用的數據設計方案,它將用戶的權限分配和管理與角色相關聯。以下是一個基本的RBAC數據庫設計方案的示例:

1、用戶表(User table):包含用戶的基本信息,例如用戶名、密碼和其他身份驗證信息。

列名數據類型描述
user_idint用戶ID
usernamevarchar用戶名
passwordvarchar密碼
emailvarchar電子郵件

2、角色表(Role table):儲存所有可能得角色及其描述。

列名數據類型描述
role_idint角色ID
role_namevarchar角色名稱
descriptionvarchar角色描述

3、權限表(Permission table):定義系統中所有可能得權限

列名數據類型描述
permission_idint權限ID
permission_namevarchar權限名稱
descriptionvarchar角色描述

4、用戶角色關聯表(User-Role table):將用戶與角色關聯起來。

列名數據類型描述
user_role_idint用戶角色關聯ID
user_idint用戶ID
role_idint角色ID

5、角色權限關聯表(Role-Permission table):將角色與權限關聯起來。

列名數據類型描述
role_permission_idint用戶角色關聯ID
role_idint角色ID
permission_idint權限ID

在這個設計方案中,用戶可以被分配一個或多個角色,而每個角色又可以具有一個或多個權限。通過對用戶角色關聯和角色權限關聯表進行操作,可以實現靈活的權限管理和訪問控制。

2、基于方法的授權

2.1、開啟方法授權

在配置文件中添加@EnableMethodSecurity注解,并修改authorizeHttpRequests

@Configuration //配置類
@EnableMethodSecurity
public class WebSecurityConfig {...http.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated());
}

2.2、給用戶授予角色和權限

DBUserDetailsManager中的loadUserByUsername方法:

	 return org.springframework.security.core.userdetails.User.withUsername(user.getUsername()).password(user.getPassword()).disabled(!user.getEnabled())//用戶是否禁用.credentialsExpired(false)//是否過期.accountLocked(false).roles("ADMIN")//authorities和roles不能同時使用會覆蓋.authorities("USER_ADD","USER_LIST").build();}

2.3、常用授權注解

    @GetMapping(path = "/list")@PreAuthorize("hasRole('ADMIN') and authentication.name == 'abc'")public List<User> getList(){return userService.list();}@PreAuthorize("hasAuthority('USER_ADD')")@PostMapping(path = "/add")public void add(@RequestBody User user){userService.saveUserDetails(user);}

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

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

相關文章

一條命令安裝Metasploit Framework

做安全滲透的人都或多或少的使用kali-Linux系統中msfconsole命令啟動工具&#xff0c;然而也經常會有人遇到這樣那樣的問題無法啟動 今天我們就用一條命令來重新安裝這個工具 curl https://raw.githubusercontent.com/rapid7/metasploit-omnibus/master/config/templates/met…

AI學習AI知識路線

數學基礎 一、數據分析 二、概率論 三、線性代數及矩陣 l 數學基礎 1)常數e2)導數3)梯度 4)Taylor5)gini系數6)信息熵與組合數 1)概率論基礎2)古典模型3)常見概率分布 4)大數定理和中心極限定理5)協方差(矩陣)和相關系數 6)最大似然估計和最大后驗估計 1)線性空間及線性變…

Windows內核--內存區對象(Section Object)(5.2)

內存區對象 Section Object表示可以共享的內存段。進程可以使用Section與其他進程共享其部分內存地址空間. Section還可為進程提供將文件映射到其內存地址空間的機制。 Linux有mmap與之類似。 參考: Section Objects and Views 內存區對象是虛擬描述符表VAD節點的一種 VAD樹節點…

LabVIEW如何確保自動化設備的穩定性和可靠性?

為了確保LabVIEW在自動化設備中的穩定性和可靠性&#xff0c;可以采取以下關鍵措施&#xff1a; 1. 代碼架構與設計 模塊化設計&#xff1a;將程序分解為獨立的模塊或子VI&#xff0c;每個模塊負責特定功能&#xff0c;便于測試和維護。狀態機架構&#xff1a;使用狀態機架構…

zookeeper選主之LeaderLatch

概述 利用zookeeper來進行選主&#xff0c;可以使用apache curator framework&#xff0c;它給我們封裝了兩種選主工具&#xff0c;它們分別是LeaderSelector和LeaderLatch。它們各自的應用場景不一樣&#xff0c;LeaderSelector應用于那些需要頻繁變主的情況&#xff0c;而Le…

Redis機制-Redis互斥鎖、分布式鎖

目錄 一 互斥鎖 二 分布式鎖 Redis實現分布式鎖 redisson實現分布式鎖 可重入性&#xff1a; 主從一致性&#xff08;性能差&#xff09;&#xff1a; 一 互斥鎖 假設我們現在有一個業務要實現秒殺優惠券的功能&#xff0c;如果是一個正常的流程&#xff0c;線程之間應該…

數據結構中鏈表的題目

題目&#xff1a; 設計一個算法&#xff0c;要求將鏈表中所有節點的鏈接方向“原地”逆轉&#xff0c;即要求僅利用原表的存儲空間。 對于這個問題&#xff0c;首先要分析的是&#xff1a;鏈表中的頭和尾節點如何插入&#xff1f;其次就是&#xff1a;如何鏈接&#xff1f; 搞懂…

閱讀筆記——《未知協議狀態機推斷技術研究綜述》

【參考文獻】盛嘉杰, 牛勝杰, 陳陽, 等. 未知協議狀態機推斷技術研究綜述[J]. 計算機與現代化, 2023 (05): 58.【注】本文僅為作者個人學習筆記&#xff0c;如有冒犯&#xff0c;請聯系作者刪除。 摘要 協議逆向工程&#xff08;PRE&#xff09;描述了協議的行為邏輯&#xff…

spring cloud config server源碼學習(一)

文章目錄 1. 注解EnableConfigServer2. ConfigServerAutoConfiguration2.1 ConditionalOnBean和ConditionalOnProperty2.2 Import注解2.2.1. EnvironmentRepositoryConfiguration.class2.2.2. CompositeConfiguration.class2.2.3. ResourceRepositoryConfiguration.class2.2.4.…

python3 + selenium webdriver自動化測試啟動不同瀏覽器

selenium webdriver自動化測試啟動不同瀏覽器 selenium webdriver 介紹Selenium WebDriver 進行自動化測試的一般流程瀏覽器驅動下載瀏覽器驅動的安裝chrome、edge、Firefox、Opera、Safari、phantomjs 應用Headless Chrome 、Headless Firefox 應用 selenium webdriver 介紹 …

shell命令運行原理及Linux權限問題

目錄 shell命令以及運行原理用戶管理添加用戶刪除用戶sudo Linux權限的概念Linux權限管理文件訪問者的分類&#xff08;人&#xff09;文件類型和訪問權限&#xff08;事物屬性&#xff09;文件權限值的表示方法文件訪問權限的相關設置方法 目錄的權限粘滯位 shell命令以及運行…

備考AMC8和AMC10競賽,吃透2000-2024年1850道真題和解析(持續)

多做真題&#xff0c;吃透真題和背后的知識點是備考AMC8、AMC10有效的方法之一&#xff0c;通過做真題&#xff0c;可以幫助孩子找到真實競賽的感覺&#xff0c;而且更加貼近比賽的內容&#xff0c;可以通過真題查漏補缺&#xff0c;更有針對性的補齊知識的短板。 今天我們繼續…

PostgreSQL基本使用Schema

參考文章&#xff1a;PostgreSQL基本使用&#xff08;3&#xff09;Schema_pg數據庫查詢schema-CSDN博客 PostgreSQL 模式&#xff08;Schema&#xff09;可以理解為是一個表的集合&#xff08;或者所屬者&#xff09;。 例如&#xff1a;在 MySQL 中&#xff0c;Scheam 是庫&…

gcc源碼分析(AST抽象語法樹)

文章目錄 三、AST相關1、AST(抽象語法樹)1.1 樹結點的聲明1.2 樹結點的結構1.2.1 tree_node聯合體1.2.2 tree_base結構體1.2.3 tree_common結構體1.2.4 常量結構體1.2.5 **標識符節點**2、符號綁定,作用域與block樹節點2.1 lang_identifier結構體2.2 c_binding結構體2.3 scop…

HLS視頻加密,讓您的視頻內容更安全!

背景介紹 HLS視頻加密是一種基于HTTP Live Streaming&#xff08;HLS&#xff09;協議的加密技術。它的核心思想是將視頻切片進行加密處理&#xff0c;在客戶端播放時需要先獲取解密密鑰才能正常偶發。通過這種方式&#xff0c;HLS加密可以有效防止未經授權的第三方竊取視頻內…

測試短信推薦參考

短信測試參考 國外&#xff1a; smstome 支持多個國家號碼 官網地址&#xff1a; https://smstome.com/ quackr.io 支持多個國家號碼 官網地址&#xff1a; https://quackr.io/ receive-smss 支持多個國家號碼 地址&#xff1a; https://receive-smss.com/ receive-sms-fr…

C#字典的常用方法

C#的字典&#xff08;Dictionary&#xff09;類是一個通用的集合類&#xff0c;它實現了鍵值對的存儲和訪問。以下是一些常用的字典方法&#xff1a; Add(key, value)&#xff1a;向字典中添加一個指定的鍵值對。Remove(key)&#xff1a;從字典中移除具有指定鍵的元素。Contai…

LLM大模型的7種推理框架分析

LLM的7種推理框架 Hugging Face的transformers 這是一個Python庫&#xff0c;可以簡化本地運行LLM的過程。 Transformers的優點&#xff1a; 自動模型下載提供代碼片段非常適合實驗和學習 Transformers的缺點&#xff1a; 需要對ML和NLP有深入了解需要編碼和配置技能 2.L…

深度學習之基于Tensorflow低光增強的深層Retinex分解

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 在圖像處理領域&#xff0c;低光照環境下的圖像增強是一個具有挑戰性的問題。為了提高圖像的可…

紐曼新品X1000:輕巧便攜僅重9.9公斤的1度電應急電源

在戶外救援行動和應急設備中&#xff0c;電力供應的穩定性和安全性直接影響到救援工作的效率和成功率。在現代救援工作中&#xff0c;常見的光學聲波探測儀、通信聯絡設備、氣象檢測儀、生命探測儀、照明設備等裝備均需有持續的電力供應&#xff0c;才能保障救援工作的有序開展…