舊的Spring Security OAuth已停止維護,全面擁抱最新解決方案Spring SAS

Spring Authorization Server 替換 Shiro 指引

背景

  • Spring 團隊正式宣布 Spring Security OAuth 停止維護,該項目將不會再進行任何的迭代

在這里插入圖片描述

  • 目前 Spring 生態中的 OAuth2 授權服務器是 Spring Authorization Server 已經可以正式生產使用
  • 作為 SpringBoot 3.0 的最新權限方案,JeecgBoot springboot3_sas分支,已經完成了采用Spring Authorization Server 替換 Shiro工作。

JeecgBoot SAS分支

  • Date: 2024-01-17
  • 技術棧: SpringBoot3+ Spring Authorization Server+jdk18

源碼下載:

  • 后端:https://github.com/jeecgboot/jeecg-boot/tree/springboot3_sas
  • 前端:https://github.com/jeecgboot/jeecgboot-vue3/tree/springboot3_sas

登錄對接

jeecg 基于Spring Authorization Server擴展了四種登錄實現,加上默認提供的四種,共計有8種登錄方式,額外還有OpenID Connect模式。本文不講解授權碼模式、客戶端模式、刷新碼模式、設備碼模式、OpenID Connect模式,只會講解jeecg實際應用了的四種擴展模式,其它模式請查閱Spring Authorization Server官方原文。

https://docs.spring.io/spring-authorization-server/reference/overview.html

注意:OpenID Connect應當僅為認證階段使用,不可作為權限校驗階段使用。

密碼模式和APP模式

密碼模式在Oauth2.1協議中被放棄,Spring Authorization Server并沒有對該模式提供實現,該實現是基于Spring Authorization Server提供的擴展入口實現的。

密碼模式實現源碼:package org.jeecg.config.security.password;

APP模式實現源碼:package org.jeecg.config.security.app;

密碼模式與APP模式實現完全一致,不過防止額外需求偏差,所以進行了分開實現。

請求地址:{baseUrl} /oauth2/token

請求方法:POST

請求頭:

請求頭名稱請求頭值
AuthorizationBasic base64(clientId:clientSecret)(此處需要自行替換)
Content-Typeapplication/x-www-form-urlencoded

請求參數:

參數名稱參數值
grant_typepassword/app (password為PC端使用,app為移動端使用)
username用戶名
password密碼

響應內容:

參數名稱參數含義
access_token訪問token,在被限制訪問的接口請求中添加Authorization: Bearer access_token
refersh_token刷新token,用于刷新碼模式獲取新的access_token
userInfo當前登錄用戶信息
其它內容不作詳解,請查看源碼
phone模式

phone模式用于手機+驗證碼登錄場景。

phone模式實現源碼:package org.jeecg.config.security.phone;

請求地址:{baseUrl} /oauth2/token

請求方法:POST

請求頭:

請求頭名稱請求頭值
AuthorizationBasic base64(clientId:clientSecret)(此處需要自行替換)
Content-Typeapplication/x-www-form-urlencoded

請求參數:

參數名稱參數值
grant_type固定為phone
mobile手機號
captcha驗證碼

響應內容:

參數名稱參數含義
access_token訪問token,在被限制訪問的接口請求中添加Authorization: Bearer access_token
refersh_token刷新token,用于刷新碼模式獲取新的access_token
userInfo當前登錄用戶信息
其它內容不作詳解,請查看源碼
social模式

任何一個用戶中心端(比如微信、微博、github、gitee)對外提供的對接方式都是授權碼模式、OpenID Connect模式,最終獲取到一段用戶信息(比如用戶名、頭像地址、郵箱),但是其實并沒有辦法拿著這段信息在當前系統中訪問受限資源,以前都是手搓token或者其它手段來得到受限訪問的權限,這種方法不可靠也不安全,而且也不易維護。

jeecg針對以上場景,基于Spring Authorization Server擴展了social模式,用于處理獲取三方用戶信息后,再獲取當前系統的訪問憑證。

social模式實現源碼:package org.jeecg.config.security.social;

提示:文檔中只講解social模式的應用,不講解從三方登錄到應用social模式的全流程,jeecg前后端均已實現,細節請查看源碼。

