WEB的登錄那些事
說道賬戶登錄和注冊,其實我們每天都在親身感受著,像微博、知乎還有簡書等等。我們總是需要定期的去重新登錄一下,對于這種認證機制,我們都能說出來兩個名詞,、。的確沒錯,和是實現這一切的核心。
為什么會有和?區別是什么?
引入這兩個概念的根本原因是因為Http協議是無狀態的,也就是說它不能建立起多次請求之間的關系。所以需要引入一個能有瀏覽器或服務器保存的一個上下文狀態,也就是和。說到底的實現是依賴于的,因為是真正的由瀏覽器保存的狀態,是利用了。在我看來其實兩者有差異,但是根本的依賴是一樣的。也是有生命周期的,像級別或者有一定“壽命”的。一切是由瀏覽器去維護的。
常見的跨域登錄問題
之前樓主主要是做賬戶和這方面的工作,其實在跨域這也是碰見了一些問題。
對于同一個根域下的登錄問題
如果我們的站點有不止一個業務,那么他們可能部署在不同的機器上,也往往需要不同的域名進行區分。但是所有的業務又都是依賴于一套賬戶體系,那么我們這時候需要通過一次登錄解決所有站點的登錄問題,那么我們這個時候可以使用一個最笨的方法:那就是一次登錄成功,將寫到根域下,那么這樣所有的站點就能實現,同一個根域下的共享,自然實現了”單點登錄“。
對于多個根域下的登錄問題
如果是多個根域名,那么這種情況下上面的機制就不能實現“單點登錄”了。因為之所以上面可以實現“單點登錄”的效果。是因為瀏覽器和Http協議的支持。但是對于跨根域的站點之間進行的共享是比較復雜的。
方法1:登錄成功之后將回寫到多個域名下。
這種辦法可能十分簡單,你可以通過后端的寫,也可以用前端js去寫,但是必須有對所有需要“單點登錄”的站點進行逐一的寫入。用腳想這種辦法也是行不通的,因為你需要維護一個站點的列表,維護工作十分復雜,同時對于增加站點也會特別痛苦。對于的銷毀也是十分復雜的,因為還是要對所有域名下的進行刪除。也就是說將原來需要做的工作增加了n倍。對于小型站點這種辦法是可取的。
方法2:jsonp
搞過前端的可能都知道用jsonp可以做跨域的請求,而我們解決的就是多個域下的統一登錄的問題,好像很順理成章的樣子。但是,登錄是端做的吧?我們在端做跨域的處理,這怎么看也不是很合理。同時這種辦法需要很大的維護成本,每一次請求都要去固定的域下取相應的之后再做請求。想想維護有頭疼。
方法3 :引入一個中間態的
這種辦法算是一個簡化版的SSO,實現思想也十分的“狡猾”。但是對于小網站做跨域登錄的處理卻十分的有用,具體思路如下:
首先,我們有兩個域名要實現單點登錄,同時我們需要一個中間的。
我們有一個系統域名為,當我們登錄的時候訪問/wp-login進行登錄,登錄成功之后將回寫到這個域名下。
我們還有一個系統域名為,當我們訪問-的時候,我們沒有,那么請求跳轉到中間系統jump。此時需要將當前域名帶到參數中便于jump校驗。這個jump系統是在域下的即:。這時候就能拿到之前寫在域下的。
jump系統在收到了域下的之后,取出域下的,并請求,這個接口也是在jump系統中,請求后jump系統將回寫到-域名下單點登錄原理,這樣就實現了簡易的單點登錄。如下圖所示:
.png
但是這種方式不是很靈活,對于數據傳輸的安全性沒有保障,并且在銷毀的時候無能為力,只能全部遍歷的銷毀。
方法4:基于CAS的SSO系統
CAS可不是java中的-And-Swap,它是一個開源的單點登錄系統(SSO)。實現的機制不算復雜但是思想十分靈巧。用CAS也可以快速實現單點登錄。盜圖一張說明sso單個域的登錄和驗證流程:
.png
CAS主要分為CAS 和CAS ,其中主要是內嵌在需要SSO登錄站點的攔截器或過濾器上。
首先瀏覽器向站點1發起請求。
站點1發現當前請求沒有合法的,那么重定向到CAS 上,也就是SSO 。
CAS 展示登錄界面,要求用戶登錄。
用戶登錄后,會寫CAS 的到瀏覽器,同時生產,利用一個302跳轉到。這樣能保證用戶無感知。
CAS 利用生成的發送到CAS 進行驗證,驗證通過后,站點1生成自己的并回寫到用戶瀏覽器,然后進行登錄成功的跳轉。
這樣就能保證當前瀏覽器在站點1的域名下,有站點1的,同時當前瀏覽器也有CAS 的。
接下來看下站點2的登錄:
.png
站點2,在進行登錄時和站點1初次登錄流程一致,但是在訪問CAS 的時候,由于當前瀏覽器已經有了CAS 的,那么直接校驗通過返回。
通過302跳轉跳轉到CAS 上,之后的流程就和站點1是一樣的了。如果此時認證失敗,那么需要重新走一次登錄的過程。
其實感覺很麻煩單點登錄原理,但是流程卻十分的簡單,主要是使用CAS 的做校驗,同時各自系統維護自己的。
注意的問題:
CAS 的劫持問題,如果CAS 的被劫持掉,那么就相當于拿到了一切,所以必須要用HTTPS實現這個過程。
的使用,只能被使用一次,一次校驗后立即失效。同時需要有時效性,一般5分鐘。最后生成規則要隨機,不能被碰撞出來。
對于各自系統自己的,也可以依賴于SSO,這樣就能保證所有的規則一致,便于集中控制。
其實SSO的實現很靈活,CAS只是說了一個原理,至于具體怎么實現,需要平衡安全性、易用性等諸多因素,所以也沒有一個固定的實現方案。
SSO之CAS單點登錄實例演示
一、概述
此文的目的就是為了幫助初步接觸SSO和CAS 的人員提供一個入門指南,一步一步演示如何實現基于CAS的單點登錄。
CAS的官網:
二、演示環境
本文演示過程在同一個機器上的(也可以在三臺實體機器或者三個的虛擬機上),環境如下:
根據演示需求,用修改hosts 文件的方法添加域名最簡單方便(這個非常重要),在文件 C:\\\\etc\hosts 文件中添加三條
三、JDK安裝配置
這個詳細過程就不在描述,如果是免安裝版的,確保環境變量配置正確。
本機環境變量:=D:\jdk,如果看到以下信息則表示安裝成功:
四、安全證書配置
有關工具的詳細運用見:
4.1. 生成證書:
1
--alias - RSA-- --:\sso\.-
4.2.導出證書:
1
--alias -:\sso\.-fileg:\sso\
4.3.客戶端導入證書:
1
--%%\jre\lib\\-fileg:\sso\.crt-alias
ps:該命令中輸入的密碼和上面輸入的不是同一個密碼;如果是多臺機器演示,需要在每一臺客戶端導入該證書。
五、部署CAS-相關的