分佈式單點登陸框架XXL-SSO

《分佈式單點登陸框架XXL-SSO》

Maven Central
GitHub release
License
donate

1、簡介

1.1 概述

XXL-SSO 是一個分佈式單點登陸框架。只須要登陸一次就能夠訪問全部相互信任的應用系統。
擁有"輕量級、分佈式、跨域、Cookie+Token均支持、Web+APP均支持"等特性;。現已開放源代碼,開箱即用。html

1.2 特性

  • 一、簡潔:API直觀簡潔,可快速上手;
  • 二、輕量級:環境依賴小,部署與接入成本較低;
  • 三、單點登陸:只須要登陸一次就能夠訪問全部相互信任的應用系統。
  • 四、分佈式:接入SSO認證中心的應用,支持分佈式部署;
  • 五、HA:Server端與Client端,均支持集羣部署,提升系統可用性;
  • 六、跨域:支持跨域應用接入SSO認證中心;
  • 七、Cookie+Token均支持:支持基於Cookie和基於Token兩種接入方式,並均提供Sample項目;
  • 八、Web+APP均支持:支持Web和APP接入;
  • 九、實時性:系統登錄、註銷狀態,所有Server與Client端實時共享;
  • 十、CS結構:基於CS結構,包括Server"認證中心"與Client"受保護應用";
  • 十一、記住密碼:未記住密碼時,關閉瀏覽器則登陸態失效;記住密碼時,支持登陸態自動延期,在自定義延期時間的基礎上,原則上能夠無限延期;
  • 十二、路徑排除:支持自定義多個排除路徑,支持Ant表達式。用於排除SSO客戶端不須要過濾的路徑;

1.3 下載

文檔地址

源碼倉庫地址

源碼倉庫地址 Release Download
https://github.com/xuxueli/xxl-sso Download
https://gitee.com/xuxueli0323/xxl-sso Download

技術交流

1.4 環境

  • JDK:1.7+
  • Redis:4.0+
  • Mysql:5.6+

2、快速入門(基於Cookie)

基於Cookie,相關概念可參考 "章節 4.6";git

2.1:系統數據庫初始化

2.2:源碼編譯

- xxl-sso-server:中央認證服務,支持集羣;
- xxl-sso-core:Client端依賴;
- xxl-sso-samples:單點登錄Client端接入示例項目;
    - xxl-sso-web-sample-springboot:基於Cookie接入方式,供用戶瀏覽器訪問,springboot版本
    - xxl-sso-token-sample-springboot:基於Token接入方式,經常使用於沒法使用Cookie的場景使用,如APP、Cookie被禁用等,springboot版本

2.3 部署 "認證中心(SSO Server)"

項目名:xxl-sso-server

配置說明

配置文件位置:application.propertiesgithub

……

// redis 地址: 如 "{ip}"、"{ip}:{port}"、"{redis/rediss}://xxl-sso:{password}@{ip}:{port:6379}/{db}";多地址逗號分隔
xxl.sso.redis.address=redis://127.0.0.1:6379

// 登陸態有效期窗口,默認24H,當登陸態有效期窗口過半時,自動順延一個週期;
xxl.sso.redis.expire.minite=1440

2.4 部署 "單點登錄Client端接入示例項目"

項目名:xxl-sso-web-sample-springboot

maven依賴

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-sso-core</artifactId>
    <version>${最新穩定版}</version>
</dependency>

配置 XxlSsoFilter

參考代碼:com.xxl.sso.sample.config.XxlSsoConfigweb

@Bean
public FilterRegistrationBean xxlSsoFilterRegistration() {

    // xxl-sso, redis init
    JedisUtil.init(xxlSsoRedisAddress);

    // xxl-sso, filter init
    FilterRegistrationBean registration = new FilterRegistrationBean();

    registration.setName("XxlSsoWebFilter");
    registration.setOrder(1);
    registration.addUrlPatterns("/*");
    registration.setFilter(new XxlSsoWebFilter());
    registration.addInitParameter(Conf.SSO_SERVER, xxlSsoServer);
    registration.addInitParameter(Conf.SSO_LOGOUT_PATH, xxlSsoLogoutPath);

    return registration;
}

配置說明

配置文件位置:application.propertiesredis

……

### xxl-sso     (CLient端SSO配置)

