【Spring Security + OAuth2】OAuth2

Spring Security + OAuth2

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


文章目錄

  • Spring Security + OAuth2
  • 1、OAuth2簡介
    • 1.1、OAuth2是什么
    • 1.2、OAuth2的角色
    • 1.3、OAuth2的使用場景
      • 開放系統間授權
        • 社交登錄
        • 開放API
      • 現代微服務安全
        • 微服務安全
      • 企業內部應用認證授權
    • 1.4、OAuth2的四種授權模式
      • 第一種方式:授權碼
      • 第二種方式:隱藏式
      • 第三種方式:密碼式
      • 第四種方式:憑證式
  • 2、Spring中的OAuth2
    • 2.1、相關角色
    • 2.2、Spring 中的實現
    • 2.3、相關依賴
    • 2.4、授權登錄的實現思路
  • 3、Github 社交登錄案例
    • 3.1、創建應用
    • 3.2、創建測試項目
      • 創建項目
      • 配置application.yml
      • 編寫代碼
      • 啟動項目
  • 4、案例分析
    • 4.1、登錄流程
    • 4.2、CommonOAuth2Provider


1、OAuth2簡介

1.1、OAuth2是什么

“Auth”表示“授權”Authorization
"O"是Open的簡稱,表示“開放”
連在一起就表示“開發授權”,OAuth2是一種開放授權協議

在這里插入圖片描述
在實際流程中,頒發Token前先要征詢用戶同意
在這里插入圖片描述

1.2、OAuth2的角色

OAuth2.0 協議包含以下角色:

  1. 資源所有者(Resource Owner):即用戶,資源的擁有人,想要通過客戶應用訪問資源服務器上的資源。
  2. 客戶應用(Client): 通常一個Web或者無線應用,它需要訪問用戶的受保護資源
  3. 資源服務器:(Resource Server):存儲受保護資源的服務器或定義了可以訪問到資源的API,接收并驗證客戶端的訪問令牌,以決定是否授權訪問資源。
  4. 授權服務器(Authorization Server):負責驗證資源所有者的身份并向客戶端頒發訪問令牌。
    在這里插入圖片描述

1.3、OAuth2的使用場景

開放系統間授權

社交登錄

在傳統的身份驗證中,用戶需要提供用戶名和密碼,還有很多網站登錄時,允許使用第三方網站的身份,這稱為“第三方登錄”。所謂第三方登錄,實質就是OAuth授權。用戶想要登錄A網站,A網站讓用戶提供第三方網站的數據,證明自己的身份。獲取第三方網站的身份數據,就需要OAuth授權。

開放API

例如云沖印服務的實現

現代微服務安全

微服務安全

在這里插入圖片描述

企業內部應用認證授權

  • SSO:Single Sign On 單點登錄
  • IAM:Identity and Access Management 身份識別與訪問管理。

1.4、OAuth2的四種授權模式

阮一峰的網絡日志-OAuth 2.0 的四種方式

  • 授權碼
  • 隱藏式
  • 密碼式
  • 客戶端憑證

第一種方式:授權碼

授權碼(authorization code),指的是第三方應用先申請一個授權碼,然后再用該碼獲取令牌
這種方式是最常用,最復雜,也是最安全的,它適用于那些有后端的Web應用。授權碼通過前端傳送,令牌則是儲存在后端,而且所有與資源服務器的通信都在后端完成。這樣的前后端分離,可以避免令牌泄露。
在這里插入圖片描述

第二種方式:隱藏式

隱藏式,有些web應用是純前端應用,沒有后端。這時就不能用上面的方式了,必須將令牌存在前端。
RFC 6749規定了這種方式,允許直接向前端頒發令牌。這種方式沒有授權碼這個中間步驟,所以稱為隱藏式。
在這里插入圖片描述

第三種方式:密碼式

密碼式(password): 如果你高度信任某個應用,RFC 6749也允許用戶名和密碼,直接告訴該應用。該應用就使用你的密碼,申請令牌。
這種方式需要用戶給出自己的用戶名/密碼,顯然風險很大,因此只適用于其他授權方式都無法采用的情況,而且必須是用戶高度信任的應用。

在這里插入圖片描述

第四種方式:憑證式

憑證式:適用于沒有前端的命令行應用,即在命令行下請求令牌。
這種方式給出的令牌,是針對第三方應用的,而不是針對用戶的,即有可能多個用戶共享同一個令牌。(示意圖和第二種相同)

2、Spring中的OAuth2

2.1、相關角色

