天天看點

單點登入系統(一)

1.SSO 概述

單點登入(Single Sign On ), 是目前比較流行的企業業務整合解決方案之一. 在企業中存在多個業務系統, 使用者隻需要登入一次就可以通路這些彼此信任的業務系統.

1.1 SSO體系結構

單點登陸包括了四個元件:認證中心, 使用者與帳号系統&使用者資料擷取接口, 用戶端子產品, 令牌

    1.1.1 認證中心 [所有業務系統都共享一個認證中心] (服務端)

    1.1.2 使用者與帳号系統&使用者資料擷取接口 (服務端提供統一認證 使用者資料 的接口)

    1.1.3 用戶端子產品

    1.1.4 令牌(token)

單點登入系統(一)

2. SSO認證流程

  認證流程: 當使用者通過浏覽器發起了業務資源的請求, 伺服器會檢測token[鑰匙]是否存在; 如果token存在, 伺服器繼續校驗token是否有效, 如果token有效, 使用者就成功通路業務系統, 如果token無效, 浏覽器Redirect到登入頁面; token不存在,浏覽器Redirect到SSO的使用者與帳号系統子產品, 提示使用者輸入使用者名和密碼來進行授權, 授權成功後, 伺服器将生成的token傳遞給浏覽器, 使用者攜帶剛生成的token再次發起請求,完成業務資源的通路.

單點登入系統(一)

上面是關于SSO的大緻流程圖, 現在需要通過JAVA代碼來具體實操.

SSO相關核心技術:

1. HTTP協定, cookie與session

2. cookie與session的關系

3. cookie SSO令牌的載體

4. 決定cookie内容 生命周期 和有效範圍的7個屬性

    1. name和value 

    2. expires (過期時間)

    3. path和domain

    4.httponly 和secure

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/path1/cookie-servlet")
public class CookieServlet  extends HttpServlet{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        
        //讀取cookie
        Cookie[] cookies = request.getCookies();
        if( cookies != null) {
            for (Cookie cookie : cookies) {
                System.out.println(cookie.getName()+ ", " 
                        + cookie.getValue() + ", " 
                        + cookie.getMaxAge() + ", " 
                        + cookie.getPath() + ", "
                        + cookie.getDomain() + ", "
                        + cookie.getSecure() + ", "
                        + cookie.isHttpOnly());
            }
        }
        
        //寫cookie
        Cookie cookie = new Cookie("cookie1", String.valueOf(System.currentTimeMillis()));  //      1. name和value 
        cookie.setMaxAge(12*60*60);  //2. expires (過期時間)
        cookie.setPath("/");  //cookie.setDomain("localhost")  //    3. path和domain
        //4.httponly 和 secure
        cookie.setHttpOnly(false);  //    JavaScript不能處理
        cookie.setSecure(false);    // 如果為true,僅支援HTTPS協定
        
        response.addCookie(cookie);
        
    }
    

}      

Ctrl+shift+N 建立一個隐身視窗, 發起第一次get請求,  打開chrome開發工具, 檢視network 下的 cookies ,發現浏覽器有兩個Map key 分别為 Request Cookies Response Cookies; 由于是第一次發起請求, 是以浏覽器沒有找到相應的cookie(token)[圖1]. 在代碼裡, 也沒有輸出對應的浏覽器發送過來的cookie; 

此時重新整理浏覽器,  同樣檢視cookie[圖2], 發現Request cookie 裡攜帶了一個值和第一次get請求ResonseCookies的值是一樣的.

單點登入系統(一)

圖1

單點登入系統(一)

圖2

單點登入系統(一)

5. JavaScript操作cookie的方法

6. Java web應用中操作cookie的方法

7. filter, WEB層的攔截器