目錄
SSO單點登錄(一)理論知識總結
SSO單點登錄(二)基於redis的服務端
SSO單點登錄(三)基於session的服務端
SSO單點登錄(四)客戶端的設計與實現
SSO單點登錄(五)服務端集成dubbo版本
持續更新中…
其他的內容不過多廢話,服務端的詳細內容可以見SSO單點登錄(二)基於redis的服務端
本來,主要是針對核心邏輯,由redis改爲session的處理方式,如果非要問一個優缺點,那就簡單說明幾點
- redis可以拓展很多,比如分佈式系統等,但是登錄數據不會銷燬,安全性存在一定問題,就會出現一人登錄,多人共享的效果
- session的話,目前只能管理本地會話,瀏覽器關閉session會銷燬,安全性更好一點
ok,直接來看一下代碼的改造邏輯吧,部分對象這裏就不列舉了,見前一篇
1. 登錄核心邏輯
//1.校驗用戶(獲取用戶邏輯省略)
UserInfo userInfo = ...;
if(userInfo == null){
return "用戶不存在"
}
//2.生成token(生成唯一標識即可,可按自己的要求定義)
String token = UUID.randomUUID().toString();
userInfo.setToken(token);
//3.用戶登錄信息寫入session
HttpSession session = httpServletRequest.getSession(true);
session.setAttribute("loginUser", userInfo);
return "登錄成功";
2. 認證鑑權核心邏輯
/**
* SSO登錄地址
*/
private static final String SSO_LOGIN_URL = "...";
/**
* @param token 登錄唯一標識
* @param indexUrl 目標子系統首頁
*/
public AuthResult applyAuth(String token, String indexUrl) {
//要拼接的跳轉地址(sso登錄後,可根據redirectUrl參數決定跳轉到主頁還是目標系統頁面)
String redirectUrl = StringUtils.isEmpty(indexUrl) ? "" : "?redirectUrl=" + indexUrl;
AuthResult authResult = new AuthResult();
HttpSession session = httpServletRequest.getSession(true);
UserInfo userInfo = (UserInfo)session.getAttribute("loginUser");
if(userInfo == null){
//校驗失敗 - 跳轉到登錄頁
authResult.setAuth(false);
authResult.setRedirectUrl(SSO_LOGIN_URL + redirectUrl);
}else{
//校驗成功 - 返回用戶信息
authResult.setAuth(true);
authResult.setUserInfo(userInfo);
}
return authResult;
}
其他邏輯基本沒變,就是存儲用戶的時候,由redis變爲session了,優缺點上面也說了,針對項目及背景的不同,技術方案的選擇也會不同,選擇適合的纔是最好的。