回顧:OAuth 2中的角色

  • 資源所有者(Resource Owner)
  • 客戶應用(Client)
  • 資源服務器(Resource Server)
  • 授權服務器(Authorization Server)

2.2、Spring 中的實現

Spring Security

  • 客戶應用(OAuth2 Client): OAuth2 客戶端功能中包含OAuth2 Login
  • 資源服務器(OAuth2 Resource Server)

Spring

  • 授權服務器(Spring Authorization Server): 它是在Spring Security 之上的一個單獨的項目。

2.3、相關依賴

<!-- 資源服務器 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<!-- 客戶應用 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<!-- 授權服務器 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
</dependency>

2.4、授權登錄的實現思路

在這里插入圖片描述

3、Github 社交登錄案例

3.1、創建應用

注冊客戶應用
登錄Github,在開發者設置中找到OAuth Apps,創建一個application,為客戶應用創建訪問Github的憑證:
在這里插入圖片描述
在這里插入圖片描述

輸入如下信息,點擊注冊。
在這里插入圖片描述
創建完成后,用記事本保存一下Client ID
然后需要創建一個Client secrets,同樣用記事本保存一下Client secrets
在這里插入圖片描述

3.2、創建測試項目

創建項目

官網例子
創建一個springboot項目oauth2-login-demo,創建時引入如下依賴

在這里插入圖片描述

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity6</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-test</artifactId><scope>test</scope></dependency>

配置application.yml

由官網例子可知Github授權服務的配置方式,按照該格式配置即可。
在這里插入圖片描述
將記事本上保持的Client的id和secret寫到yml。

spring:security:oauth2:client:registration:github:client-id: Ov23liHY95uZL4eT7WcQclient-secret: 805cee30396008806a1b63d35caaabed2c7a1eb2

編寫代碼

該節代碼均來自官網例子

新建Controller

@Controller
public class OAuth2LoginController {@GetMapping("/")public String index(Model model, @RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient,@AuthenticationPrincipal OAuth2User oauth2User) {model.addAttribute("userName", oauth2User.getName());model.addAttribute("clientName", authorizedClient.getClientRegistration().getClientName());model.addAttribute("userAttributes", oauth2User.getAttributes());return "index";}
}

新建Index
官網代碼

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<head><title>Spring Security - OAuth 2.0 Login</title><meta charset="utf-8"/>
</head>
<body>
<div style="float: right" th:fragment="logout" sec:authorize="isAuthenticated()"><div style="float:left"><span style="font-weight:bold">User: </span><span sec:authentication="name"></span></div><div style="float:none">&nbsp;</div><div style="float:right"><form action="#" th:action="@{/logout}" method="post"><input type="submit" value="Logout"/></form></div>
</div>
<h1>OAuth 2.0 Login with Spring Security</h1>
<div>You are successfully logged in <span style="font-weight:bold" th:text="${userName}"></span>via the OAuth 2.0 Client <span style="font-weight:bold" th:text="${clientName}"></span>
</div>
<div>&nbsp;</div>
<div><span style="font-weight:bold">User Attributes:</span><ul><li th:each="userAttribute : ${userAttributes}"><span style="font-weight:bold" th:text="${userAttribute.key}"></span>: <spanth:text="${userAttribute.value}"></span></li></ul>
</div>
</body>
</html>

啟動項目

訪問http://localhost:8080/login
在這里插入圖片描述

點擊Github。
在這里插入圖片描述
在這里插入圖片描述

4、案例分析

4.1、登錄流程

  1. A網站讓用戶跳轉到GitHub,并攜帶參數ClientID 以及 Redirection URI。
  2. GitHub要求用戶登錄,然后詢問用戶"A網站要求獲取用戶信息的權限,你是否同意?"
  3. 用戶同意,GitHub就會重定向回A網站,同時發回一個授權碼。
  4. A網站使用授權碼,向GitHub 請求令牌。
  5. GitHub 返回令牌.
  6. A網站使用令牌,向GitHub 請求用戶數據。
  7. GitHub返回用戶數據
  8. A網站使用GitHub用戶數據登錄
    在這里插入圖片描述

4.2、CommonOAuth2Provider

CommonOAuth2Provider是一個預定義的通用OAuth2Provider,為一些知名資源服務API提供商(如Google、GitHub、Facebook)預定義了一組默認的屬性。
例如,授權URI、令牌URI和用戶信息URI通常不經常變化。因此,提供默認值以減少所需的配置。
因此,當我們配置GitHub客戶端時,只需要提供client-id和client-secret屬性。

 GITHUB {public ClientRegistration.Builder getBuilder(String registrationId) {ClientRegistration.Builder builder = this.getBuilder(registrationId, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, "{baseUrl}/{action}/oauth2/code/{registrationId}");builder.scope(new String[]{"read:user"});builder.authorizationUri("https://github.com/login/oauth/authorize");builder.tokenUri("https://github.com/login/oauth/access_token");builder.userInfoUri("https://api.github.com/user");builder.userNameAttributeName("id");builder.clientName("GitHub");return builder;}},

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

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

