單點登陸系統(一)

1.SSO 概述java

單點登陸(Single Sign On ), 是目前比較流行的企業業務整合解決方案之一. 在企業中存在多個業務系統, 用戶只須要登陸一次就能夠訪問這些彼此信任的業務系統.web

 

1.1 SSO體系結構chrome

單點登錄包括了四個組件:認證中心, 用戶與賬號系統&用戶數據獲取接口, 客戶端模塊, 令牌瀏覽器

 

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

    1.1.2 用戶與賬號系統&用戶數據獲取接口 (服務端提供統一認證 用戶數據 的接口)cookie

    1.1.3 客戶端模塊session

    1.1.4 令牌(token)dom

image

 

 

2. SSO認證流程ide

  認證流程: 當用戶經過瀏覽器發起了業務資源的請求, 服務器會檢測token[鑰匙]是否存在; 若是token存在, 服務器繼續校驗token是否有效, 若是token有效, 用戶就成功訪問業務系統, 若是token無效, 瀏覽器Redirect到登陸頁面; token不存在,瀏覽器Redirect到SSO的用戶與賬號系統模塊, 提示用戶輸入用戶名和密碼來進行受權, 受權成功後, 服務器將生成的token傳遞給瀏覽器, 用戶攜帶剛生成的token再次發起請求,完成業務資源的訪問.工具

 

image

上面是關於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的值是同樣的.

image

圖1

 

image

圖2

image

 

 

 

5. JavaScript操做cookie的方法

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

7. filter, WEB層的攔截器

相關文章
相關標籤/搜索