分布式系列 單點登入和session共享實現

2021-08-03 06:26:55 字數 2791 閱讀 9293

上篇文章簡單的描述了下單點登入的場景和解決單點登入問題的幾套方案。

本文將從具體實現層面剖析如何實現sso和session共享。

假設我們有三個子系統:project1;project2,project 3,此時,訪問每個子系統都會有自己的會話。只要他們之間互認了sessionid,我們就能任意在個子系統之間穿梭訪問。

這是sso的一張流程圖。比較詳細的上描述了使用者從登陸頁面到訪問使用者中心、訂單系統的過程,採用了redis儲存會話的共享機制,也是當前比較常用的一套實現方案。

該方案具有明顯的好處:redis訪問速度快,不會網出現多個節點session複製的問題,且效率高。

查詢資料校驗:

@service

public class userregisterserviceimpl implements userregisterservice else if ("2".equals(type)) else if ("3".equals(type))

//返回結果

if (result)

throw new dataexception("此數值已經存在");

}private boolean checkusername(string username) throws exception

return false; }

private boolean checkphone(string phone) throws exception

return false; }

private boolean checkemail(string email) throws exception

return false;

}}

使用者註冊實現:

@override

public systemresult register(tbuser user) throws exception

if (stringutils.isblank(user.getpassword()))

if (stringutils.isblank(user.getphone()))

//轉換md5

user.setpassword(digestutils.md5digestashex(user.getpassword().getbytes()));

//完善user資訊

user.setcreated(new date());

user.setupdated(new date());

//新增到資料庫

return systemresult.ok();

}

登入實現:

@service

public class userloginserviceimpl implements userloginservice ")

private string user_token_key;

@value("$")

private integer session_expire_time;

@override

public systemresult login(string username, string password) throws exception

//核對密碼

tbuser user = list.get(0);

if (!digestutils.md5digestashex(password.getbytes()).equals(user.getpassword()))

//登入成功,把使用者資訊寫入redis

//生成乙個使用者token

string token = uuid.randomuuid().tostring();

jediscluster.set(user_token_key + ":" + token, jsonutils.objecttojson(user));

//設定session過期時間

jediscluster.expire(user_token_key + ":" + token, session_expire_time);

return systemresult.ok(token);

}}

使用者查詢:

@service

public class usertokenserviceimpl implements usertokenservice ")

private string user_token_key;

@value("$")

private integer session_expire_time;

/*** 根據token取使用者資訊

*/@override

public systemresult getuserbytoken(string token) throws exception

//把json轉換成user物件

tbuser user = jsonutils.jsontopojo(userjson, tbuser.class);

//更新使用者有效期

jediscluster.expire(user_token_key + ":" + token, session_expire_time);

return systemresult.ok(user);

}}

後續登入***的配置,就不在此多說了。

分布式系列 單點登入和session共享

最近跟組織一起學習,本來說好的學習大資料,不知道怎麼的,忽然一看材料,莫名轉戰到了分布式,搞起了高階架構的知識了。看了看故事的梗概,還不錯,從基礎的分布式呼叫和架構設計,再到事務一致性,ha,到web應用,資料庫高可用和效能優化等一系列,也算是有乙個很不錯的體系,就計畫堅持著學下去了。好了,囉嗦的夠...

Redis實現分布式單點登入

單點登入 single sign on 簡稱為 sso,是目前比較流行的企業業務整合的解決方案之一。sso的定義是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。引進sso單點登入的邏輯,它完美的解決了在多服務下的session共享問題,但是又會帶來哪些問題呢?在高併發下,很...

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

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