相關文章

call、apply和bind

call、apply和bind都是JavaScript中函數對象的方法&#xff0c;用于改變函數的this值。 call&#xff1a;call方法接收一個對象和一系列參數&#xff0c;并立即調用函數&#xff0c;將this值設置為提供的對象。例如&#xff1a; function greet(greeting, punctuation) {cons…

Linux驅動開發筆記(二) 基于字符設備驅動的I/O操作

文章目錄 前言一、設備驅動的作用與本質1. 驅動的作用2. 有無操作系統的區別 二、內存管理單元MMU三、相關函數1. ioremap( )2. iounmap( )3. class_create( )4. class_destroy( ) 四、GPIO的基本知識1. GPIO的寄存器進行讀寫操作流程2. 引腳復用2. 定義GPIO寄存器物理地址 五、…

【2024最新華為OD-C卷試題匯總】傳遞悄悄話的最長時間(100分) - 三語言AC題解(Python/Java/Cpp)

&#x1f36d; 大家好這里是清隆學長 &#xff0c;一枚熱愛算法的程序員 ? 本系列打算持續跟新華為OD-C卷的三語言AC題解 &#x1f4bb; ACM銀牌&#x1f948;| 多次AK大廠筆試 &#xff5c; 編程一對一輔導 &#x1f44f; 感謝大家的訂閱? 和 喜歡&#x1f497; 文章目錄 前…

東哥一句兄弟,你還當真了?

關注盧松松&#xff0c;會經常給你分享一些我的經驗和觀點。 你還真把自己當劉強東兄弟了?誰跟你是兄弟了?你在國外的房子又不給我住&#xff0c;你出去旅游也不帶上我!都成人年了&#xff0c;東哥一句客套話&#xff0c;別當真! 今天&#xff0c;東哥在高管會上直言&…

mysql內存結構

一&#xff1a;邏輯存儲結構&#xff1a;表空間->段->區->頁->行、 表空間&#xff1a;一個mysql實例對應多個表空間&#xff0c;用于存儲記錄&#xff0c;索引等數據。 段&#xff1a;分為數據段&#xff0c;索引段&#xff0c;回滾段。innoDB是索引組織表&…

215. 數組中的第K個最大元素(快速排序、堆排序)

根據這道題總結一下快速排序和堆排序&#xff0c;再根據這兩種方法寫這道題。 給定整數數組 nums 和整數 k&#xff0c;請返回數組中第 k 個最大的元素。 請注意&#xff0c;你需要找的是數組排序后的第 k 個最大的元素&#xff0c;而不是第 k 個不同的元素。 你必須設計并實…

qmt量化交易策略小白學習筆記第6期【qmt如何獲取股票歷史漲跌停價格】

qmt如何獲取股票歷史漲跌停價格 qmt更加詳細的教程方法&#xff0c;會持續慢慢梳理。 也可找尋博主的歷史文章&#xff0c;搜索關鍵詞查看解決方案 &#xff01; 感謝關注&#xff0c;需免費開通量化回測與咨詢實盤權限&#xff0c;可以和博主聯系&#xff01; 獲取股票歷史…

[數據結構] -- 單鏈表

&#x1f308; 個人主頁&#xff1a;白子寰 &#x1f525; 分類專欄&#xff1a;C打怪之路&#xff0c;python從入門到精通&#xff0c;數據結構&#xff0c;C語言&#xff0c;C語言題集&#x1f448; 希望得到您的訂閱和支持~ &#x1f4a1; 堅持創作博文(平均質量分82)&#…

c++編程14——STL(3)list

歡迎來到博主的專欄&#xff1a;c編程 博主ID&#xff1a;代碼小豪 文章目錄 list成員類型構造、析構、與賦值iterator元素訪問修改元素list的操作 list list的數據結構是一個鏈表&#xff0c;準確的說應該是一個雙向鏈表。這是一個雙向鏈表的節點結構&#xff1a; list的使用…

Vue學習筆記3——事件處理

事件處理 1、事件處理器&#xff08;1&#xff09;內聯事件處理器&#xff08;2&#xff09;方法事件處理器 2、事件參數3、事件修飾符 1、事件處理器 我們可以使用v-on 指令(簡寫為)來監聽DOM事件&#xff0c;并在事件觸發時執行對應的JavaScript。 用法: v-on:click"me…

