Spring OAuth2:開發者的安全盾牌!(上)

何利用Spring OAuth2構建堅不可摧的安全體系?如何使用 OAuth2 從跨域挑戰到性能優化,每一個環節都為你的應用保駕護航?

文章目錄

  • Spring OAuth2 詳解
    • 1. 引言
      • 簡述OAuth2協議的重要性
      • Spring Framework對OAuth2的支持概述
    • 2. 背景介紹
      • 2.1 OAuth2協議基礎
        • 協議發展歷程
        • 四種授權模式概述
      • 2.2 Spring Security與OAuth2集成
        • Spring Security的作用
        • OAuth2在Spring生態中的位置
    • 3. OAuth2核心組件
      • 3.1 資源所有者
        • 用戶與授權過程
      • 3.2 客戶端
        • 公開、保密客戶端區別
      • 3.3 授權服務器
        • 功能與職責
        • 令牌類型介紹
      • 3.4 保護資源服務器
        • 如何驗證訪問令牌
    • 4. 實現授權碼模式
      • 4.1 流程解析
        • 請求授權碼
        • 交換令牌
        • 訪問受保護資源
      • 4.2 Spring配置示例
        • 定義安全配置
        • 配置授權與令牌端點
    • 5. 簡化模式與隱式授權
      • 5.1 適用場景對比
        • 簡化模式特點
        • 隱式授權風險
      • 5.2 實踐指導
        • 配置調整與實現要點

在這里插入圖片描述

Spring OAuth2 詳解

1. 引言

想象一下,你是一個在數字世界中的冒險者,你有一個寶箱,里面裝滿了你的個人數據和應用權限。這個寶箱非常珍貴,你不想隨便讓人打開。但是,你需要與朋友分享一些寶物,比如你的相冊或者你的游戲分數。這時候,OAuth2協議就像是一個聰明的管家,它可以幫助管理誰可以訪問你的寶箱,以及訪問的權限有多大。

簡述OAuth2協議的重要性

OAuth2協議就像是數字世界中的一把鑰匙,它允許用戶授權第三方應用訪問他們的數據,而無需分享他們的用戶名和密碼。這就像是一個信任的橋梁,連接用戶、應用和數據。它的重要性在于:

  • 安全性:保護用戶的賬戶信息,避免直接暴露敏感數據。
  • 靈活性:支持多種授權模式,適應不同的應用場景。
  • 擴展性:允許第三方應用在用戶授權的情況下,訪問和操作用戶數據。

Spring Framework對OAuth2的支持概述

Spring Framework,這個強大的后端開發框架,對OAuth2的支持就像是給這個寶箱加上了一把高科技的鎖。Spring Security是一個全面的安全框架,它與OAuth2的集成使得在Spring應用中實現安全、靈活的授權變得簡單。

  • 集成:Spring Security提供了與OAuth2協議的無縫集成。
  • 簡化:通過Spring的配置和注解,簡化了OAuth2的實現過程。
  • 擴展:支持自定義擴展,以滿足特定需求。

想象一下,你是一個開發者,你正在構建一個應用,你需要確保用戶數據的安全,同時也要讓其他應用能夠安全地訪問這些數據。OAuth2和Spring Security的結合,就像是給你的數字寶箱加上了一把智能鎖,讓你可以輕松管理誰可以訪問,以及訪問的權限有多大。

這就是為什么OAuth2協議和Spring Framework對它的支持如此重要。它們不僅保護了用戶的隱私,還為開發者提供了一個強大而靈活的工具,以構建安全、可靠的應用程序。接下來,我們將深入探討OAuth2的背景和核心組件,以及如何在Spring中實現它。準備好了嗎?讓我們開始這段有趣的旅程吧!

2. 背景介紹

2.1 OAuth2協議基礎

在數字世界的冒險旅程中,我們來到了一個叫做OAuth2的神秘島嶼。這個島嶼上,有一個古老的協議,它幫助保護著島上居民的寶貴資源。這個協議,就是OAuth2。

