天天看點

在不同域中各個系統擁有自已獨立的使用者系統時的單點登入問題

我們在實作業務中經常會碰到多個系統各自有各自的使用者登入系統,而且這些系統是各自運作在各自的域下,是以要實作這些系統使用者的單點登入就是個問題了,是以自己想了一個方案希望看看是否可行。

1.sso站點必須是單獨一個站點。

我把sso單獨設立一下站點,這個站點可以單獨一個域名,主要存放各個系統的使用者資訊及登入的cookie資訊。

2.保證各個系統的使用者資料一緻性和獨立性。

各個系統擁有自己的使用者資料表互相獨立。每一個系統的CUD(建立,更新,删除)時都會觸發其它系統的CUD。那麼這裡有個問題也會出現:各個系統登入無非就驗證使用者名和密碼,是以就得保證各個系統的至少登入名、密碼的一緻性,可是各個系統可能處理密碼時都有各自的方法,有的系統直接使用明文,有的系統使用md5或者其它加密方式。這時在沒完成單點登入構架時的各個系統中對那些不可逆密碼的資料處理就基本不可能了。我想到這種最好處理方法是所有密碼加密隻能遵循其中一種不可逆的加密了,那些可逆或者明文的密碼都可以轉成這種密碼處理方式,這樣資料就可以同步了,當然如果出現兩種不一樣且不可逆的密碼時貌似就想不到啥解決方案了。

3.當某一使用者進入某一系統,且他還未完成任何一個系統登入的處理。

使用者輸入某一個系統的網址進來,該系統就必須檢測目前這個操作的是遊客還是系統使用者,其實如果不是多系統單點登入的話,就這一個系統也是會通過cookie、session等之類東西去檢測遊客還是系統使用者,但隻局限于此站點的檢測。因為我知道我壓根就沒有此站點登入過,是以就得去其它系統中檢測我是否有登入過,通過檢測我還是沒有在任何地方登入過,是以我的登入隻是一名遊客。

根據以上的需求,應該是這樣去處理:

輸入網站進入某一系統的其實一個頁面,該頁面(我這裡把頁面=行為處理的Handler)需要做的事是:進入頁面構造時就redirect到了sso站點且redirect時必須附上returnUrl,因為sso站點處理後需要再次回調到使用者進入某一系統的頁面,總不至于停留在sso站點,因為使用者都不知道有sso站點這回事。redirect到sso站點後,sso站點頁面第一步隻需要看看sso站點是否有登入的cookie資訊,因為使用者根本就沒登入,是以肯定就不存在這個cookie值了,是以說明在其它系統我們沒登入過,那麼就得告訴使用者進入的某一系統沒有登入了,根據returnUrl并附帶一個空的Token(如Token=$,$代表空)跳轉到使用者原來要進入的某一系統的頁面,其實這時使用者進入的還是原來的頁面隻是該頁面附帶了一個空的Token。頁面看到了有一個Token參數,是以頁面知道已經去過了sso站點檢測且證明該使用者在其它系統也是不存在登入的。要注意的是這裡若不到Token,系統就死循環了哦!

4.使用者在所有系統都未登入時,使用者進入的某一系統完成使用者登入的處理。

這裡的登入有以下步驟進行處理:

1).某一系統根據使用者登入的使用者名、密碼以後在自已對應的資料庫中驗證是否正确,正确說明登入成功了。

2).系統登入成功後就必須回報給sso站點,那麼這時應該怎麼回報呢?我的想法還是通過sso站點回調的方式去處理。某一系統登入成功以後其實根據需要得跳轉到相關指定頁面,這時攔截跳轉頁面并記錄url并做為sso站點頁面的returnUrl,sso站點處理授權登入的頁面接受的參數不能隻有一個returnUrl,至少還得告訴該頁面是哪個使用者進行登入了,否則去sso站點驗證後怎麼知道哪個使用者登入了,但僅僅是一個使用者名參數夠了嗎?我是覺得不夠,這樣也太不安全了,真那樣我隻要通過這個頁面+使用者名不是完成登入了?

本來我是這麼想的:

sso站點授權頁面得到三個參數(使用者名,密碼,returnUrl) ,sso站點需要向某一系統的使用者資料表(各個系統的使用者資料已經保持一緻同步了)再次驗證,在各系統資料同步正常的情況下驗證其實肯定是成功的狀态,成功後取出使用者相關資訊儲存的緩存中,使用者資訊中也附帶一個token值(唯一的),然後再在sso站點中生成一個cookie(存放的是一個token值), 同時這裡的cookie和緩存資訊失效時間需要設定一緻。

後來是這麼想的:

sso站點授權頁面得到還隻是兩個參數(加密的使用者名,returnUrl),當然這種加密是可逆的加密,但加密的key是會定時變化的,發送的這個加密的使用者名,sso站點根據key解密得到使用者名和生成一個token值(唯一的)存入緩存,然後再在sso站點中生成一個cookie(存放的是一個token值), 同時這裡的cookie和緩存資訊失效時間需要設定一緻。

5.使用者已經在某一系統中登入,但現在去了另外一系統,在該系統中還未完成授權。

因為現在去的這個系統其實還未完成登入,那麼要得遵循3的步驟,構造去sso站點附帶一個returnUrl,驗證到了在sso站點有cookie資訊,取出這個cookie值得到token,然後回調至已附帶token參數的returnUrl頁面,該頁面判斷token值存在後進入構造後的下步處理,該處理知道有token值後調用sso站點的api(webservice或者restful請求方式)得到使用者名,根據這個名再從資料庫中得到密碼,并完成登入操作。

6.使用者在某一系統登入後,每次需登入驗證的頁面請求會間歇性的向sso站點更改token值并完成延長cookie及緩存會話時間。

使用者在長時間未操作時,可能通路的系統和sso系統會話結束時間不一緻,這裡我們隻要保證sso或者系統會話時間隻要一個未結束,就還會存在登入狀态的。隻有兩方都沒有會話時間的情況時才會跳轉到登入頁面要求登入。

7.使用者在某一系統登入後,點選了該系統的退出

使用者點選退出後,應實作某一個站點點退出所有站點全部退出功能。各站點可擁有自己的退出功能,某站點退出後再回調清除sso站點的緩存和一個sso所有站點退出頁面,而sso站點應用應有一個登出的功能頁面(聚集所有站點退出功能,批量回調各個實作退出),該功能可實作所有站點的退出

本文轉自 netcorner 部落格園部落格,原文連結: http://www.cnblogs.com/netcorner/p/3729564.html  ,如需轉載請自行聯系原作者