單點登錄方案調研與實現

作用

在一個系統登錄后,其他系統也能共享該登錄狀態,無需重新登錄。

演進

cookie → session → token →單點登錄

Cookie

可以實現瀏覽器和服務器狀態的記錄,但Cookie會出現存儲體積過大和可以在前后端修改的問題

Session

為了解決Cookie的數據敏感問題,Session應運而生。

  • 常見的實現方式是基于Cookie。只將口令放置Cookie,通過口令實現前后端數據的映射,大部分數據存儲于服務器的session中,這里會有一個全局sessions去存儲每個用戶的session,并設置每個的有效期,一般20分鐘。超時則重新生成和更新全局sessions。
  • 分布式問題:通常服務器是集群,用戶的請求會走到負載均衡,不一定打在同一臺登錄請求的機器上,那不就 session 失效了嗎
    • 解決方案:
      • 第一種,把 session 集中存儲,給個獨立的 redis 或普通數據庫
      • 第二種,將相同 ip 請求的負載均衡都打在同一臺機器上。
    • 通常是第一種,因為第二種的同一臺機器會出現請求過多宕機的問題。

token

  • 解決場景

    session 的維護給服務端造成很大困擾,我們必須找地方存放它,又要考慮分布式的問題,甚至要單獨為了它啟用一套 Redis 集群。有沒有更好的辦法?——token

    登錄場景不需要往 session 存太多東西,那為何不直接打包到 cookie 中呢?這樣服務端就不用存了,每次核驗 cookie 帶的 token 有效性就可以了,還可以存一些輕量的信息。

  • HTTP 頭部

    token 認證則不需要后臺保存,token一般放在HTTP請求頭的 Authorization 中

  • 流程

    • 輸入用戶密碼,通過的話,服務器返回 token
    • 瀏覽器每次攜帶該 token 去請求數據

來源

最早起源于多服務器間 session 數據一致的問題。

方案

關鍵如何讓 Session ID(或 Token 在多個域中共享)

不同的項目情況,適用不同的方案,適合的才是最好的

按照域名劃分方式分類:

同主域

一個企業,一般情況下只有一個域名,通過二級域名區分不同的系統。

二級域名不同也算跨域。當協議,域名,端口其中一個不同時,就算跨域了。

例如 aliyun.com,其他業務系統分別為:a.aliyun.comb.aliyun.com ,要做單點登錄,需要一個登錄系統,叫做 account.aliyun.com ,我們只要在 acount.aliyun.com 登錄了,a.aliyun.comb.aliyun.com 也登陸了

實現

  • 方法一: Root Cookie 方式
    • 原理:同一域名下的不同子域名屬于同一主域名,主域名下的 cookie 在不同子域名中都是可見的。

    • 將得到的 ticket 寫入根 Cookie 里,通過修改 domain。這一步前后端擇一寫即可

      利用二級域名寫一級域名的 Cookie, acount.aliyun.com 登錄后,可將 cookie 的域設置為頂域,即 .aliyun.com ,這樣所有的子域都可以訪問到頂域的 cookie

      • 前端:react 和 vue 都有 js-cookie 包

        import Cookies from 'js-cookie'
        Cookies.set('key', 'value', { domain: 'localhost' })
        

        前提:后端沒有配置 httpOnly,否則無法通過 document.cookie 方式讀寫,但有些瀏覽器仍支持寫入。

      后端:java

      Cookie cookie = new Cookie("key", "value");cookie.setDomain('.example.com')
      

      無需在 domain 后加上端口號。設置完后,同主域名的網址打開瀏覽器的存儲,便能看到 cookie 了。

    • 總結:實現簡單,不支持跨主域名的方式

  • 方法二:postMessage + iframe 方案,無需后端參與
    • 可以實現同主域和不同主域,不同的是同主域的實現即便關閉后,再打開也沒問題。不同主域的,關閉后就不會保存了。監聽 message 的同時,在 postMessage 后,窗口就會觸發了。

    • cross-storage 庫,實現了對該方案的封裝

      • 原理:類似中轉站,所有的登錄信息的存儲或獲取都通過該中轉站
      • 使用注意
        • 如果無法連接成功的,可以考慮將初始化代碼放入 html 中,并單獨開啟一個服務器(例如小型 node),用來對該頁面的訪問。

        • CrossStorageHub.init 時,localhost 和 域名都要寫上

          CrossStorageHub.init([{origin: /.*localhost:808\d$/, allow: ['get', 'set', 'del']},{origin: /.*data.com:300\d$/, allow: ['get', 'set', 'del']}
          }]
          
    • 缺陷:Safari 瀏覽器不兼容該方案

      • 原因:postMessage + iframe(cross-storage)由于 safari 瀏覽器只支持和 iframe 通信,不支持新窗口通信,無論是通過 iframe.src 帶上 token 的 query 還是通過 postMessage 存儲到 localStorage 里。新打開一個窗口后,localStorage 里都沒有之前的存儲值。
        在這里插入圖片描述

      • cross-storage 的文檔,也給出了降級方案

        • 可以采用 root cookie 方式
        • 讓服務端返回的方式
        • 直接去改變safari瀏覽器的配置。 (不建議)

        在這里插入圖片描述

        • 跳轉的 url 鏈接帶上該 token 的 query,前提是要點擊后才能觸發。再保存到本地