協議發展歷程

OAuth2協議的誕生,可以追溯到一個叫做OAuth1的前輩。OAuth1是一個強大的守護者,但它有點復雜,使用起來不太方便。隨著時間的推移,島上的居民們需要一個更簡單、更靈活的方式來保護他們的資源。于是,OAuth2誕生了,它不僅繼承了前輩的優點,還加入了更多的創新和靈活性。

四種授權模式概述

OAuth2協議有四種授權模式,就像是島上的四種不同的守護獸,每種都有其獨特的能力:

  1. 授權碼模式:這是最常用的守護獸,它通過一個安全的中間人(授權服務器)來交換訪問令牌。
  2. 簡化模式:這個守護獸適合快速簡單的任務,它直接在URL中傳遞令牌,但要小心,因為它可能會暴露令牌。
  3. 密碼模式:這個守護獸信任用戶,允許用戶直接提供他們的憑證來獲取令牌。
  4. 客戶端憑證模式:這個守護獸是為島上的內部服務設計的,它允許服務之間直接使用客戶端ID和密鑰來交換令牌。

2.2 Spring Security與OAuth2集成

現在,讓我們轉向另一個強大的盟友——Spring Security。Spring Security是一個全面的安全框架,它與OAuth2的集成,就像是給島上的居民提供了一個更加強大的保護系統。

Spring Security的作用

Spring Security的作用就像是島上的守護神,它保護著島上的居民和他們的資源不受外來侵害。它提供了:

  • 認證:確保訪問者是他們聲稱的那個人。
  • 授權:確保訪問者有權限訪問他們請求的資源。
OAuth2在Spring生態中的位置

OAuth2在Spring生態中的位置,就像是島上的守護塔,它連接著Spring Security和島上的居民。通過Spring Security的OAuth2支持,開發者可以:

  • 輕松實現:通過Spring的配置和注解,簡化OAuth2的實現。
  • 高度定制:根據需要定制授權流程和令牌管理。
  • 無縫集成:與Spring的其他安全特性無縫集成,如CSRF保護、會話管理等。

通過這個集成,開發者可以構建既安全又靈活的應用,保護用戶的資源,同時允許第三方應用在用戶授權的情況下訪問這些資源。這就像是在數字世界中的冒險旅程中,找到了一個既強大又可靠的伙伴,幫助我們安全地探索未知的領域。

現在,我們已經了解了OAuth2協議的背景和它在Spring生態中的位置。接下來,我們將深入探討OAuth2的核心組件,以及如何在Spring中實現它。準備好了嗎?讓我們繼續這段旅程,探索更多的秘密吧!
在這里插入圖片描述

3. OAuth2核心組件

3.1 資源所有者

想象一下,你是一個擁有豐富寶藏的海盜船長,你的寶藏就是你的個人數據。在OAuth2的世界里,你就是資源所有者。你的寶藏被鎖在一個安全的箱子里,只有你才能決定誰可以打開它。

用戶與授權過程

當你想分享你的寶藏(數據)給其他海盜(第三方應用)時,你不會直接給他們鑰匙(用戶名和密碼)。相反,你給他們一張藏寶圖(授權碼),他們可以用這張圖來找到你的寶藏守護者(授權服務器),并從守護者那里得到進入寶藏箱的鑰匙(訪問令牌)。

3.2 客戶端

在這個故事中,客戶端就像是那些想要訪問你寶藏的海盜。他們需要你的允許才能拿到寶藏。

公開、保密客戶端區別
  • 公開客戶端:這些是那些在開放海域(公共環境)中的海盜,他們不能保守秘密。因此,他們的客戶端密鑰(如果他們有的話)不能保密,可能會被任何人看到。
  • 保密客戶端:這些海盜在他們的船艙里(安全環境)操作,他們可以保守秘密。他們的客戶端密鑰是保密的,只有他們自己知道。

3.3 授權服務器