##### SSO Server認證中心地址(推薦以域名方式配置認證中心,本機可參考章節"2.5"修改host文件配置域名指向)
xxl.sso.server=http://xxlssoserver.com:8080/xxl-sso-server

##### 註銷登錄path,值爲Client端應用的相對路徑
xxl.sso.logout.path=/logout

##### 路徑排除Path,容許設置多個,且支持Ant表達式。用於排除SSO客戶端不須要過濾的路徑
xxl-sso.excluded.paths=

### redis   // redis address, like "{ip}"、"{ip}:{port}"、"{redis/rediss}://xxl-sso:{password}@{ip}:{port:6379}/{db}";Multiple "," separated
xxl.sso.redis.address=redis://xxl-sso:password@127.0.0.1:6379/0

2.5 驗證

  • 環境準備:啓動Redis、初始化Mysql表數據;spring

  • 修改Host文件:域名方式訪問認證中心,模擬跨域與線上真實環境
### 在host文件中添加如下內容0
127.0.0.1 xxlssoserver.com
127.0.0.1 xxlssoclient1.com
127.0.0.1 xxlssoclient2.com
  • 分別運行 "xxl-sso-server" 與 "xxl-sso-web-sample-springboot"sql

    一、SSO認證中心地址:
    http://xxlssoserver.com:8080/xxl-sso-server數據庫

    二、Client01應用地址:
    http://xxlssoclient1.com:8081/xxl-sso-web-sample-springboot/跨域

    三、Client02應用地址:
    http://xxlssoclient2.com:8081/xxl-sso-web-sample-springboot/瀏覽器

  • SSO登陸/註銷流程驗證

    正常狀況下,登陸流程以下:
    一、訪問 "Client01應用地址" ,將會自動 redirect 到 "SSO認證中心地址" 登陸界面;
    二、成功登陸後,將會自動 redirect 返回到 "Client01應用地址",並切換爲已登陸狀態;
    三、此時,訪問 "Client02應用地址",不需登錄將會自動切換爲已登陸狀態;

    正常狀況下,註銷流程以下:
    一、訪問 "Client01應用地址" 配置的 "註銷登錄path",將會自動 redirect 到 "SSO認證中心地址" 並自動註銷登錄狀態;
    二、此時,訪問 "Client02應用地址",也將會自動註銷登錄狀態;

3、快速入門(基於Token)

基於Token,相關概念可參考 "章節 4.7";(在一些沒法使用Cookie的場景下,可以使用該方式,不然能夠忽略本章節)

3.1 "認證中心(SSO Server)" 搭建

可參考 "章節二" 搭建;

"認證中心" 搭建成功後,默認爲Token方式登錄提供API接口以下:

  • 一、登錄接口:/app/login
    • 參數:POST參數
      • username:帳號
      • password:帳號
    • 響應:JSON格式
      • code:200 表示成功、其餘失敗;
      • msg:錯誤提示
      • data: 登錄用戶的 sso sessionid
  • 二、註銷接口:/app/logout
    • 參數:POST參數
      • sessionId:登錄用戶的 sso sessionid
    • 響應:JSON格式
      • code:200 表示成功、其餘失敗;
      • msg:錯誤提示
  • 三、登錄狀態校驗接口:/app/logincheck
    • 參數:POST參數
      • sessionId:登錄用戶的 sso sessionid
    • 響應:JSON格式
      • code:200 表示成功、其餘失敗;
      • msg:錯誤提示
      • data:登錄用戶信息
        • userid:用戶ID
        • username:用戶名

2.2 部署 "單點登錄Client端接入示例項目" (Token方式)

項目名:xxl-sso-token-sample-springboot

可參考 "章節 2.4" 部署 "單點登錄Client端接入示例項目",惟一不一樣點是:將web應用的 "XxlSsoFilter" 更換爲app應用 "XxlSsoTokenFilter";

2.3 驗證 (模擬請求 Token 方式接入SSO的接口)

  • 環境準備:啓動Redis、初始化Mysql表數據;

  • 修改Host文件:域名方式訪問認證中心,模擬跨域與線上真實環境
