精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單點登錄的實現方式有哪些

Linux愛好者 ? 來源:Linux愛好者 ? 作者:張永恒 ? 2021-02-02 14:00 ? 次閱讀

前言

實現方式一:父域 Cookie

實現方式二:認證中心

實現方式三:LocalStorage 跨域

補充:域名分級

前言

在 B/S 系統中,登錄功能通常都是基于 Cookie 來實現的。當用戶登錄成功后,一般會將登錄狀態記錄到 Session 中,或者是給用戶簽發一個 Token,無論哪一種方式,都需要在客戶端保存一些信息(Session ID 或 Token ),并要求客戶端在之后的每次請求中攜帶它們。

在這樣的場景下,使用 Cookie 無疑是最方便的,因此我們一般都會將 Session 的 ID 或 Token 保存到 Cookie 中,當服務端收到請求后,通過驗證 Cookie 中的信息來判斷用戶是否登錄 。

單點登錄(Single Sign On, SSO)是指在同一帳號平臺下的多個應用系統中,用戶只需登錄一次,即可訪問所有相互信任的應用系統。

舉例來說,百度貼吧和百度地圖是百度公司旗下的兩個不同的應用系統,如果用戶在百度貼吧登錄過之后,當他訪問百度地圖時無需再次登錄,那么就說明百度貼吧和百度地圖之間實現了單點登錄。

單點登錄的本質就是在多個應用系統中共享登錄狀態。如果用戶的登錄狀態是記錄在 Session 中的,要實現共享登錄狀態,就要先共享 Session,比如可以將 Session 序列化到 Redis 中,讓多個應用系統共享同一個 Redis,直接讀取 Redis 來獲取 Session。

當然僅此是不夠的,因為不同的應用系統有著不同的域名,盡管 Session 共享了,但是由于 Session ID 是往往保存在瀏覽器 Cookie 中的,因此存在作用域的限制,無法跨域名傳遞,也就是說當用戶在 app1.com 中登錄后,Session ID 僅在瀏覽器訪問 app1.com 時才會自動在請求頭中攜帶,而當瀏覽器訪問 app2.com 時,Session ID 是不會被帶過去的。實現單點登錄的關鍵在于,如何讓 Session ID(或 Token)在多個域中共享。

實現方式一:父域 Cookie

在將具體實現之前,我們先來聊一聊 Cookie 的作用域。

Cookie 的作用域由 domain 屬性和 path 屬性共同決定。domain 屬性的有效值為當前域或其父域的域名/IP地址,在 Tomcat 中,domain 屬性默認為當前域的域名/IP地址。path 屬性的有效值是以“/”開頭的路徑,在 Tomcat 中,path 屬性默認為當前 Web 應用的上下文路徑。

如果將 Cookie 的 domain 屬性設置為當前域的父域,那么就認為它是父域 Cookie。Cookie 有一個特點,即父域中的 Cookie 被子域所共享,換言之,子域會自動繼承父域中的Cookie。

利用 Cookie 的這個特點,不難想到,將 Session ID(或 Token)保存到父域中不就行了。沒錯,我們只需要將 Cookie 的 domain 屬性設置為父域的域名(主域名),同時將 Cookie 的 path 屬性設置為根路徑,這樣所有的子域應用就都可以訪問到這個 Cookie 了。

不過這要求應用系統的域名需建立在一個共同的主域名之下,如 tieba.baidu.com 和 map.baidu.com,它們都建立在 baidu.com 這個主域名之下,那么它們就可以通過這種方式來實現單點登錄。

總結:此種實現方式比較簡單,但不支持跨主域名。

實現方式二:認證中心

我們可以部署一個認證中心,認證中心就是一個專門負責處理登錄請求的獨立的 Web 服務。

用戶統一在認證中心進行登錄,登錄成功后,認證中心記錄用戶的登錄狀態,并將 Token 寫入 Cookie。(注意這個 Cookie 是認證中心的,應用系統是訪問不到的。)

應用系統檢查當前請求有沒有 Token,如果沒有,說明用戶在當前系統中尚未登錄,那么就將頁面跳轉至認證中心。由于這個操作會將認證中心的 Cookie 自動帶過去,因此,認證中心能夠根據 Cookie 知道用戶是否已經登錄過了。

如果認證中心發現用戶尚未登錄,則返回登錄頁面,等待用戶登錄,如果發現用戶已經登錄過了,就不會讓用戶再次登錄了,而是會跳轉回目標 URL ,并在跳轉前生成一個 Token,拼接在目標 URL 的后面,回傳給目標應用系統。