不同主域

實現:

  • 方法一:

    部署一個 SSO 認證中心,專門負責處理登錄請求(登錄、登出、獲取用戶信息、當前用戶狀態),是單點登錄的標準做法。

    類似中轉站,所有子系統的登錄都要詢問一遍這個中轉站

    CAS: 基于 SSO 認證中心的開源項目代表,Central Authentication Service 即中央認證服務

  • 方法二:iframe + postMessage 的方式

    同上

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

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

相關文章

【其他數學】結式 resultant

結式 resultant 2023年11月30日 #analysis 文章目錄 結式 resultant介紹Sylvester矩陣應用在消元中的應用傳遞函數的化簡 下鏈 介紹 結式用來計算曲線的交點、消元、找參數化曲線的隱含方程。 為了引出定義,思考如下問題: f ( x ) x 2 ? 5 x 6 g (…

UVM建造測試用例

(1)加入base_test 在一個實際應用的UVM驗證平臺中,my_env并不是樹根,通常來說,樹根是一個基于uvm_test派生的類。真正的測試用例都是基于base_test派生的一個類。 class base_test extends uvm_test;my_env e…

14-2(C++11)類型推導、類型計算

14-2(C11)類型推導、類型計算 類型推導auto關鍵字auto類型推斷本質auto與引用 聯用auto關鍵字的使用限制 類型計算類型計算分類與類型推導相比四種類型計算的規則返回值后置 類型推導 auto關鍵字 C98中,auto表示棧變量,通常省略…

Leetcode刷題筆記題解(C++):25. K 個一組翻轉鏈表

思路&#xff1a;利用棧的特性&#xff0c;K個節點壓入棧中依次彈出組成新的鏈表&#xff0c;不夠K個節點則保持不變 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

在國內,現在月薪1萬是什么水平?

看到網友發帖問&#xff1a;現在月薪1W是什么水平&#xff1f; 在現如今的情況下&#xff0c;似乎月薪過萬這個標準已經成為衡量個人能力的一個標準了&#xff0c;尤其是現在互聯網橫行的時代&#xff0c;好像年入百萬&#xff0c;年入千萬就應該是屬于大眾的平均水平。 我不是…

kafka入門(四):消費者

消費者 (Consumer ) 消費者 訂閱 Kafka 中的主題 (Topic) &#xff0c;并 拉取消息。 消費者群組&#xff08; Consumer Group&#xff09; 每一個消費者都有一個對應的 消費者群組。 一個群組里的消費者訂閱的是同一個主題&#xff0c;每個消費者接收主題的一部分分區的消息…

大師學SwiftUI第18章Part2 - 存儲圖片和自定義相機

存儲圖片 在前面的示例中&#xff0c;我們在屏幕上展示了圖片&#xff0c;但也可以將其存儲到文件或數據庫中。另外有時使用相機將照片存儲到設備的相冊薄里會很有用&#xff0c;這樣可供其它應用訪問。UIKit框架提供了如下兩個保存圖片和視頻的函數。 UIImageWriteToSavedPh…

JAVA后端自學技能實操合集

JAVA后端自學技能實操 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習FastDFS使用docker安裝FastDFS(linux)集成到springboot項目中 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習 FastDFS 組名&#xff1a;文件上傳后所在的 st…

leetcode 100.相同的樹

涉及到遞歸&#xff0c;最好多畫圖理解&#xff0c;希望對你們有幫助 100.相同的樹 題目 給你兩棵二叉樹的根節點 p 和 q &#xff0c;編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 題目鏈接…