授權服務器是這個故事中的寶藏守護者。他們負責管理誰可以訪問寶藏。

功能與職責

授權服務器的職責包括:

  • 驗證請求:確保請求訪問寶藏的海盜是經過資源所有者(你)授權的。
  • 發放令牌:一旦驗證通過,授權服務器會給海盜發放訪問寶藏的鑰匙(訪問令牌)。
令牌類型介紹

授權服務器會發放幾種不同類型的鑰匙:

  • 訪問令牌:這是進入寶藏箱的主要鑰匙。
  • 刷新令牌:這是一種特殊的鑰匙,可以在訪問令牌過期后用來獲取新的訪問令牌,而不需要再次進行完整的授權過程。

3.4 保護資源服務器

保護資源服務器是寶藏箱本身,它需要確保只有持有正確鑰匙的人才能打開它。

如何驗證訪問令牌

當一個海盜(客戶端)帶著鑰匙(訪問令牌)來到寶藏箱前,保護資源服務器會:

  • 檢查令牌:確保令牌是有效的,沒有過期,且是由授權服務器發放的。
  • 驗證權限:確保令牌對應的權限允許海盜訪問他們請求的寶藏部分。

例子

假設你有一個在線相冊應用,用戶(資源所有者)想要通過第三方應用分享他們的相冊。用戶會通過你的應用(授權服務器)授權第三方應用。你的應用會發放一個訪問令牌給第三方應用,第三方應用隨后可以使用這個令牌來訪問用戶的相冊(受保護的資源)。

代碼示例

// 用戶請求訪問令牌
@GetMapping("/authorize")
public String authorizeUser(@RequestParam("client_id") String clientId,@RequestParam("redirect_uri") String redirectUri,@RequestParam("response_type") String responseType,HttpSession session) {// 驗證客戶端ID等信息...// 假設用戶同意授權session.setAttribute("client_id", clientId);return "redirect:" + redirectUri + "?code=some_auth_code";
}// 第三方應用使用授權碼交換訪問令牌
@PostMapping("/token")
public ResponseEntity<?> getAccessToken(@RequestBody MultiValueMap<String, String> requestBody,HttpServletRequest request) {// 驗證授權碼、客戶端ID和密鑰...// 發放訪問令牌return ResponseEntity.ok(new AccessToken("access_token", "refresh_token", "user_id"));
}

在這段代碼中,我們創建了兩個簡單的端點:一個用于用戶授權,另一個用于使用授權碼交換訪問令牌。這只是一個簡化的例子,實際應用中會有更多的安全檢查和復雜邏輯。

通過這些核心組件,OAuth2協議確保了用戶數據的安全和合理的訪問控制。在下一章中,我們將深入探討如何實現授權碼模式,并提供更多的代碼示例和實踐指導。準備好了嗎?讓我們繼續這段有趣的旅程!

4. 實現授權碼模式

4.1 流程解析

在OAuth2的冒險故事中,授權碼模式就像是一場精心設計的尋寶游戲。在這個游戲中,海盜們(客戶端)需要通過一系列的步驟來獲取寶藏(受保護的資源)。

請求授權碼

第一步,海盜們需要向寶藏守護者(授權服務器)請求一張藏寶圖(授權碼)。他們需要提供一些信息,比如他們是誰(客戶端ID),他們想要訪問的寶藏(資源所有者的同意),以及他們成功獲取寶藏后應該去哪里(重定向URI)。

這個過程可以用以下步驟概括:

  1. 客戶端重定向用戶:客戶端將用戶重定向到授權服務器的授權端點。
  2. 用戶登錄:用戶在授權服務器上登錄并驗證自己的身份。
  3. 授權同意:用戶同意授權客戶端訪問他們的資源。
  4. 授權服務器發放授權碼:如果用戶同意,授權服務器將發放一個授權碼給客戶端。
交換令牌

第二步,海盜們(客戶端)拿著藏寶圖(授權碼)回到寶藏守護者那里,請求換取真正的鑰匙(訪問令牌)。

