1. 程式人生 > >多種單點登入的方法和之間的比較

多種單點登入的方法和之間的比較

        有個專案可能要用到單點登入,以前也搭過cas的單點登入,公司用的是redis檢查sessionId的方式單點登入。因為以前的cas比較久遠,忘記了很多,所有有了疑惑,redis的單點登入和cas的單點登入有什麼區別,為什麼redis的那麼簡單,還沒替換掉cas的呢。這裡做一個簡單的比較,方便以後的理解。

      首先,簡單說下redis實現單點登入的方式,其實用redis甚至直接用資料庫都可以完成這項任務,只是如果登入比對資料放在資料庫中,也就意味著攔截器中的邏輯,每次比對都要從資料庫裡讀取使用者資訊,這加大了伺服器和資料庫的效能開銷。如果求簡單,而且互動很少的情況下,也可以把sessionID放在資料庫中。

    Redis或資料庫模式下的單點登入:

      其實不管是redis中,還是資料庫中,都只是一個存放 sessionID的工具罷了,具體的做法是

      1.A使用者登入的時候,登入成功,在redis或者資料庫中儲存使用者資訊(賬戶名等),和sessionID(該值是每個瀏覽器第一次訪問都會生成的一個唯一值,可以確認登入身份)。

      2.A使用者繼續使用或者使用同一瀏覽器登入其他子功能點時。可以在攔截器中檢查,使用者名稱和sessionID與前臺傳過來的sessionID是否一致,如果一致,繼續訪問。這一步也可以做到如果sessionID一樣的話,可以免登陸直接進入其他子功能頁,這也是單點登入的功能之一。

      3.B使用者使用A使用者的賬號登入,登入成功,則更新sessionID。

      4.這時,A 繼續訪問的請求到達攔截器,攔截器比對sessionID,發現sessionID對不上,則跳轉到登入頁面。此時,A被B擠掉了,這就是redis 或者資料庫模式下,簡單的單點登入的邏輯。

      CAS下完成單點登入:

        cas其實就是引入了一個服務端和客戶端的概念,有一個全域性的服務端,每個客戶端成功登陸之後,都需要在服務端註冊。此時會有一個在服務端唯一的token。這樣,在每一個客戶端登入時,因為都需要在同一個服務端進行驗證,所以,服務端會對配置好的客戶端進行驗證,這樣就能確認身份了。當單點登入時,因為有一個明確的服務端的概念,可以在通過在客戶端的配置,達成很多範圍更大的單點登入功能。比方說,可以設定多瀏覽器下的單點登入。

區別:

           按我總結來說,其實第一種就像是一個門和一個鎖的概念, 每次不同使用者的相同賬號的登陸,都是一個換鎖換鑰匙的過程。先進去的人出來想再進去,發現門鎖和鑰匙對不上,就被趕走了。

            cas更像是一種管理員模式,也就是,找一個公證人,他負責保管鎖,給你一把鑰匙。只要是鑰匙對了,一切都OK

            所以,在多瀏覽器下,或者大型分散式下,模組很多的情況下,cas更適合,因為如果換了瀏覽器,或者瀏覽器一關,再重新一開,或者多臺伺服器的redis和資料庫不是同一個,第一種邏輯就行不通了,因為sessionID變了或者儲存的地方不一致。

            如果說,簡單的分散式專案,redis的單點登入也完全夠了。

PS:

以下是另一位博主的理解,有些我沒說清楚的地方也可以參考下:

cas(單點登入)
現象:多個系統只需登入一次,無需重複登入
原理:授權伺服器,被授權客戶端
1、授權伺服器(一個)儲存了全域性的一份session,客戶端(多個)各自儲存自己的session
2、客戶端登入時判斷自己的session是否已登入,若未登入,則(告訴瀏覽器)重定向到授權伺服器(引數帶上自己的地址,用於回撥)
3、授權伺服器判斷全域性的session是否已登入,若未登入則定向到登入頁面,提示使用者登入,登入成功後,授權伺服器重定向到客戶端(引數帶上ticket【一個憑證號】)
4、客戶端收到ticket後,請求伺服器獲取使用者資訊
5、伺服器同意客戶端授權後,服務端儲存使用者資訊至全域性session,客戶端將使用者儲存至本地session
oauth2(登入授權)
現象:第三方系統訪問主系統資源,使用者無需將在主系統的賬號告知第三方,只需通過主系統的授權,第三方就可使用主系統的資源(如:APP1需使用微信支付,微信支付會提示使用者是否授權,使用者授權後,APP1就可使用微信支付功能了)
原理:主系統,授權系統(給主系統授權用的,也可以跟主系統是同一個系統),第三方系統
1、第三方系統需要使用主系統的資源,第三方重定向到授權系統
2、根據不同的授權方式,授權系統提示使用者授權
3、使用者授權後,授權系統返回一個授權憑證(accessToken)給第三方系統【accessToken是有有效期的】
4、第三方使用accessToken訪問主系統資源【accessToken失效後,第三方需重新請求授權系統,以獲取新的accessToken】
單一登入
現象:同一系統,同一使用者在同一時間內只能有一個會話(即一個使用者只有一個在使用的瀏覽器)
原理:
1、把登入成功的使用者放入session和快取,快取中格式:key:userID,value:sessionId
2、使用者訪問資源時,用攔截器(或過濾器)攔截使用者請求,先判斷使用者是否已登入(根據session判斷),若使用者未登入,則定向到登入頁面提示使用者登入
3、若使用者session已登入,根據使用者userID取出快取資料,判斷當前瀏覽器的sessionId與快取的是否一致,若一致,則繼續訪問
4、若sessionId不一致,則將當期的session資料清空,使用者登出,提示使用者被踢出