SSO單點登錄(二)基於redis的服務端

目錄

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