### 在host文件中添加如下內容0
127.0.0.1 xxlssoserver.com
127.0.0.1 xxlssoclient1.com
127.0.0.1 xxlssoclient2.com
  • 分別運行 "xxl-sso-server" 與 "xxl-sso-token-sample-springboot"

    一、SSO認證中心地址:
    http://xxlssoserver.com:8080/xxl-sso-server

    二、Client01應用地址:
    http://xxlssoclient1.com:8082/xxl-sso-token-sample-springboot/

    三、Client02應用地址:
    http://xxlssoclient2.com:8082/xxl-sso-token-sample-springboot/

  • SSO登陸/註銷流程驗證

    可參考測試用例 :com.xxl.app.sample.test.TokenClientTest

    正常狀況下,登陸流程以下:
    一、獲取用戶輸入的帳號密碼後,請求SSO Server的登陸接口,獲取用戶 sso sessionid ;(參考代碼:TokenClientTest.loginTest)
    二、登錄成功後,獲取到 sso sessionid ,須要主動存儲,後續請求時須要設置在 Header參數 中;
    三、此時,使用 sso sessionid 訪問受保護的 "Client01應用" 和 "Client02應用" 提供的接口,接口均正常返回;(參考代碼:TokenClientTest.clientApiRequestTest)

    正常狀況下,註銷流程以下:
    一、請求SSO Server的註銷接口,註銷登錄憑證 sso sessionid ;(參考代碼:TokenClientTest.logoutTest)
    二、註銷成功後,sso sessionid 將會全局失效;
    三、此時,使用 sso sessionid 訪問受保護的 "Client01應用" 和 "Client02應用" 提供的接口,接口請求將會被攔截,提示未登陸並返回狀態碼 501 ;(參考代碼:TokenClientTest.clientApiRequestTest)

4、整體設計

4.1 架構圖

輸入圖片說明

4.2 功能定位

XXL-SSO 是一個分佈式單點登陸框架。只須要登陸一次就能夠訪問全部相互信任的應用系統。

藉助 XXL-SSO,能夠快速實現分佈式系統單點登陸。

4.3 核心概念

概念 說明
SSO Server 中央認證服務,支持集羣;
SSO Client 接入SSO認證中心的Client應用;
SSO SessionId 登陸用戶會話ID,SSO 登陸成功爲用戶自動分配;
SSO User 登陸用戶信息,與 SSO SessionId 相對應;

4.4 登陸流程剖析

  • 用戶於Client端應用訪問受限資源時,將會自動 redirect 到 SSO Server 進入統一登陸界面。
  • 用戶登陸成功以後將會爲用戶分配 SSO SessionId 並 redirect 返回來源Client端應用,同時附帶分配的 SSO SessionId。
  • 在Client端的SSO Filter裏驗證 SSO SessionId 無誤,將 SSO SessionId 寫入到用戶瀏覽器Client端域名下 cookie 中。
  • SSO Filter驗證 SSO SessionId 經過,受限資源請求放行;

4.5 註銷流程剖析

  • 用戶與Client端應用請求註銷Path時,將會 redirect 到 SSO Server 自動銷燬全局 SSO SessionId,實現全局銷燬;
  • 而後,訪問接入SSO保護的任意Client端應用時,SSO Filter 均會攔截請求並 redirect 到 SSO Server 的統一登陸界面。

4.6 基於Cookie,相關感念

  • 登錄憑證存儲:登錄成功後,用戶登錄憑證被自動存儲在瀏覽器Cookie中;
  • Client端校驗登錄狀態:經過校驗請求Cookie中的是否包含用戶登陸憑證判斷;
  • 系統角色模型:
    • SSO Server:認證中心,提供用戶登錄、註銷以及登錄狀態校驗等功能。
    • Client應用:受SSO保護的Client端Web應用,爲用戶瀏覽器訪問提供服務;
    • 用戶:發起請求的用戶,使用瀏覽器訪問。

4.7 基於Token,相關感念

  • 登錄憑證存儲:登錄成功後,獲取到登陸憑證(xxl_sso_sessionid=xxx),須要主動存儲,如存儲在 localStorage、Sqlite 中;
  • Client端校驗登錄狀態:經過校驗請求 Header參數 中的是否包含用戶登陸憑證(xxl_sso_sessionid=xxx)判斷;所以,發送請求時須要在 Header參數 中設置登錄憑證;
  • 系統角色模型:
    • SSO Server:認證中心,提供用戶登錄、註銷以及登錄狀態校驗等功能。
    • Client應用:受SSO保護的Client端Web應用,爲用戶請求提供接口服務;
    • 用戶:發起請求的用戶,如使用Android、IOS、桌面客戶端等請求訪問。

4.8 未登陸狀態請求處理