這個過程包括:

  1. 客戶端發送授權碼:客戶端將授權碼發送到授權服務器的令牌端點。
  2. 授權服務器驗證授權碼:授權服務器驗證授權碼的有效性。
  3. 發放訪問令牌:如果授權碼有效,授權服務器發放訪問令牌和刷新令牌。
訪問受保護資源

最后一步,海盜們拿著真正的鑰匙(訪問令牌)來到寶藏箱(受保護資源服務器)前,展示他們的鑰匙以訪問寶藏。

  1. 客戶端發送訪問令牌:客戶端將訪問令牌發送到受保護資源服務器。
  2. 受保護資源服務器驗證訪問令牌:服務器驗證訪問令牌的有效性。
  3. 提供資源:如果訪問令牌有效,服務器提供請求的資源。

4.2 Spring配置示例

現在,讓我們用Spring的語言來編寫這個故事,看看如何配置授權碼模式。

定義安全配置

首先,我們需要定義一個安全配置,告訴Spring如何保護我們的寶藏。

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {// 省略了其他配置,比如數據庫連接、客戶端詳情服務等@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.authorizationCodeServices(new AuthorizationCodeServices()).tokenStore(tokenStore())// 其他配置...;}// 配置授權碼服務、令牌存儲等
}
配置授權與令牌端點

接下來,我們需要配置授權端點和令牌端點,這樣海盜們就知道如何請求藏寶圖和真正的鑰匙。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/authorize**").permitAll() // 授權端點對所有人開放.anyRequest().authenticated() // 其他請求需要認證.and().oauth2Login() // 配置OAuth2登錄.and()// 其他配置...;}
}

在這個配置中,我們告訴Spring哪些端點是公開的(比如授權端點),哪些需要用戶認證。我們還配置了OAuth2登錄,這樣用戶就可以登錄并授權訪問他們的資源。

例子

假設你正在構建一個在線圖書館應用,用戶可以借閱電子書。第三方應用(比如一個閱讀統計應用)想要訪問用戶的借閱歷史。用戶通過你的應用授權第三方應用,第三方應用使用授權碼模式來獲取訪問令牌,并訪問用戶的借閱歷史。

代碼示例

// 用戶訪問授權端點
@GetMapping("/authorize")
public String authorize(@RequestParam("response_type") String responseType,@RequestParam("client_id") String clientId,@RequestParam("redirect_uri") String redirectUri,@RequestParam("scope") String scope,HttpSession session) {// 這里會進行用戶認證和授權同意的邏輯// 發放授權碼return "redirect:" + redirectUri + "?code=some_auth_code";
}// 客戶端使用授權碼交換訪問令牌
@PostMapping("/token")
public ResponseEntity<?> exchangeForAccessToken(@RequestBody MultiValueMap<String, String> parameters,HttpServletRequest request) {// 驗證授權碼,發放訪問令牌AccessToken accessToken = new AccessToken("access_token", "refresh_token", "user_id");return ResponseEntity.ok(accessToken);
}

在這些代碼示例中,我們創建了授權端點和令牌端點,用戶可以通過這些端點進行授權和交換訪問令牌。這些只是簡化的示例,實際應用中會有更多的安全檢查和復雜邏輯。

通過這些步驟和配置,我們就可以在Spring中實現授權碼模式,確保用戶資源的安全訪問。在下一章中,我們將探討簡化模式與隱式授權,看看它們是如何工作的,以及它們適用的場景。準備好了嗎?讓我們繼續這段尋寶之旅!
在這里插入圖片描述

5. 簡化模式與隱式授權

5.1 適用場景對比

在OAuth2的世界里,除了授權碼模式這個尋寶游戲,還有兩種更簡單、更直接的方式,那就是簡化模式和隱式授權。

簡化模式特點

