目錄
SSO單點登錄(一)理論知識總結
SSO單點登錄(二)基於redis的服務端
SSO單點登錄(三)基於session的服務端
SSO單點登錄(四)客戶端的設計與實現
SSO單點登錄(五)服務端集成dubbo版本
持續更新中…
代碼都是臨時編寫的,可能會有不嚴謹的地方,主要表明其中的核心思想
1.概述
服務端就是SSO項目的建設,它包含了統一登錄,認證鑑權等,爲目標子系統提供管理統一管理賬號的職責。
2.服務端設計要點
- 統一登錄入口
- 賬號管理
- 認證鑑權
3.核心代碼設計
3.1 定義用戶對象
import lombok.Data;
import java.io.Serializable;
/**
* @author yanghao
* @version UserInfo.java, v 0.1 2019-06-14 08:29
*/
@Data
public class UserInfo implements Serializable {
private static final long serialVersionUID = 3237076458096649506L;
/**
* 登錄標識
*/
private String token;
/**
* 用戶名
*/
private String username;
/**
* 密碼
*/
private String password;
/**
* 真實姓名
*/
private String realName;
}
3.2 定義鑑權返回對象
import lombok.Data;
import java.io.Serializable;
/**
* @author yanghao
* @version AuthResult.java, v 0.1 2019-06-14 08:35
*/
@Data
public class AuthResult implements Serializable {
private static final long serialVersionUID = -859598615166362412L;
/**
* 認證結果
*/
private boolean auth;
/**
* 重定向url(認證結果僅爲false時返回)
*/
private String redirectUrl;
/**
* 用戶信息(認證結果僅爲true時返回)
*/
private UserInfo userInfo;
}
3.3 登錄核心邏輯
//1.校驗用戶(獲取用戶邏輯省略)
UserInfo userInfo = ...;
if(userInfo == null){
return "用戶不存在"
}
//2.生成token(生成唯一標識即可,可按自己的要求定義)
String token = UUID.randomUUID().toString();
userInfo.setToken(token);
//3.用戶登錄信息寫入redis(當天有效)
redisCache.set("login." + token, userInfo, 24 * 60 * 60, TimeUnit.SECONDS);
return "登錄成功";
3.4 認證鑑權核心邏輯
/**
* SSO登錄地址
*/
private static final String SSO_LOGIN_URL = "...";
@Autowired
private RedisCache redisCache;
/**
* @param token 登錄唯一標識
* @param indexUrl 目標子系統首頁
*/
public AuthResult applyAuth(String token, String indexUrl) {
//要拼接的跳轉地址(sso登錄後,可根據redirectUrl參數決定跳轉到主頁還是目標系統頁面)
String redirectUrl = StringUtils.isEmpty(indexUrl) ? "" : "?redirectUrl=" + indexUrl;
AuthResult authResult = new AuthResult();
UserInfo userInfo = redisCache.get("login." + token, UserInfo.class);
if(userInfo == null){
//校驗失敗 - 跳轉到登錄頁
authResult.setAuth(false);
authResult.setRedirectUrl(SSO_LOGIN_URL + redirectUrl);
}else{
//校驗成功 - 返回用戶信息
authResult.setAuth(true);
authResult.setUserInfo(userInfo);
}
return authResult;
}
4.總結
- 目標子系統根據認證鑑權接口applyAuth,判斷是否登錄成功,如auth爲true,說明登錄成功,可以跳轉至目標子系統首頁;如果auth爲false,返回一個跳轉頁面,此頁面會跳轉sso登錄頁面
- 認證鑑權後,會有redirectUrl參數,根據這個參數決定登錄跳轉到sso首頁還是目標子系統首頁
- 本文是基於redis做的,後面會更新一版基於session去做,小夥伴盡情期待吧
- 編碼臨時做的,不嚴謹的地方請包涵,重在表達核心邏輯思想
- 本文由作者原創,轉載請表明出處https://blog.csdn.net/weixin_43968234/article/details/91953545