redis實現SSO單點登入,集群,分布式鎖

2021-08-20 16:14:17 字數 2070 閱讀 7916

使用redis實現單點登入,一般情況下都是配合cookie的.將生成的唯一的token資訊儲存在cookie中,當發生多服務呼叫時,都會在cookie中讀取到該值,再去redis中查詢是否有該使用者資訊存在.如此實現單點登陸

一般在微服務架構中,sso單點登陸會抽離出來作為乙個單獨的服務,來實現伺服器集群下的 session共享問題.

為什麼要使用redis 來解決session 共享問題呢?

1. redis 是乙個純鍵值型別的nsql資料庫,所有的操作都是具有原子性的.

2. redis 可以設定key的生存時間,訪問速度快速效率高.

缺點就是: 會對**有一定的侵入性.需要自行編碼實現!!!

下面對原有的登陸與單點登入做一下簡單的比較:

簡單的單服務的登入邏輯:

眾所周知,session屬於會話,如果在將來業務需要進行壯大需要改造成多服務,那麼上去解決方案完全行不通!

所以才會引進sso單點登入的邏輯,它完美的解決了在多服務下的session共享問題,

:但是又會帶來哪些問題呢?

1.在高併發下,很難保證生成的token的唯一性,並且有可能存在cookie儲存的token資訊,在redis 中查詢不到,

於是在這種情況下就需要使用分布式鎖!分布式鎖有很多實現方式,這裡說到的則是利用redis的原子性來實現分布式鎖.

利用redis 中的setnx 和getset命令來實現redis 分布式鎖!

在redis中null 標記為nil;

那麼何為分布式鎖呢?

字面意思:就是在分布式系統中的鎖!

那麼這把在分布式中的鎖時怎麼鎖,來確保token的一致性的呢?

首先定義乙個鎖的名字(根據登入使用者)作為key("比喻說:***_redis_lock"),那麼value採取的時當前時間+超時時間作為value

/**

* 加鎖

** @param key

* @param time 當前時間 + 超時時間

* @return

*/public boolean lock(string key, long time)

// 如果該值存在,判斷設定的時間是否超時,如果超時,也將釋放鎖

long redistime = long.valueof(redispoolutil.get(key));

if (!stringutils.isempty(string.valueof(redistime)) && redistime < system.currenttimemillis())

}return flag;

}

當鍵值不存在時,第一次訪問(這裡的redispoolutil 是我自己封裝的乙個基於jedispool 的工具類),setnx會設定成功,此時返回的資料為1;再將定義的訊號量修改為true;

不管成功與否,都需要進行下一步的判斷,防止返回的結果一直為false(有可能某個服務在獲取鎖的過程中出現了bug,但是此時並沒有釋放鎖,如果不做如下的判斷,那麼該判斷將會一直保持false狀態,其他的執行緒將不會得到該鎖物件)

下面的判斷為,判斷該鎖是否已經超時,如果超時,將直接釋放掉鎖!

在操作完一些的操作後釋放掉鎖!(將token儲存在cookie,將使用者資訊儲存到redis....)

/**

* 釋放鎖

** @param key

* @param time

*/public void unlock(string key, long time)

} catch (exception e)

}

至此:redis分布式鎖基本完成!

加油!!!

PHP實現sso單點登入

單點登入的解釋 單點登入 single sign on 簡稱為 sso,是目前比較流行的企業業務整合的解決方案之一。sso的定義是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。server端 共享cookie 即共享session的方式,本質上cookie只是儲存sessi...

單點登入系統SSO實現

前些天被問到單點登入了,而據我當時做的這個模組兩年了,現在重新溫習並記錄下,方便以後快速回憶起來 sso全稱single sign on。sso是使用者只需要登入一次就可以訪問所有相互信任的應用系統 分布式集群的專案因為每個模組都部署在不同的機器。如果第一次在a系統登入,第二次訪問b系統,這個時候b...

CAS實現SSO 單點登入

cas分為兩部分,cas server和cas client 假設我們現在有應用系統a 應用系統b cas認證系統 首先,我們來分析下單web應用系統登入登出的實現機理。web系統登入登出功能,通常屬於系統安全管理模組的一部分。如上篇所說,登入,意味著使用者與系統之間的一次會話開始,登出,意味著本次...