單點登錄(SSO)系統

設計一個 Java 單點登錄(SSO)系統需要解決跨系統認證和會話共享問題。以下是核心設計和實現方案,包含關鍵組件和代碼示例:


一、核心概念

  1. 認證中心 (Auth Center):中央身份驗證服務
  2. 令牌 (Token):用戶身份憑證(推薦 JWT)
  3. 應用系統:接入 SSO 的子系統

二、SSO 登錄流程

用戶 應用系統A 認證中心 應用系統B 訪問受限資源 重定向登錄(攜帶回調地址) 提交憑證(用戶名/密碼) 驗證憑證,生成JWT 重定向回調地址(帶Token) 驗證Token有效性 返回用戶信息 創建本地會話,授予訪問 訪問資源 重定向(攜帶新回調地址) 檢測全局會話存在 直接返回新Token 用戶 應用系統A 認證中心 應用系統B

三、關鍵組件實現

1. JWT 工具類
import io.jsonwebtoken.*;
import java.util.Date;public class JwtUtil {private static final String SECRET = "your-256-bit-secret";private static final long EXPIRATION = 3600000; // 1小時public static String generateToken(String username) {return Jwts.builder().setSubject(username).setExpiration(new Date(System.currentTimeMillis() + EXPIRATION)).signWith(SignatureAlgorithm.HS256, SECRET).compact();}public static String parseToken(String token) {try {return Jwts.parser().setSigningKey(SECRET).parseClaimsJws(token).getBody().getSubject();} catch (Exception e) {throw new RuntimeException("Token invalid");}}
}
2. 認證中心登錄接口
@RestController
@RequestMapping("/auth")
public class AuthController {@PostMapping("/login")public ResponseEntity<?> login(@RequestBody LoginRequest request, HttpServletResponse response) {// 1. 驗證用戶名密碼(省略數據庫驗證)if (!"admin".equals(request.getUsername()) || !"123456".equals(request.getPassword())) {return ResponseEntity.status(401).body("Invalid credentials");}// 2. 生成JWTString token = JwtUtil.generateToken(request.getUsername());// 3. 設置全局會話(Redis存儲)redisTemplate.opsForValue().set("SESSION:" + token, request.getUsername());// 4. 返回Token給客戶端return ResponseEntity.ok(new TokenResponse(token));}
}
3. Token 驗證接口
@RestController
@RequestMapping("/auth")
public class AuthController {@GetMapping("/validate")public ResponseEntity<?> validateToken(@RequestParam String token) {try {// 1. 驗證JWT有效性String username = JwtUtil.parseToken(token);// 2. 檢查Redis會話是否存在if (redisTemplate.hasKey("SESSION:" + token)) {return ResponseEntity.ok(username);}return ResponseEntity.status(401).body("Session expired");} catch (Exception e) {return ResponseEntity.status(401).body("Invalid token");}}
}
4. 應用系統攔截器
public class SSOInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {HttpSession session = request.getSession();// 1. 檢查本地會話if (session.getAttribute("user") != null) {return true;}// 2. 檢查請求中是否有TokenString token = request.getParameter("sso_token");if (token != null) {// 調用認證中心驗證TokenString username = authService.validateToken(token);if (username != null) {session.setAttribute("user", username);return true;}}// 3. 重定向到認證中心登錄String redirectUrl = "http://auth-center/login?redirect=" + URLEncoder.encode(request.getRequestURL().toString(), "UTF-8");response.sendRedirect(redirectUrl);return false;}
}

四、關鍵配置項

組件配置示例說明
Redisspring.redis.host=localhost存儲全局會話
JWTjwt.secret=your-256-bit-secretHS256算法密鑰
回調地址app.callback-url=http://app1/callback子系統注冊的回調地址

五、安全增強措施

  1. HTTPS:所有通信強制使用 HTTPS
  2. 雙重驗證:JWT + Redis會話檢查防止偽造
  3. CSRF防護:登錄時生成隨機 state 參數
  4. 黑名單:注銷時加入 JWT 黑名單
  5. 令牌刷新:使用 refresh token 機制

六、擴展設計

  1. OAuth2集成:支持第三方登錄(微信/Google)
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(ClientRegistration.withRegistrationId("weixin").clientId("weixin-appid").clientSecret("weixin-secret").authorizationUri("https://...").build());
}
  1. 跨域支持:配置 @CrossOrigin 解決前后端分離問題
  2. 會話同步:使用 Redis Pub/Sub 實現全局注銷

七、部署架構

