【Java】實現單點登錄系統sso(Single Sign On)

sso是在多個應用系統中,用戶只需要登錄一次,就可以訪問相互信任的應用系統。它可以將這次的登錄信息裝填映射到其他應用中,應用於用戶的登錄。

使用到的技術:

  1. mybatis
  2. springmvc
  3. spring
  4. Jedis

用戶登錄接口:

  1. 接受用戶名和密碼
  2. 校驗用戶名和密碼
  3. 校驗成功生成token,使用UUID
  4. 將用戶信息存入redis,key即爲token
  5. 將token存入cookie
  6. 返回登陸成功將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);

接着實現登錄攔截:

  1. 先從cookie中取tooken TT_TOKEN;
  2. 如果tooken爲空,則返回到登錄頁面,否則執行3;
  3. 根據tooken去redis中取用戶信息;
  4. 如果rsession已過期,則轉到登錄頁面,否則放行。

實現登錄回調(在登錄成功後返回攔截器攔截的請求中的那個url):

我們在登錄的那個url中加上一個參數即回調的url。登陸成功後如果url不爲null轉到這個url,否則轉到主頁。

在配置攔截器時,如果用戶未登錄,我們重定向到登錄頁面,在重定向的那個url中,將當前攔截的這個請求所請求的url設爲參數,即登錄成功後要回到的頁面。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章