JVM學習-執行引擎

執行引擎 執行引擎是Java虛擬機核心組成部分之一虛擬機是一個相對于物理機的概念&#xff0c;這兩種機器都有代碼執行能力&#xff0c;其區別是物理機的執行引擎是直接建立在處理器、緩存、指令集和操作系統層面上的&#xff0c;而虛擬機的執行引擎是由軟件自行實現的&#xf…

【算法】遞歸、搜索與回溯——簡介

簡介&#xff1a;遞歸、搜索與回溯&#xff0c;本節博客主要是簡單記錄一下關于“遞歸、搜索與回溯”的相關簡單概念&#xff0c;為后續算法做鋪墊。 目錄 1.遞歸1.1遞歸概念2.2遞歸意義2.3學習遞歸2.4寫遞歸代碼步驟 2.搜索3.回溯與剪枝 遞歸、搜索、回溯的關系&#xff1a; …

ICML2024 定義新隱私保護升級:DP-BITFIT新型微調技術讓AI模型學習更安全

DeepVisionary 每日深度學習前沿科技推送&頂會論文分享&#xff0c;與你一起了解前沿深度學習信息&#xff01; 引言&#xff1a;差分隱私在大模型微調中的重要性和挑戰 在當今的深度學習領域&#xff0c;大型預訓練模型的微調已成為提高各種任務性能的關鍵技術。然而&am…

推特熱帖:大語言模型自薦能夠替代的20種人類工作!快來看你是否需要轉行!

最近推特上有一個例子引起了廣泛的討論&#xff0c;事情的起因是這樣的&#xff1a;網友讓 GPT-4o 預測一下自己未來將會替代人類哪些工作&#xff1f; 這聽起來很有趣&#xff01;GPT-4o會給出什么樣的預測呢&#xff1f; 3.5研究測試&#xff1a;hujiaoai.cn 4研究測試&…

02-Linux【基礎篇】

一、Linux的目錄結構 1.基本介紹 Linux的文件系統采用層級式的樹狀目錄結構&#xff0c;在此結構中的最上層是根目錄"/"&#xff0c;然后在此目錄下再創建其他的目錄 深刻理解Linux樹狀文件目錄是非常重要的 記住一句經典的話&#xff1a;在Linux世界里&#xff…

如何在 DigitalOcean Droplet 云主機上創建 Ubuntu 服務器

在本文中&#xff0c;你將通過 DigitalOcean 的管理面板創建一個 Ubuntu 服務器&#xff0c;并將其配置為使用你的 SSH 密鑰。設置好服務器后&#xff0c;你可以在其上部署應用程序和網站。 本教程是DigitalOcean云課程簡介的一部分&#xff0c;它指導用戶完成將應用程序安全地…

win10右鍵沒有默認打開方式的選項的處理方法

問題描述 搞了幾個PDF書籍學習一下&#xff0c;不過我不想用默認的WPS打開&#xff0c;因為WPS太惡心人了&#xff0c;占用資源又高。我下載了個Sumatra PDF&#xff0c;這時候我像更改pdf文件默認的打開程序&#xff0c;發現右擊沒有這個選項。 問題解決 右擊文件–屬性–…

汽車以太網發展現狀及挑戰

一、汽車以太網技術聯盟 目前推動汽車以太網技術應用與發展的組織包括&#xff1a;OPEN Alliance&#xff08;One-Pair Ether-Net Alliance SIG&#xff09;聯盟&#xff0c;主要致力于汽車以太網推廣與使用&#xff0c;該聯盟通過推進 BroadR- Reach 單對非屏蔽雙絞線以太網傳…

設計新境界:大數據賦能UI的創新美學

設計新境界&#xff1a;大數據賦能UI的創新美學 引言 隨著大數據技術的蓬勃發展&#xff0c;它已成為推動UI設計創新的重要力量。大數據不僅為界面設計提供了豐富的數據資源&#xff0c;還賦予了設計師以全新的視角和工具來探索美學的新境界。本文將探討大數據如何賦能UI設計…

面試八股之JVM篇3.5——垃圾回收——G1垃圾回收器

&#x1f308;hello&#xff0c;你好鴨&#xff0c;我是Ethan&#xff0c;一名不斷學習的碼農&#xff0c;很高興你能來閱讀。 ??目前博客主要更新Java系列、項目案例、計算機必學四件套等。 &#x1f3c3;人生之義&#xff0c;在于追求&#xff0c;不在成敗&#xff0c;勤通…