GPIO的使用--滴答定時器--pir人體紅外傳感器

目錄 一、滴答定時器的使用與原理 1、定義 2、原理 &#xff08;1&#xff09;向上計數?編輯 &#xff08;2&#xff09;向下計數 &#xff08;3&#xff09; 代碼流程 a、配置滴答時鐘喚醒頻率 b、滴答時鐘中斷函數 &#xff08;4&#xff09;結果 3、優化-->寄存…

Proxy Hook Trace JSON

Proxy var window {key: "qww",age: 22 } window new Proxy(window, {get(target, p, receiver) {console.log("target: ", target);console.log("p: ", p);// return window[username];/// 這里如果這樣寫. 有遞歸風險的...// return Reflec…

【線性代數與矩陣論】Jordan型矩陣

Jordan型矩陣 2023年11月3日 #algebra 文章目錄 Jordan型矩陣1. 代數重數與幾何重數2. Jordan塊與Jordan標準型2.1 最小多項式與Jordan標準型2.2 兩類重要矩陣 3. 矩陣的Jordan分解3.1 Jordan分解的應用 下鏈 1. 代數重數與幾何重數 在對向量做線性變換時&#xff0c;向量空間…

讀書筆記-《數據結構與算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通過構建有序序列&#xff0c;對于未排序序列&#xff0c;在已排序序列中從后向前掃描(對于單向鏈表則只能從前往后遍歷)&#xff0c;找到相應位置并插入。實現上通常使用in-place排序(需用到O(1)的額外空間) 從第一個元素開始&#xff0c;該元素可…

如何主持一場知識競賽搶答賽

知識競賽主持說難不難&#xff0c;說簡單也不簡單&#xff0c;我就從易到難介紹一下。 入門級&#xff0c;題主不用練習太多其他花哨的技巧&#xff0c;只要注意一點&#xff0c;熟悉比賽流程。知識競賽需要給所有選手一個公平流暢的答題環境&#xff0c;所以題主自身必須非常…

干貨!接口中的大事務,該如何進行優化?

作為后端開發的程序員&#xff0c;我們常常會的一些相對比較復雜的邏輯&#xff0c;比如我們需要給前端寫一個調用的接口&#xff0c;這個接口需要進行相對比較復雜的業務邏輯操作&#xff0c;比如會進行&#xff0c;查詢、遠程接口或本地接口調用、更新、插入、計算等一些邏輯…

掌握iText:輕松處理PDF文檔-進階篇

簡體中文寫入 iText本身對簡體中文的支持有限&#xff0c;但可以通過引入額外的字體包來增強其對簡體中文的支持。例如&#xff0c;可以使用iTextAsian.jar這個亞洲字體包&#xff0c;它包含了幾種簡單的亞洲字體&#xff0c;其中包括簡體中文字體。只需要將iTextAsian.jar放到…

springboot 啟動之后報錯:Unsatisfied dependency through field ‘bbbClient’

springboot 啟動之后報錯&#xff1a;UnsatisfiedDepencyException:Error creating bean with name ‘aaaServiceImpl’: Unsatisfied dependency through field ‘bbbClient’。 這兩天一直在進行著日常 debugger 查看代碼。可是發生了一個挺“靈異”的事件。那就是我看的項目…

46. 全排列

46. 全排列 原題鏈接&#xff1a;完成情況&#xff1a;解題思路&#xff1a;參考代碼&#xff1a;_46全排列_構建數組回溯_46全排列_直接構建 錯誤經驗吸取 原題鏈接&#xff1a; 46. 全排列 https://leetcode.cn/problems/permutations/description/ 完成情況&#xff1a;…

codeforces D.In Love

思路 用兩個 m u l t i s e t multiset multiset 分別存 l , r l,r l,r 。你也可以寫平衡樹在 l l l 的 m u l t i s e t multiset multiset 里去查詢是否存在比最小的 r r r 大的 l l l 。 Think Twice, Code Once #include<bits/stdc.h> #define il inline #d…

小模型學習(1)-人臉識別

【寫作背景】因為最近一直在研究大模型&#xff0c;在與客戶進行交流時&#xff0c;如果要將大模型的變革性能力講清楚&#xff0c;就一定要能將AI小模型的一些原理和效果講清楚&#xff0c;進而形成對比。當然這不是一件簡單的事情&#xff0c;一方面大模型分析問題的的本質原…