應用系統拿到 Token 之后,還需要向認證中心確認下 Token 的合法性,防止用戶偽造。確認無誤后,應用系統記錄用戶的登錄狀態,并將 Token 寫入 Cookie,然后給本次訪問放行。(注意這個 Cookie 是當前應用系統的,其他應用系統是訪問不到的。)當用戶再次訪問當前應用系統時,就會自動帶上這個 Token,應用系統驗證 Token 發現用戶已登錄,于是就不會有認證中心什么事了。

這里順便介紹兩款認證中心的開源實現:

Apereo CAS 是一個企業級單點登錄系統,其中 CAS 的意思是”Central Authentication Service“。它最初是耶魯大學實驗室的項目,后來轉讓給了 JASIG 組織,項目更名為 JASIG CAS,后來該組織并入了Apereo 基金會,項目也隨之更名為 Apereo CAS。

XXL-SSO 是一個簡易的單點登錄系統,由大眾點評工程師許雪里個人開發,代碼比較簡單,沒有做安全控制,因而不推薦直接應用在項目中,這里列出來僅供參考。

總結:此種實現方式相對復雜,支持跨域,擴展性好,是單點登錄的標準做法。

實現方式三:LocalStorage 跨域

前面,我們說實現單點登錄的關鍵在于,如何讓 Session ID(或 Token)在多個域中共享。

父域 Cookie 確實是一種不錯的解決方案,但是不支持跨域。那么有沒有什么奇淫技巧能夠讓 Cookie 跨域傳遞呢?

很遺憾,瀏覽器對 Cookie 的跨域限制越來越嚴格。Chrome 瀏覽器還給 Cookie 新增了一個 SameSite 屬性,此舉幾乎禁止了一切跨域請求的 Cookie 傳遞(超鏈接除外),并且只有當使用 HTTPs 協議時,才有可能被允許在 AJAX 跨域請求中接受服務器傳來的 Cookie。

不過,在前后端分離的情況下,完全可以不使用 Cookie,我們可以選擇將 Session ID (或 Token )保存到瀏覽器的 LocalStorage 中,讓前端在每次向后端發送請求時,主動將 LocalStorage 的數據傳遞給服務端。這些都是由前端來控制的,后端需要做的僅僅是在用戶登錄成功后,將 Session ID (或 Token )放在響應體中傳遞給前端。

在這樣的場景下,單點登錄完全可以在前端實現。前端拿到 Session ID (或 Token )后,除了將它寫入自己的 LocalStorage 中之外,還可以通過特殊手段將它寫入多個其他域下的 LocalStorage 中。

關鍵代碼如下:

pIYBAGAY6qSAOlmYAACeeFqnF0Q316.jpg

前端通過 iframe+postMessage() 方式,將同一份 Token 寫入到了多個域下的 LocalStorage 中,前端每次在向后端發送請求之前,都會主動從 LocalStorage 中讀取 Token 并在請求中攜帶,這樣就實現了同一份 Token 被多個域所共享。

總結:此種實現方式完全由前端控制,幾乎不需要后端參與,同樣支持跨域。

補充:域名分級

從專業的角度來說(根據《計算機網絡》中的定義),.com、.cn 為一級域名(也稱頂級域名),.com.cn、baidu.com 為二級域名,sina.com.cn、tieba.baidu.com 為三級域名,以此類推,N 級域名就是 N-1 級域名的直接子域名。

從使用者的角度來說,一般把可支持獨立備案的主域名稱作一級域名,如 baidu.com、sina.com.cn 皆可稱作一級域名,在主域名下建立的直接子域名稱作二級域名,如 tieba.baidu.com 為二級域名。

為了避免歧義,本人將使用“主域名“替代”一級域名“的說法。

責任編輯:xj

原文標題:單點登錄的三種實現方式

文章出處:【微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 域名
    +關注

    關注

    0

    文章

    71

    瀏覽量

    11277
  • Cookie
    +關注

    關注

    0

    文章

    30

    瀏覽量

    10401

