日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

借助xxl-sso实现SSO

發(fā)布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 借助xxl-sso实现SSO 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

市場上一下主流的SSO技術(shù)搭配方案:

  • SpringSecurity + OAuth2
  • SpringSecurity + CAS 功能較弱,對前后端分離的項目支持不是很好
  • Shiro + CAS
  • JWT 可以自定義需求,靈活擴展鑒權(quán)方式
  • 本篇主要是單點登錄,不涉及鑒權(quán),后面文章會再補充

    xxl-sso 是一個國產(chǎn) SSO 框架,基于 cookies 實現(xiàn),也許你會考慮跨域問題,雖然 cookies 本身不跨域,但可以利用它實現(xiàn)跨域的 SSO。

    1、拉取官方示例項目

    gitee地址:https://gitee.com/xuxueli0323/xxl-sso
    github地址:https://github.com/xuxueli/xxl-sso

    模塊說明:
    • xxl-sso-server:中央認(rèn)證服務(wù),支持集群
    • 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版本
    依賴環(huán)境:

    JDK:1.7+
    Redis:4.0+

    修改本地host:
    127.0.0.1?xxlssoserver.com
    127.0.0.1?xxlssoclient1.com
    127.0.0.1?xxlssoclient2.com
    導(dǎo)入項目后啟動:

    修改 application.properties redis為本地地址后啟動 xxl-sso-server:

    ###?xxl-sso
    xxl.sso.redis.address=redis://127.0.0.1:6378
    xxl.sso.redis.expire.minite=1440

    完美報錯,如果你跟我上圖一樣,那么說明你的 redis 設(shè)置了密碼,這個官方示例代碼是沒有配置 redis 密碼的,看控制臺:

    我們可以看到初始化時用到了 redis 的本地地址,那么只需要知道在哪用了這個地址,那么肯定就會有設(shè)置密碼的地方。

    果不其然,我們最終發(fā)現(xiàn)了,地址是通過 JedisShardInfo 這個對象傳遞進去的,進入這個對象后發(fā)現(xiàn),竟然有個 password?這不就是我們要找的密碼嗎。

    再次啟動,成功啟動。

    同樣的修改 xxl-sso-samples > xxl-sso-web-samples-sprigboot 的 properties 然后再啟動。

    2、認(rèn)證流程

    客戶端端口號被我改成8085,認(rèn)證中心保持默認(rèn)端口號8080

    屆時,我們啟動了兩個項目,瀏覽器訪問第一個域名:http://xxlssoclient1.com:8085/xxl-sso-web-sample-springboot

    我們可以看到訪問后將被重定向到認(rèn)證中心 http://xxlssoserver.com:8080/xxl-sso-server ,后面攜帶參數(shù) redirect_url ,其為界面跳轉(zhuǎn)前的鏈接,認(rèn)證通過后將再次重定向回原來的訪問鏈接。

    上圖為認(rèn)證成功后的圖片,會攜帶 xxl_sso_sessionid,其用于識別用戶登陸信息,并會保存至本地兩份 cookie,皆用來保存 xxl_sso_sessionid ,一份當(dāng)前域名(xxlssoclient1.com),一份認(rèn)證中心(xxlssoserver.com)。

    保存的兩份 xxl_sso_sessionid 值是一樣的。

    xxl_sso_sessionid由來

    在上圖中的認(rèn)證界面,點擊登錄后會調(diào)用 WebController > doLogin 方法,用戶登錄成功后會生成該用戶的 xxl_sso_sessionid 信息,并保存至 redis 中,同時會把 xxl_sso_sessionid 寫入客戶端 cookie,然后將重定向到 redirect_url,并拼接 xxl_sso_sessionid 參數(shù),如下圖所示。

    我們再來訪問第二個客戶端試試,http://xxlssoclient2.com:8085/xxl-sso-web-sample-springboot,就目前并未向 http://xxlssoclient2.com:8085 寫入任何有關(guān) cookie 用戶會話信息:

    神奇的一幕發(fā)生了,顯然2號客戶端也成功登陸了,并攜帶了跟客戶端1一樣的 xxl_sso_sessionid 信息,我們再來看一下 cookie 信息:

    xxlssoclient2.com中的xxl_sso_sessionid哪里來的?

    其實通過 debug 發(fā)現(xiàn),在 xxlssoclient1.com 登陸的前提下,再去訪問 xxlssoclient2.com 時,由于沒有任何登陸信息同樣也是首先會跳轉(zhuǎn)至認(rèn)證中心:

    還記得客戶端1登陸后在認(rèn)證中心 xxlssoserver.com 同樣留下 xxl_sso_sessionid 信息嗎?

    顯然,客戶端2號再跳轉(zhuǎn)過來時復(fù)用了認(rèn)證中心的 xxl_sso_sessionid,然后發(fā)現(xiàn)存在 xxl_sso_sessionid,且 xxl_sso_sessionid 在 redis 里也沒過期,則認(rèn)為用戶已經(jīng)登陸了,重新重定向到 xxlssoclient2.com

    退出操作

    看完了統(tǒng)一登錄,再來看一下退出操作。

    退出相對就比較簡單了,主要就是驗證 redis 中的 xxl_sso_sessionid,我們來看一下退出方法:

    首先調(diào)用退出方法后會清空當(dāng)前網(wǎng)站的 cookie、redis 中的 xxl_sso_sessionid,比如在 xxlssoclient1.com、xxlssoclient2.com 都登陸的情況下,通過 xxlssoclient2.com 退出當(dāng)前用戶,則首先會清空 xxlssoclient2.com 站點下的 cookie ,同時后臺也會清空當(dāng)前用戶的 redis,那么再通過 xxlssoclient1.com 訪問時,盡管攜帶 xxl_sso_sessionid,但此時該信息已經(jīng)過期,所以會再次重定向認(rèn)證中心。

    xxl-sso小結(jié)

    如上為 xxl-sso 架構(gòu)圖,其核心為:

    sso-server:中央認(rèn)證服務(wù)
    sso-client:接入 sso 認(rèn)證中心的客戶端應(yīng)用
    sso-sessionId:登陸用戶會話ID,SSO 登陸成功后為用戶自動分配
    sso-user:登陸用戶信息,與 SSO sessionId 相對應(yīng)

    登陸流程剖析:
  • 客戶端訪問受限資源時,將會自動重定向到 SSO Server 進入統(tǒng)一登錄界面
  • 用戶登錄成功之后將會為用戶分配 SSO SessionId 并重定向返回來源客戶端端應(yīng)用,同時附帶分配的 SSO SessionId
  • 在客戶端的 SSO 過濾器里驗證 SSO SessionId 無誤,將 SSO SessionId 寫入到用戶瀏覽器客戶端域名下 cookie 中
  • SSO 過濾器驗證 SSO SessionId 通過,受限資源請求放行
  • 注銷流程剖析:
  • 用戶在客戶端應(yīng)用請求注銷時,將會重定向到 SSO Server 自動銷毀全局 SSO SessionId,實現(xiàn)全局銷毀用戶登陸信息;
  • 然后,訪問接入SSO 保護的任意客戶端應(yīng)用時,SSO 過濾器均會攔截請求并重定向到 SSO Server 的統(tǒng)一登錄界面;
  • 至此,通過 cookie+redis 解決了多端統(tǒng)一認(rèn)證,全局 sessionId 解決了 session 共享的問題。

    基于Cookie,相關(guān)概念
    • 登陸憑證存儲:登陸成功后,用戶登陸憑證被自動存儲在瀏覽器Cookie中
    • 客戶端校驗登陸狀態(tài):通過校驗請求Cookie中的是否包含用戶登錄憑證判斷
    • 系統(tǒng)角色模型:
      -- SSO Server:認(rèn)證中心,提供用戶登陸、注銷以及登陸狀態(tài)校驗等功能
      -- 客戶端應(yīng)用:受SSO保護的客戶端Web應(yīng)用,為用戶瀏覽器訪問提供服務(wù)
      -- 用戶:發(fā)起請求的用戶,使用瀏覽器訪問

    如果 Cookie 被禁用怎么辦?

    xxl-sso 同樣提供了 基于 token 接入方式,用于無法使用Cookie的場景使用,如APP、Cookie被禁用等,詳細(xì)可參考 xxl-sso-token-sample-springboot 項目。

    基于Token,相關(guān)概念
    • 登陸憑證存儲:登陸成功后,獲取到登錄憑證(xxl_sso_sessionid=xxx),需要主動存儲,如存儲在 localStorage、Sqlite 中
    • 客戶端校驗登陸狀態(tài):通過校驗請求 Header參數(shù) 中的是否包含用戶登錄憑證(xxl_sso_sessionid=xxx)判斷;因此,發(fā)送請求時需要在 Header 參數(shù) 中設(shè)置登陸憑證
    • 系統(tǒng)角色模型:
      -- SSO Server:認(rèn)證中心,提供用戶登陸、注銷以及登陸狀態(tài)校驗等功能
      --客戶端應(yīng)用:受SSO保護的客戶端Web應(yīng)用,為用戶請求提供接口服務(wù)
      -- 用戶:發(fā)起請求的用戶,如使用Android、IOS、桌面客戶端等請求訪問

    更多信息請訪問官方文檔:http://www.xuxueli.com/xxl-sso/#/

    后面會寫一篇實際項目中接入 xxl-sso 框架的實例。

    我創(chuàng)建了一個java相關(guān)的公眾號,用來記錄自己的學(xué)習(xí)之路,感興趣的小伙伴可以關(guān)注一下微信公眾號哈:niceyoo

    總結(jié)

    以上是生活随笔為你收集整理的借助xxl-sso实现SSO的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。