高可用!一個基於 SpingBoot + Oauth2 的單點認證授權中心!

Java陈序员發表於2024-09-19

大家好,我是 Java陳序員

現代企業中,往往包含多個系統,如果每個系統都需要登入註冊,這樣的使用者體驗很不好!

這時,就需要設計一個單點登入系統,一次登入處處登入,一次退出處處退出!

今天,給大家介紹一個基於 SpingBoot + Oauth2 的單點認證授權中心,支援分散式高可用!

關注微信公眾號:【Java陳序員】,獲取開源專案分享、AI副業分享、超200本經典計算機電子書籍等。

專案介紹

Smart-SSO —— 依託當下備受青睞的 SpringBoot 技術,以 OAuth2 認證結合 RBAC 許可權設計為基礎,為您塑造一個輕量級、高可用的單點認證授權中心。

功能說明

  • 輕量級:基於 SpringBoot 和 OAuth2 協議的授權碼模式極簡實現
  • 單點退出:客戶端應用在獲取 Token 時,隱性把自身的登出地址傳遞給服務端,在任意客戶端應用操作退出,服務端透過遠端通知所有客戶端應用登出本地 Token,完成單點退出
  • 自動續簽:使用 OAuth2 協議的 accessToken 策略,過期由客戶端後端自動呼叫 refreshToken 重新整理介面,並更新服務端憑證存根時效,完成過期自動續簽
  • 跨域支援:服務端和客戶端允許在不同域名下,完成跨域的單點登入和退出機制;
  • 前後端分離: 使用者在前後端分離的架構下(無 Cookie 模式),也能輕易實現單點登入的相關功能
  • 按鈕級許可權:服務端對許可權進行選單和按鈕分類,透過請求 uri 和請求方法匹配的方式實現許可權按鈕級控制
  • 分散式部署:服務端和客戶端都支援基於 Redis 共享 Token 的多例項部署場景

技術棧

  • SpringBoot:容器 + MVC 框架
  • Redis:分散式場景 Token 管理
  • Freemarker:模板引擎
  • SpringFox:文件
  • Mybatis-Plus:ORM 框架
  • Mysql:資料庫驅動
  • HttpClient:授權碼認證、客戶端和服務端通訊

實現原理

單點登入

單點退出

專案截圖

單點登入頁

客戶端示例登入成功頁

服務端管控頁

快速上手

1、拉取程式碼,並將專案以 Maven 的形式匯入到 IDEA 中

git clone https://github.com/a466350665/smart-sso.git

2、專案結構

smart-sso
├── smart-sso-demo -- 客戶端示例
├── smart-sso-demo-h5 -- 前後端分離客戶端示例
├── smart-sso-server -- 單點登入許可權管理服務端
├── smart-sso-starter -- 依賴裝配模組
│   ├── smart-sso-starter-base -- 公用的基礎常量、工具、憑證清理機制
│   ├── smart-sso-starter-client -- 客戶端依賴包,客戶端Token生命週期管理
│   ├── smart-sso-starter-client-redis -- 客戶端依賴裝配,分散式部署場景redis支援
│   ├── smart-sso-starter-server -- 服務端依賴包,服務端憑證生命週期管理
│   ├── smart-sso-starter-server-redis -- 服務端依賴裝配,分散式部署場景redis支援

3、建立資料庫

CREATE DATABASE `smart-sso` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

4、執行 db/smart-sso.sql 指令碼,初始化資料庫資料

5、修改服務端 smart-sso-server 配置檔案 application.yaml 中的資料庫連線配置,改成自己的連線資訊

6、在使用時需要給服務端和客戶端配置不同的域名,需要找到並修改 hosts 檔案,增加域名本地對映

127.0.0.1 server.smart-sso.com
127.0.0.1 demo.smart-sso.com

hosts 檔案目錄:

  • Windows:C:\Windows\System32\drivers\etc\hosts
  • Mac:/private/etc/hosts

7、分別執行 openjoe.smart.sso.server.ServerApplicationopenjoe.smart.sso.demo.DemoApplication 主啟動類啟動服務端服務、客戶端服務

8、登入驗證,瀏覽器訪問客戶端 http://demo.smart-sso.com:8081,會自動跳轉至單點登入頁,登入成功後重定向至客戶端首頁

預設的賬號密碼是:admin/123456

接入指南

在前面快速上手中,簡單實現了 Smart-SSO 本地化部署使用,那麼當部署好後 Smart-SSO 後,客戶端如何接入呢?只需要以下簡單的幾步即可實現!

服務端登記

1、在服務端管控應用選單下,新增應用。

2、記錄應用認證授權需要的金鑰資訊,後續配置會用到。

客戶端註冊

1、引入依賴

<dependency>
    <groupId>io.github.openjoe</groupId>
    <artifactId>smart-sso-starter-client</artifactId>
    <version>${smart.sso.version}</version>
</dependency>

2、配置單點登入資訊

smart:
  sso:
    # 服務端地址
    server-url: http://server.smart-sso.com:8080
    # 客戶端ID
    client-id: 1003
    # 客戶端金鑰
    client-secret: 274319b61fb8eac12f88b8893d544365
    # 客戶端排除攔截 urls,預設為空,支援 AntPathMatcher 匹配
    exclude-urls:
      - /oa/demo/page
      - /oa/demo/i18n
    # 客戶端攔截 urls,預設通配所有路徑,支援 AntPathMatcher 匹配
    url-patterns:
      - /oa/*
  1. server-url 為服務端地址
  2. client-idclient-secret 是步驟一在服務端登記時生成的金鑰資訊,用於客戶端向服務端發起 accessToken 請求做校驗

驗證使用

1、啟動客戶端服務,當訪問 http://{ip:port}/oa/demo/page 或者 http://{ip:port}/oa/demo/i18n 時,發現不用鑑權,因為配置在 smart.sso.exclude-urls 中,從而不會跳轉至服務端登入頁。

2、啟動客戶端服務,當訪問 hhttp://{ip:port}/oa/demo/list 時,需要重定向至服務端登入頁進行登入鑑權。因為 smart.sso.urls-patterns 所匹配,需要鑑權後才能訪問。

客戶端獲取使用者許可權資訊

在客戶端中,常常因為業務功能需求,需要獲取當前使用者資訊,可透過如下方式獲取使用者資訊和許可權資訊

使用者資訊

TokenUser user = ClientContextHolder.getUser(request);
// 登入使用者名稱
user.getUsername();
// 使用者ID
user.getId();

許可權資訊

TokenPermission permission = ClientContextHolder.getPermission(request);
// 使用者當前應用已分配的選單
permission.getMenuList();
// 使用者當前應用已分配的許可權
permission.getPermissionSet());

可以說 Smart-SSO 實現了業界通用的單點登入系統方案,前後端分離模式和高可用的部署使用,可參考專案文件。

如果你想實現一套單點認證授權中心,值得參考借鑑~

專案地址:https://github.com/a466350665/smart-sso

最後

推薦的開源專案已經收錄到 GitHub 專案,歡迎 Star

https://github.com/chenyl8848/great-open-source-project

或者訪問網站,進行線上瀏覽:

https://chencoding.top:8090/#/

大家的點贊、收藏和評論都是對作者的支援,如文章對你有幫助還請點贊轉發支援下,謝謝!


相關文章