原文標題:單點登錄的三種實現方式

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    單點位移計:從原理到應用,一文讀懂!

    與廣泛應用吧!什么是單點位移計簡單來說,單點位移計是一種用于測量物體沿某一特定方向上微小移動距離的高精度傳感器。它通過將物理位移轉換為電信號,從而實現對位移的精確監
    的頭像 發表于 11-25 15:54 ?77次閱讀
    <b class='flag-5'>單點</b>位移計:從原理到應用,一文讀懂!

    功放地和數字地應采用哪種方式

    1、功放地和數字地應采用哪種方式2、本人在電路設計中采用了單點接地方式,發現音箱時而有聲,時而無聲。經測試發現功放在工作時,數字地和功放地之間很大的脈沖電壓。請問這種脈沖電壓干擾是
    發表于 10-25 09:17

    多點觸控和單點觸控哪個好

    多點觸控和單點觸控各有其優缺點,具體哪個更好取決于應用場景和用戶需求。以下是對兩者的詳細比較:
    的頭像 發表于 10-21 15:36 ?431次閱讀

    多點觸控和單點觸控區別

     多點觸控和單點觸控是觸摸屏技術的兩種主要類型,它們在功能、應用場景以及用戶體驗等方面存在顯著差異。以下是對這兩種觸控技術的詳細比較:
    的頭像 發表于 10-21 15:35 ?681次閱讀

    交換機如何配置SSH遠程登錄

    從事網絡運維工作的小伙伴們都知道,在交換機正式上線時,必須完成配置SSH遠程登錄,這樣做目的是為了日后,維護方便,不需要每次登錄設備都要跑到機房,這樣既不現實,又費事。
    的頭像 發表于 10-10 14:33 ?909次閱讀
    交換機如何配置SSH遠程<b class='flag-5'>登錄</b>

    阻容耦合方式的優點哪些

    利用電阻和電容元件實現信號傳輸的方式。在阻容耦合電路中,信號通過電阻元件傳輸,而電容元件則起到耦合信號的作用。阻容耦合方式的基本電路結構包括輸入電阻、耦合電容、輸出電阻和負載電容。 阻容耦合
    的頭像 發表于 08-09 15:32 ?641次閱讀

    Jtti:如何在服務器擴展時避免單點故障?哪些常見的高可用性策略?

    服務器擴展是組織應對不斷增長的業務需求和數據負載的重要手段。然而,隨之而來的卻是更大規模的風險,存在單點故障可能導致整個系統的宕機,嚴重影響業務連續性和用戶體驗。 避免單點故障的策略 冗余備份 在
    的頭像 發表于 07-18 16:02 ?215次閱讀

    wds的常用組網哪幾種?

    (Point-to-Point)模式 點對點模式是WDS中最常用的一種組網方式,主要用于實現兩個或多個無線設備之間的直接通信。在這種模式下,兩個無線設備之間建立一個無線鏈路,實現數據的傳輸。這種模式適用于兩個無線設備之間的距離較
    的頭像 發表于 07-18 09:52 ?791次閱讀

    信道均衡哪些實現方式

    信道均衡的實現方式主要包括線性自動應均衡、盲均衡和半盲均衡等。這些方法各有特點,選擇哪種方法取決于具體的應用場景和性能要求。例如,如果信道變化較快,可能需要使用自適應濾波器來實現實時的信道均衡。而在信道特性較為穩定的環境中,線性
    的頭像 發表于 03-02 14:05 ?1351次閱讀

    共模扼流圈阻抗與繞線方式哪些?

    共模扼流圈阻抗與繞線方式哪些? 共模扼流圈是一種電子元件,主要用于抑制電路中的共模干擾。它通過實現電感耦合的方式,將共模信號強制繞過,從而起到濾波的作用。 共模扼流圈的阻抗與繞線
    的頭像 發表于 02-05 14:23 ?1111次閱讀

    如何遠程登錄云服務器?登錄失敗是什么原因?

    我用Linux云服務器,遇到了有關遠程登錄的一些問題,于是搜索了一些資料,整理了一篇文檔,作為記錄。如果你也遇到過 相似的問題,歡迎一起探討! 一、Linux云服務器的遠程登錄 遠程登陸linux
    發表于 02-01 15:32

    【米爾-瑞薩RZ/G2UL開發板】1.網絡傳輸及多種登錄方式

    與開發板的網段一致,點擊確定就可以。 接下來打開終端,點擊新建節點,選擇SSH,輸入開發板的IP地址,如下所示 接下來輸入開發板的登錄密碼,連接開發板 網卡登錄方式比較方便,可以直接進行文件拖拽,修改
    發表于 01-21 15:59

    變阻器在電路中的連接方式哪些?

    變阻器在電路中的連接方式哪些? 變阻器是電子電路中常用的元件之一,在電路中有多種不同的連接方式。下面將詳細介紹變阻器的三種常見連接方式:串聯連接、并聯連接和可變連接。 1. 串聯連接
    的頭像 發表于 01-18 15:28 ?1581次閱讀

    單點液位傳感器與多點液位傳感器哪些不同呢?

    單點液位傳感器和多點液位傳感器的區別在于第一種是可以一個傳感器檢測一個液位,另外一個則可實現一個傳感器檢測多個液位,以此來適用于不同的應用環境。
    的頭像 發表于 01-10 16:57 ?1055次閱讀
    <b class='flag-5'>單點</b>液位傳感器與多點液位傳感器<b class='flag-5'>有</b>哪些不同呢?

    php加密方式哪些

    PHP加密方式許多種,以下是一些常用的加密方式: 對稱加密 對稱加密算法使用相同的密鑰進行加密和解密。常見的對稱加密算法DES、3DES、AES。對稱加密算法的優點是加密解密速度快
    的頭像 發表于 12-04 15:32 ?627次閱讀