                          +-----------------+|     用戶瀏覽器    |+--------+--------+| (重定向)v
+----------------+           +-----+------+        +----------------+
|  應用系統A      |<--Token-->| 認證中心    |<--DB-->| 用戶數據庫       |
| (http://app1)  |           | (獨立服務)  |        |                |
+----------------+           +-----^------+        +----------------+| (重定向)
+----------------+                 |
|  應用系統B      |<---------------+
| (http://app2)  |
+----------------+

通過以上設計,可實現:

  1. 一處登錄,多系統通用
  2. 會話狀態集中管理
  3. 安全可靠的 Token 機制
  4. 支持高并發和分布式部署

完整實現需補充數據庫交互、錯誤處理、日志監控等模塊,并參考 Spring Security OAuth2 或 Apache Shiro 等框架進行優化。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87884.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《信息技術》科技核心期刊推薦

【科研必看】《信息技術》——科技核心期刊&#xff0c;助力你發表高影響力論文&#xff01; 如果你是一位科研工作者、學者或者在校學生&#xff0c;正在為發表論文而努力&#xff0c;那么《信息技術》期刊無疑是你不可錯過的選擇&#xff01;這本期刊以其卓越的學術影響力&am…

界面組件DevExpress WPF中文教程:Grid - 如何遍歷節點?

DevExpress WPF擁有120個控件和庫&#xff0c;將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序&#xff0c;這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

2D寫實交互數字人:讓AI形象擁有“真人溫度“的技術革命

在人工智能技術日新月異的今天&#xff0c;數字人已不再是科幻電影中的概念&#xff0c;而是逐步滲透到我們日常生活的各個領域。然而&#xff0c;市場上大多數數字人產品仍停留在"能說會動"的初級階段&#xff0c;缺乏真正的情感交互能力&#xff0c;這種"機械…

2025 年拓客系統排行榜

在數字化營銷時代&#xff0c;拓客系統成為企業獲取客戶資源、提升銷售效率的關鍵工具。以下為您盤點 2025 年表現出色的中文名字拓客系統&#xff0c;其中 微拓客 憑借強大功能脫穎而出&#xff0c;成為眾多從業者的首選。 一、微拓客&#xff1a;精準拓客的全能王者 微拓客堪…

TikTok 矩陣如何快速漲粉

在社交媒體的廣袤天地里&#xff0c;TikTok 以其強大的影響力和龐大的用戶基礎&#xff0c;成為眾多創作者和品牌競相角逐的舞臺。構建 TikTok 矩陣&#xff0c;是擴大影響力、實現快速漲粉的有效策略。那么&#xff0c;究竟如何讓 TikTok 矩陣快速漲粉呢&#xff1f;下面將為您…

基于微信小程序和云開發的企業綠色融資平臺的設計與實現

文章目錄 摘要前言緒論1. 課題背景2. 國內外現狀與趨勢2.1 國內研究現狀2.2 國外研究現狀2.3 發展趨勢3. 課題內容相關技術與方法介紹1. 微信小程序開發技術2. 騰訊云開發平臺3. 綠色項目評估模型4. 智能匹配算法5. 碳核算方法系統分析1. 需求分析1.1 用戶需求1.2 功能需求1.3 …

如何自建服務器并開啟公網IP:本地內網網址讓外網訪問詳細教學

本地內網環境自建服務器后&#xff0c;如何讓外網訪問&#xff0c;提供互聯網連接服務呢&#xff1f;有不少方法都可以實現&#xff0c;常見的有如公網IP、DDNS動態域名、nat123內網穿透等&#xff0c;下面詳細教學。 一、申請開公網IP-----------------公網IP篇-------------…

企業公用電腦登錄安全管控的終極方案:ASP操作系統安全登錄管控方案

一、引言&#xff1a;公用電腦——企業安全管理的“灰色地帶” 在企業辦公場景中&#xff0c;公用電腦&#xff08;如會議室電腦、生產線終端、客服工位&#xff09;因多用戶共用、權限復雜&#xff0c;往往成為安全管理的薄弱環節。員工隨意登錄、弱密碼泛濫、敏感數據泄露事…

HarmonyOS-ArkTS開發指南:從基礎到實戰

目錄 一、基礎語法 二、聲明式 UI 開發 基本組件結構 三、狀態管理 四、生命周期鉤子 五、組件化開發 1. 創建自定義組件 2. 組件嵌套 六、事件處理 七、布局系統 八、樣式設置 九、條件渲染與列表渲染 十、異步操作 十一、路由導航 開發建議 一、基礎語法 ArkT…

算法-Day04

今天還是給大家分享幾道題目&#xff0c;希望大家可以好好理解。 第一題 問題描述 小藍有一天誤入了一個混境之地。 好消息是&#xff1a;他誤打誤撞拿到了一張地圖&#xff0c;并從中獲取到以下信息&#xff1a; 混境之地是一個 n?m大小的矩陣&#xff0c;這個地圖中一共…

Git版本控制詳細資料

Git安裝基本配置 下載安裝(一路next) 打開bash終端&#xff08;git專用&#xff09; 命令: git -v(查看版本號) 配置: 用戶名和郵箱,應用在每次提交代碼版本時表明自己身份 命令: git config --global user.name "FT" git config --global user.email "F…

利用井云平臺把Coze工作流接入小程序/網站封裝變現 | 詳細步驟→

今天來看看怎么把Coze工作流接入井云生成你的專屬網站/小程序&#xff01; 當前已支持三大模塊接入&#xff1a;? 工作流 ? 智能體 ? 外部網頁 本文所用工具 1、扣子&#xff1a;www.coze.cn 2、井云智能體&#xff1a;jingyun.center 為什么選擇井云平臺&#xff1f; …

linux weston flutter remote desktop

參考:Outputs — weston 14.0.90 documentation Weston 14.0: DRM-backend, color management, and output mirroring Weston 14.0: DRM-backend, color management, and output mirroring ??? 3. DRM 輸出可鏡像至遠程輸出(RDP、VNC、PipeWire) 這次更新還帶來了一個…

GitHub Copilot 是什么,怎么使用

GitHub Copilot 是一個由 GitHub 和 OpenAI 聯合開發的 AI 編程助手&#xff0c;它可以在你寫代碼的時候自動給出建議、補全代碼&#xff0c;甚至生成整個函數或算法。它就像一個“聰明的副駕駛”&#xff0c;時刻在你旁邊協助你寫代碼。 簡單解釋&#xff1a; GitHub Copilot …

Android系統及應用QUIC協議支持詳解

QUIC協議在Android中的全面支持與實踐指南 本文深入探討QUIC協議在Android中的實現細節&#xff0c;涵蓋基礎原理、開發技巧、性能優化及前沿擴展&#xff0c;提供完整的Kotlin代碼示例和工程實踐指南。 1. QUIC協議核心優勢 QUIC&#xff08;Quick UDP Internet Connections&…

.NET基于類名約定的自動依賴注入完整指南

&#x1f680; .NET基于類名約定的自動依賴注入完整指南 基于類名約定的自動依賴注入可大幅減少手動注冊服務的工作量&#xff0c;本文將通過清晰的結構、美觀的排版和豐富的示例&#xff0c;幫助你快速掌握這一實用技術。 &#x1f308; 核心特性概覽 特性說明類名約定自動…

Redis各數據結構的詳細使用和使用場景

Redis各數據結構的詳細使用 大家好&#xff01;今天我們來聊聊Redis這個強大的內存數據庫。就像我們生活中的工具箱一樣&#xff0c;Redis提供了多種"工具"&#xff08;數據結構&#xff09;來幫助我們解決不同的問題。有些工具像螺絲刀&#xff08;字符串&#xff…

MSYS2 環境下 Python 開發配置(結合 PyCharm)使用筆記

【筆記】MSYS2 的 MinGW64 環境中正確安裝 Python 相關環境管理工具 &#xff08;Poetry、Virtualenv、Pipenv 和 UV&#xff09;-CSDN博客 MSYS2 環境配置與 Python 項目依賴管理筆記_msys更新python-CSDN博客 【技術筆記】MSYS2 指定 Python 版本安裝方案_pacman -u 安裝指定…

Python爬蟲實戰:研究Splinter相關技術

1. 引言 1.1 研究背景與意義 隨著 Web 2.0 技術的發展,現代網頁越來越多地采用 JavaScript 動態生成內容。傳統爬蟲通過直接請求 HTML 頁面的方式,無法獲取這些動態渲染的內容,導致爬取數據不完整。據統計,全球前 1000 名網站中,超過 70% 的頁面包含動態加載內容 。Spli…

大氣商務工作匯報總結PPT模版分享

藍色商務工作總結PPT模版&#xff0c;莫蘭迪工作總結PPT模版&#xff0c;年中工作匯報PPT模版&#xff0c;簡約工作匯報PPT模版&#xff0c;上半年工作總結PPT模版&#xff0c;極簡工作匯報PPT模版&#xff0c;歐美簡約PPT模版&#xff0c;大氣商務通用PPT模版&#xff0c;團隊…