大家好,我是 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.ServerApplication
、openjoe.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/*
server-url
為服務端地址client-id
和client-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/#/
大家的點贊、收藏和評論都是對作者的支援,如文章對你有幫助還請點贊轉發支援下,謝謝!