簡化模式就像是一張快速通行證,它允許海盜們(客戶端)在不需要寶藏守護者(授權服務器)的情況下,直接從用戶(資源所有者)那里獲取訪問令牌。這種方式適合于那些海盜們已經獲得了用戶信任的情況。

  • 適用場景:用戶與客戶端之間有高度信任,例如,客戶端是用戶自己的設備上的應用程序。
  • 優點:流程簡單,不需要服務器間的交互。
  • 缺點:訪問令牌可能會在不安全的環境中傳輸,增加了安全風險。
隱式授權風險

隱式授權就像是一張沒有經過寶藏守護者驗證的藏寶圖,海盜們可以直接使用這張圖來獲取寶藏。這種方式雖然方便,但也存在一些風險。

  • 適用場景:適用于客戶端無法安全存儲客戶端密鑰的情況,如純前端應用。
  • 風險:訪問令牌可能會在URL中暴露,增加了被截獲的風險。

5.2 實踐指導

配置調整與實現要點

在使用簡化模式或隱式授權時,我們需要對Spring Security的配置進行一些調整,以適應這些模式的特點。

配置示例

@Configuration
public class OAuth2Config extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests()// 允許所有用戶訪問簡化模式和隱式授權的端點.antMatchers("/login", "/oauth2/authorize").permitAll().anyRequest().authenticated().and().oauth2Login().and()// 其他配置...;}
}

在這個配置中,我們允許所有用戶訪問登錄和授權端點,這些端點是簡化模式和隱式授權的關鍵部分。

例子

假設你正在構建一個社交媒體應用,用戶可以通過他們的智能手表(一個沒有服務器端點的客戶端)來發布狀態更新。在這種情況下,簡化模式就非常合適,因為智能手表可以安全地存儲訪問令牌,并且用戶對其有高度信任。

代碼示例

// 用戶登錄并授權客戶端
@GetMapping("/login")
public String login(@RequestParam("client_id") String clientId,@RequestParam("response_type") String responseType,@RequestParam("redirect_uri") String redirectUri,HttpSession session) {// 用戶登錄邏輯...// 假設用戶已登錄并授權session.setAttribute("client_id", clientId);return "redirect:" + redirectUri + "?access_token=some_access_token&token_type=bearer";
}// 客戶端直接從響應中獲取訪問令牌
// 這通常在客戶端的JavaScript代碼中處理

在簡化模式中,客戶端直接從用戶那里獲取訪問令牌,而不需要通過授權服務器。這種方式簡化了流程,但需要確保客戶端能夠安全地處理訪問令牌。

通過這些配置和實踐指導,我們可以在Spring中實現簡化模式和隱式授權,同時注意它們的適用場景和潛在風險。在下一章中,我們將探討客戶端憑證模式和密碼模式,這兩種模式適用于不同的場景,并且有其獨特的實現方式。準備好了嗎?讓我們繼續這段OAuth2的冒險旅程!

踏上這段激動人心的數字探險,我們像探險家一樣,揭開了OAuth2協議的神秘面紗,探索了Spring Framework如何巧妙地與它融合。我們穿梭在授權的海洋中,發現了資源所有者、客戶端、授權服務器和保護資源服務器這些角色的秘密,它們共同編織了一場華麗的舞會。跟隨授權碼模式的地圖,我們像海盜一樣尋找寶藏,一步步解鎖了令牌的奧秘。而在簡化模式與隱式授權的鋼絲上,我們體驗了速度與風險的雙重游戲。

但這只是冰山一角,我們的旅程才剛剛開始。接下來的路途中,更多未知的挑戰和深層的秘密正等著我們去發掘。深入授權模式的迷宮,探索高級安全策略的堡壘,甚至可能遇到一些出人意料的陷阱和難題。系緊你的冒險裝備,保持你的好奇心,繼續跟隨我們的指南針,因為在這段探險的下一個轉角,總有新的驚喜在等待著勇敢的你!

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

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

相關文章

比較Rust和Haskel

