sso是在多個應用系統中,用戶只需要登錄一次,就可以訪問相互信任的應用系統。它可以將這次的登錄信息裝填映射到其他應用中,應用於用戶的登錄。
使用到的技術:
- mybatis
- springmvc
- spring
- Jedis
用戶登錄接口:
- 接受用戶名和密碼
- 校驗用戶名和密碼
- 校驗成功生成token,使用UUID
- 將用戶信息存入redis,key即爲token
- 將token存入cookie
- 返回登陸成功將token返回到客戶端
主要的地方就是將數據存入redis部分。用redis模擬session,實現多個服務器共享session進而實現單點登錄。
存入redis核心代碼:
//生成token
String token = UUID.randomUUID().toString();
//把用戶信息寫入redis
//key:REDIS_SESSION:{TOKEN}
//value:user轉json
user.setPassword(null);
jedisClient.set(REDIS_SESSION_KEY + ":" + token, JsonUtils.objectToJson(user));
//設置session的過期時間
jedisClient.expire(REDIS_SESSION_KEY + ":" + token, SESSION_EXPIRE);
//寫cookie
CookieUtils.setCookie(request, response, "TT_TOKEN", token);
使用token取用戶信息核心代碼:
// 根據token取用戶信息
String json = jedisClient.get(REDIS_SESSION_KEY + ":" + token);
//判斷是否查詢到結果
if (StringUtils.isBlank(json)) {
return TaotaoResult.build(400, "用戶session已經過期");
}
//把json轉換成java對象
TbUser user = JsonUtils.jsonToPojo(json, TbUser.class);
//更新session的過期時間
jedisClient.expire(REDIS_SESSION_KEY + ":" + token, SESSION_EXPIRE);
接着實現登錄攔截:
- 先從cookie中取tooken TT_TOKEN;
- 如果tooken爲空,則返回到登錄頁面,否則執行3;
- 根據tooken去redis中取用戶信息;
- 如果rsession已過期,則轉到登錄頁面,否則放行。
實現登錄回調(在登錄成功後返回攔截器攔截的請求中的那個url):
我們在登錄的那個url中加上一個參數即回調的url。登陸成功後如果url不爲null轉到這個url,否則轉到主頁。
在配置攔截器時,如果用戶未登錄,我們重定向到登錄頁面,在重定向的那個url中,將當前攔截的這個請求所請求的url設爲參數,即登錄成功後要回到的頁面。