SSO單點登錄(三)基於session的服務端

目錄

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了,優缺點上面也說了,針對項目及背景的不同,技術方案的選擇也會不同,選擇適合的纔是最好的。

發佈了40 篇原創文章 · 獲贊 60 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章