在比較Rust和Haskell時&#xff0c;我們可以從多個維度來分析它們各自的優勢。以下是Rust相對于Haskell的優勢&#xff0c;以及Haskell相對于Rust的優勢&#xff1a; Rust比Haskell強的方面&#xff1a; 內存安全與并發性&#xff1a; Rust通過獨特的所有權系統和借用檢查器在…

智能倉儲物流系統(WMS)系列-管理查詢調整

好的應用系統應是細分簡單&#xff0c;界面簡潔易操作&#xff0c;程序代碼簡潔易懂的。

史上最全排序算法整理(2)

本篇文章我們將接著上篇繼續介紹常見的排序算法&#xff0c;有需要的小伙伴可以移步史上最全排序算法整理&#xff08;1&#xff09;查看相關內容哦 1.冒泡排序 1.1基本思想 在待排序的一組數中&#xff0c;將相鄰的兩個數進行比較&#xff0c;若前面的數比后面的數大就交換兩…

【解決npm install -g windows-build-tools的安裝問題】

解決npm install -g windows-build-tools的安裝問題 https://developer.huawei.com/consumer/cn/forum/topic/0203740461436730610?fid26

gitlab 創建 ssh 和 token

文章目錄 一、創建ssh key二、將密鑰內容復制到gitlab三、創建token 一、創建ssh key 打開控制臺cmd&#xff0c;執行命令 ssh-keygen -t rsa -C xxxxx xxxxx是你自己的郵箱 C:\Users\xx\.ssh 目錄下會創建一個名為id_rsa.pub的文件&#xff0c;用記事本打開&#xff0c;并…

基于深度學習的中文情感分析系統python flask

基于python的畢業設計 基于深度學習的中文情感分析系統(flask)(源碼說明文檔演示) 畢業設計課程設計期末大作業、課程設計、高分必看&#xff0c;下載下來&#xff0c;簡單部署&#xff0c;就可以使用。 包含&#xff1a;項目源碼、數據庫腳本、軟件工具等&#xff0c;該項目…

【Spring Cloud】微服務工程中的服務注冊與發現配置中心-Consul

Catalog Spring Cloud Consul一、需求二、是什么三、優點四、缺點五、怎么用六、細節 Spring Cloud Consul 一、需求 多個微服務之間通過RestTemplate中的api相互調用&#xff0c;一般要寫死微服務的IP地址和端口號&#xff0c;相當于硬編碼&#xff0c;非常不靈活&#xff0…

MyBatis出現:SQLSyntaxErrorException: Unknown column ‘XXX‘ in ‘field list‘

<update id"updateStudent">update tb_students set stu_name${stuName},stu_gender${stuGender},stu_age${stuAge},stu_tel${stuTel}where stu_num ${stuNum}</update> 本質上來說&#xff0c;是Mybatis使用上的錯誤&#xff0c;不熟悉&#xff0c;理…

C#知識|通過ADO.NET實現應用程序對數據庫的增、刪、改操作。

哈嘍,你好啊,我是雷工! 前邊學習了SQLServer數據庫相關的增刪改查的基本操作, 上節練習了C#通過ADO.NET技術和SQLServer數據庫建立連接和斷開連接的寫法, 本節繼續學習ADO.NET的相關操作,下面為向數據庫中插入數據的相關練習筆記。 01 向數據庫插入數據 插入數據的過程…

SQL函數--union all 使用方法及案例

1. 使用方法 在 SQL 中&#xff0c;UNION ALL 操作用于結合兩個或更多 SELECT 語句的結果集&#xff0c;包括所有匹配的行&#xff0c;甚至包括重復的行。這與 UNION 不同&#xff0c;因為 UNION 會自動刪除重復的行。 滿足條件&#xff1a; 1、兩個select查詢的列的數量必須相…

web前端柜架圖片:探索與解析