基於Cookie,未登陸狀態請求:

  • 頁面請求:redirect 到SSO Server登陸界面;
  • JSON請求:返回未登陸的JSON格式響應數據
    • 數據格式:
      • code:501 錯誤碼
      • msg:sso not login.

基於Token,未登陸狀態請求:

  • 返回未登陸的JSON格式響應數據
    • 數據格式:
      • code:501 錯誤碼
      • msg:sso not login.

4.9 登陸態自動延期

支持自定義登陸態有效期窗口,默認24H,當登陸態有效期窗口過半時,自動順延一個週期;

4.10 記住密碼

未記住密碼時,關閉瀏覽器則登陸態失效;記住密碼時,登陸態自動延期,在自定義延期時間的基礎上,原則上能夠無限延期;

4.11 路徑排除

自定義路徑排除Path,容許設置多個,且支持Ant表達式。用於排除SSO客戶端不須要過濾的路徑

5、版本更新日誌

5.1 版本 v0.1.0,新特性[2018-04-04]

  • 一、簡潔:API直觀簡潔,可快速上手;
  • 二、輕量級:環境依賴小,部署與接入成本較低;
  • 三、單點登陸:只須要登陸一次就能夠訪問全部相互信任的應用系統。
  • 四、分佈式:接入SSO認證中心的應用,支持分佈式部署;
  • 五、HA:Server端與Client端,均支持集羣部署,提升系統可用性;
  • 六、實時性:系統登錄、註銷狀態,所有Server與Client端實時共享;
  • 七、CS結構:基於CS結構,包括Server"認證中心"與Client"受保護應用";
  • 八、跨域:支持跨域應用接入SSO認證中心;

5.2 版本 v1.1.0 Release Notes [2018-11-06]

  • 一、Redis配置方式加強,支持自定義DB、密碼、IP、PORT等等;;
  • 二、Token接入方式;除了常規Cookie方式外,新增Token接入方式,並提供Sample項目;
  • 三、登陸態自動延期:支持自定義登陸態有效期窗口,默認24H,當登陸態有效期窗口過半時,自動順延一個週期;
  • 四、"記住密碼" 功能優化:未記住密碼時,關閉瀏覽器則登陸態失效;記住密碼時,登陸態自動延期,在自定義延期時間的基礎上,原則上能夠無限延期;
  • 五、sessionId數據結構優化,進一步提高暴露破解難度;
  • 六、認證數據存儲結構調整,避免登錄信息存儲冗餘;
  • 七、認證中心用戶登陸校驗改成Mock數據方式,取消對DB強依賴,下降部署難度;
  • 八、Client端依賴Core包,slf4j依賴優化,移除log4j強依賴;
  • 九、Ajax請求未登陸處理邏輯優化,返回JSON格式提示數據;
  • 十、項目結構梳理,清理冗餘依賴,升級多項依賴版本至較近版本;
  • 十一、路徑排除:新增自定義屬性 "excludedPaths",容許設置多個,且支持Ant表達式。用於排除SSO客戶端不須要過濾的路徑

5.3 版本 v1.1.1 Release Notes [迭代中]

  • 一、 [迭代中]spring mvc 版本示例;

TODO LIST

  • 一、認證中心與接入端交互數據加密,加強安全性;redirect_url必須和臨時AccessToken配合纔會生效,AccessToken有效期60s;
  • 二、SSO SessionId 與IP綁定,加強用戶加強安全性;
  • 三、支持認證分組,分組內共享登錄狀態,分組之間登陸態隔離;待考慮;
  • 四、客戶端新增屬性 "xxl.sso.server",用於構建跳轉鏈接,防止跳轉第三方致使登錄漏洞;
  • 五、token驗證方式增長jwt方式支持;
  • 六、Client端移除Redis依賴,改成LocalCache + RPC校驗方式;

6、其餘

6.1 項目貢獻

歡迎參與項目貢獻!好比提交PR修復一個bug,或者新建 Issue 討論新特性或者變動。

6.2 用戶接入登記

更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。

6.3 開源協議和版權

產品開源免費,而且將持續提供免費的社區技術支持。我的或企業內部可自由的接入和使用。

  • Licensed under the GNU General Public License (GPL) v3.
  • Copyright (c) 2015-present, xuxueli.

捐贈

不管金額多少都足夠表達您這份心意,很是感謝 :) 前往捐贈

相關文章
相關標籤/搜索