請求地址:{baseUrl} /oauth2/token

請求方法:POST

請求頭:

請求頭名稱請求頭值
AuthorizationBasic base64(clientId:clientSecret)(此處需要自行替換)
Content-Typeapplication/x-www-form-urlencoded

請求參數:

參數名稱參數值
grant_type固定為social
token可獲取用戶信息的憑證
thirdType三方來源

響應內容:

參數名稱參數含義
access_token訪問token,在被限制訪問的接口請求中添加Authorization: Bearer access_token
refersh_token刷新token,用于刷新碼模式獲取新的access_token
userInfo當前登錄用戶信息
其它內容不作詳解,請查看源碼

權限校驗

可用于方法或類上,將基于注解的權限code,針對性處理方法或當前類的所有接口進行權限攔截。

基于角色
// shiro用法
@RequiresRoles("admin")// 可替換為 spring authorization server 用法
@PreAuthorize("jps.requiresRoles('admin')")
基于權限
// shiro用法
@RequiresPermissions("sys:role") // 可替換為 spring authorization server 用法
@PreAuthorize("jps.requiresPermissions('sys:role')")

角色和權限組合使用

- @PreAuthorize("@jps.requiresPermissions('system:quartzJob:add') or @jps.requiresRoles('admin')")
免登錄配置
jeecg:shiro:excludeUrls: /test/jeecgDemo/demo3,/test/jeecgDemo/redisDemo/**,/jmreport/bigscreen2/**# 替換為
security:oauth2:client:ignore-urls:- /test/jeecgDemo/demo3- /test/jeecgDemo/redisDemo/**- /jmreport/bigscreen2/**

升級小技巧

搜索替換為
org.apache.shiro.SecurityUtilsorg.jeecg.config.security.utils.SecureUtil
(LoginUser) SecurityUtils.getSubject().getPrincipal()SecureUtil.currentUser()
org.apache.shiro.authz.annotation.RequiresRolesorg.springframework.security.access.prepost.PreAuthorize
org.apache.shiro.authz.annotation.RequiresPermissionsorg.springframework.security.access.prepost.PreAuthorize
@RequiresPermissions@PreAuthorize(“jps.requiresPermissions(‘xxx’)”)
@RequiresRoles@PreAuthorize(“@jps.requiresRoles(‘xxx’)”)

升級SQL

切換springboot3_sas分支的Spring Authorization Server,需要執行升級sql

CREATE TABLE `oauth2_registered_client` (`id` varchar(100) NOT NULL,`client_id` varchar(100) NOT NULL,`client_id_issued_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,`client_secret` varchar(200) DEFAULT NULL,`client_secret_expires_at` timestamp NULL DEFAULT NULL,`client_name` varchar(200) NOT NULL,`client_authentication_methods` varchar(1000) NOT NULL,`authorization_grant_types` varchar(1000) NOT NULL,`redirect_uris` varchar(1000) DEFAULT NULL,`post_logout_redirect_uris` varchar(1000) DEFAULT NULL,`scopes` varchar(1000) NOT NULL,`client_settings` varchar(2000) NOT NULL,`token_settings` varchar(2000) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;INSERT INTO `oauth2_registered_client`
(`id`,
`client_id`,
`client_id_issued_at`,
`client_secret`,
`client_secret_expires_at`,
`client_name`,
`client_authentication_methods`,
`authorization_grant_types`,
`redirect_uris`,
`post_logout_redirect_uris`,
`scopes`,
`client_settings`,
`token_settings`)
VALUES
('3eacac0e-0de9-4727-9a64-6bdd4be2ee1f',
'jeecg-client',
now(),
'secret',
null,
'3eacac0e-0de9-4727-9a64-6bdd4be2ee1f',
'client_secret_basic',
'refresh_token,authorization_code,password,app,phone,social',
'http://127.0.0.1:8080/jeecg-',
'http://127.0.0.1:8080/',
'*',
'{"@class":"java.util.Collections$UnmodifiableMap","settings.client.require-proof-key":false,"settings.client.require-authorization-consent":true}',
'{"@class":"java.util.Collections$UnmodifiableMap","settings.token.reuse-refresh-tokens":true,"settings.token.id-token-signature-algorithm":["org.springframework.security.oauth2.jose.jws.SignatureAlgorithm","RS256"],"settings.token.access-token-time-to-live":["java.time.Duration",300000.000000000],"settings.token.access-token-format":{"@class":"org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat","value":"self-contained"},"settings.token.refresh-token-time-to-live":["java.time.Duration",3600.000000000],"settings.token.authorization-code-time-to-live":["java.time.Duration",300000.000000000],"settings.token.device-code-time-to-live":["java.time.Duration",300000.000000000]}');

常用API

1. 獲取登錄用戶信息

LoginUser sysUser = SecureUtil.currentUser();

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

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

相關文章

c++異常機制(3) -- 異常類型和生命周期

目錄 拋出的異常類型大致可以分為三種。 第一種 基本類型 1. 可以直接拋出常量 2. 也可以拋出定義好的變量 3. 如果我們使用const,會不會影響到異常的匹配。 第二種 字符串類型以及指針類型 1. 使用字符指針 注意: 2. 使用string類型 第三種 …

計算機專業大學生的簡歷,為何會出現在垃圾桶

為什么校招過后垃圾桶里全是簡歷,計算機專業的學生找工作有多難? 空哥這么跟你說吧,趁現在還來得及,這些事情你一定要聽好了。 第一,計算機專業在學校學的東西是非常有限的,985211的還好,如果…

GPS歷史軌跡優化算法的研究與實現

GPS歷史軌跡優化算法的研究與實現 摘要 本研究提出了一種綜合利用數據清洗、密度聚類、卡爾曼濾波和地圖匹配的新算法,命名為“DSKF-Match”。該算法旨在處理GPS軌跡數據,通過清洗、聚類、平滑和匹配等步驟,提高數據的質量和準確性。首先,算法利用時間窗口法進行數據清洗…

D365:LookUp

文章目錄 前言一、復制onLookUp事件方法二、LookUp方法 前言 在Form的字段的onLookUp方法中,添加下拉框。 一、復制onLookUp事件方法 二、LookUp方法 [FormControlEventHandler(formControlStr(EcoResProductDetailsExtended, VyaKeyItemType_VyaMaterialSubCode…

Vue2:路由守衛實現權限管理之獨享路由守衛

一、情景說明 單獨給某個路由組件配置守衛 二、案例 給news路由配置獨享路由守衛 在進入該路由組件前,會觸發相關函數 函數內編寫鑒權功能的相關代碼即可 關鍵配置:beforeEnter {name:xinwen,path:news,component:News,meta:{isAuth:true,title:新聞}…

【PyTorch知識點匯總】

PyTorch是一個廣泛使用的深度學習框架,它提供了許多功能強大的工具和函數,用于構建和訓練神經網絡。以下是一些PyTorch的常用知識點和示例說明: 張量(Tensors) 創建張量:使用torch.tensor()?、torch.Tenso…

面試經典150題——用最少數量的箭引爆氣球

"The only person you are destined to become is the person you decide to be." - Ralph Waldo Emerson 1. 題目描述 2. 題目分析與解析 這個題目開始讀題的時候是有點不好理解題意的,因此我先做個圖讓大家對于題意有更好更直觀的理解再來分析題目。 …

如何使用Portainer創建Nginx容器并搭建web網站發布至公網可訪問【內網穿透】

文章目錄 前言1. 安裝Portainer1.1 訪問Portainer Web界面 2. 使用Portainer創建Nginx容器3. 將Web靜態站點實現公網訪問4. 配置Web站點公網訪問地址4.1公網訪問Web站點 5. 固定Web靜態站點公網地址6. 固定公網地址訪問Web靜態站點 前言 Portainer是一個開源的Docker輕量級可視…

SQL 常見命令及規范

常見命令 1. 查看當前所有數據庫 show databases; 2. 打開指定的庫 use 庫名 ; 3. 查看當前庫的所有表 show tables; 4. 查看其他庫的所有表 show tables from 庫名 ; 5. 創建表 cerate table 表名 ( 列名 列類型, 列名 列類型, ..... …

基于YOLO家族最新模型YOLOv9開發構建自己的個性化目標檢測系統從零構建模型完整訓練、推理計算超詳細教程【以自建數據酸棗病蟲害檢測為例】

在我前面的系列博文中,對于目標檢測系列的任務寫了很多超詳細的教程,目的是能夠讀完文章即可實現自己完整地去開發構建自己的目標檢測系統,感興趣的話可以自行移步閱讀: 《基于官方YOLOv4-u5【yolov5風格實現】開發構建目標檢測模型超詳細實戰教程【以自建缺陷檢測數據集為…

C# OpenVINO Crack Seg 裂縫分割 裂縫檢測

目錄 效果 模型信息 項目 代碼 數據集 下載 C# OpenVINO Crack Seg 裂縫分割 裂縫檢測 效果 模型信息 Model Properties ------------------------- date:2024-02-29T16:35:48.364242 author:Ultralytics task:segment version&…

去掉WordPress網頁圖片默認鏈接功能

既然是wordpress自動添加的,那么我們在上傳圖片到wordpress后臺多媒體的時候,就可以手動改變鏈接指向或者刪除掉,問題是每次都要這么做很麻煩,更別說有忘記的時候。一次性解決這個問題有兩種方法,一種是No Image Link插…

【生成式AI】ChatGPT原理解析(1/3)- 對ChatGPT的常見誤解

Hung-yi Lee 課件整理 文章目錄 誤解1誤解2ChatGPT真正在做的事情-文字接龍 ChatGPT是在2022年12月7日上線的。 當時試用的感覺十分震撼。 誤解1 我們想讓chatGPT講個笑話,可能會以為它是在一個笑話的集合里面隨機地找一個笑話出來。 我們做一個測試就知道不是這樣…

C# Post數據或文件到指定的服務器進行接收

目錄 應用場景 實現原理 實現代碼 PostAnyWhere類 ashx文件部署 小結 應用場景 不同的接口服務器處理不同的應用,我們會在實際應用中將A服務器的數據提交給B服務器進行數據接收并處理業務。 比如我們想要處理一個OFFICE文件,由用戶上傳到A服務器…

中國汽車電子行業發展現狀分析及投資前景預測報告

全版價格:壹捌零零 報告版本:下單后會更新至最新版本 交貨時間:1-2天 第一章 汽車電子相關概述 1.1 汽車的相關介紹 1.1.1 汽車的概念 我國國家最新標準《汽車和掛車類型的術語和定義》(GB/T3730.1—2001&…

基于springboot+vue的貿易行業crm系統

博主主頁:貓頭鷹源碼 博主簡介:Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰,歡迎高校老師\講師\同行交流合作 ?主要內容:畢業設計(Javaweb項目|小程序|Pyt…

Flink分區相關

0、要點 Flink的分區列不會存數據,也就是兩個列有一個分區列,則文件只會存另一個列的數據 1、CreateTable 根據SQL的執行流程,進入TableEnvironmentImpl.executeInternal,createTable分支 } else if (operation instanceof Crea…

Java-nio

一、NIO三大組件 NIO的三大組件分別是Channel,Buffer與Selector Java NIO系統的核心在于:通道(Channel)和緩沖區(Buffer)。通道表示打開到 IO 設備(例如:文件、套接字)的連接。若需要使用 NIO 系統,需要獲取用于連接 IO 設備的通…

Spring的簡單使用及內部實現原理

在現代的Java應用程序開發中,Spring Framework已經成為了不可或缺的工具之一。它提供了一種輕量級的、基于Java的解決方案,用于構建企業級應用程序和服務。本文將介紹Spring的簡單使用方法,并深入探討其內部實現原理。 首先,讓我們…

mysql8.0使用MGR實現高可用

一、三節點MGR集群的安裝部署 1. 安裝準備 準備好下面三臺服務器&#xff1a; IP端口角色192.168.150.213306mgr1192.168.150.223306mgr2192.168.150.233306mgr3 配置hosts解析 # cat >> /etc/hosts << EOF 192.168.150.21 mgr1 192.168.150.22 mgr2 192.168…