web前端柜架圖片&#xff1a;探索與解析 在web前端開發的世界里&#xff0c;圖片的處理與展示是一項至關重要的任務。而“web前端柜架圖片”這一概念&#xff0c;可能初聽起來讓人有些困惑&#xff0c;它究竟指的是什么&#xff1f;在本文中&#xff0c;我們將從四個方面、五個…

Ai速遞5.29

全球AI新聞速遞 1.摩爾線程與無問芯穹合作&#xff0c;實現國產 GPU 端到端 AI 大模型實訓。 2.寶馬工廠&#xff1a;機器狗上崗&#xff0c;可“嗅探”故障隱患。 3.ChatGPT&#xff1a;macOS 開始公測。 4.Stability AI&#xff1a;推出Stable Assistant&#xff0c;可用S…

CCF-GESP 等級考試 2023年3月認證C++一級真題

2024年03月真題 一、單選題&#xff08;每題2分&#xff0c;共30分&#xff09; 第 1 題 以下不屬于計算機輸入設備的有&#xff08; &#xff09;。 A. 鍵盤B. 音箱C. 鼠標D. 傳感器 第 2 題 計算機系統中存儲的基本單位用B來表示&#xff0c;它代表的是&#xff08; &#x…

企業網絡的“瑞士軍刀”:探索“一端多能”設備的多面性

在數字化時代&#xff0c;企業網絡需求的復雜性和多樣性不斷增長&#xff0c;傳統的單一功能網絡設備已難以滿足這些需求。企業需要一種集多種功能于一身的“一端多能”網絡設備&#xff0c;以應對各種網絡環境和業務需求&#xff0c;就像是一把多功能、靈活、可靠的瑞士軍刀&a…

一個月速刷leetcodeHOT100 day13 二叉樹結構 以及相關簡單題

樹是一種分層數據的抽象模型 二叉樹 二叉樹中的節點最多只能有兩個子節點&#xff0c;一個是左側子節點&#xff0c;另一個是右側子節點 二叉搜索樹 二叉搜索樹&#xff08;BST&#xff09;是二叉樹的一種&#xff0c;但是只允許你在左側節點存儲&#xff08;比父節點&…

測試基礎07:測試工作流程規范、進度同步與把控

課程大綱 1、迭代測試流程 2、測試流程 2.1、測試用例評審 目的&#xff1a;對齊產品需求理解&#xff0c;完善、優化測試場景。 參與方&#xff1a;項目、產品、開發、測試。 用例內容&#xff1a;冒煙用例&#xff08;主流程&#xff09; 功能用例。 2.2、冒煙測試 提測…

SOLIDWORKS正版價格多少錢

SOLIDWORKS作為目前應用較為廣泛的3D CAD軟件之一&#xff0c;具有強大的功能和實用性&#xff0c;它為各類工程設計提供綜合解決方案。但是&#xff0c;正版SOLIDWORKS價格是個不可忽視的問題。那SOLIDWORKS的正版價格究竟如何呢&#xff1f;又是受什么因素影響&#xff1f; 先…

【論文閱讀|cryoET】ICE-TIDE

簡介 三維cryoET重建的保真度進一步受到采集過程中物理擾動的影響。這些擾動以各種形式表現出來&#xff0c;例如連續采集之間的樣本漂移&#xff0c;導致連續投影未對準&#xff0c;或者由于未散射的電子而導致二維投影中的局部變形。 傳統的冷凍電子斷層掃描工作流程需要對…

單片機編程的code關鍵字的詮釋

在單片機編程中&#xff0c;code 是一個關鍵字&#xff0c;用于指示編譯器將變量存儲在程序存儲器中&#xff0c;而不是在數據存儲器中。通常情況下&#xff0c;程序存儲器的速度比數據存儲器的速度更快&#xff0c;而且程序存儲器的容量較小&#xff0c;適合存儲常量數據和程序…

mybatis加密數據庫信息

1.配置MyBatisConfig.xml <environments default"development"><!-- 默認--><environment id"development"><transactionManager type"JDBC"/><dataSource type"POOLED"><property name&quo…