BladeX單點登錄與若依框架集成實現

在這里插入圖片描述

1. 概述

本文檔詳細介紹了將BladeX認證系統與若依(RuoYi)框架集成的完整實現過程。集成采用OAuth2.0授權碼流程,使用戶能夠通過BladeX賬號直接登錄若依系統,實現無縫單點登錄體驗。

2. 系統架構

2.1 總體架構

1. 點擊BladeX登錄
2. 重定向到BladeX授權頁
3. 用戶授權
4. 返回授權碼
5. 發送授權碼
6. 請求令牌
7. 返回用戶信息和令牌
8. 查找用戶并生成令牌
9. 返回若依JWT令牌
10. 保存令牌并跳轉
用戶
若依前端
BladeX認證服務
若依回調頁面
若依后端
若依Redis緩存
若依系統首頁

2.2 關鍵組件

  • BladeAuthUtil: 工具類,處理與BladeX認證服務的通信
  • BladeAuthController: 后端控制器,處理授權碼并生成若依JWT令牌
  • BladeCallback.vue: 前端頁面,接收授權回調并處理認證結果

3. 后端實現

3.1 BladeAuthUtil工具類

public class BladeAuthUtil {public static Map<String, Object> getTokenByCode(String authUrl, String clientId, String clientSecret, String code, String redirectUri, String tenantId) {// 構建請求參數MultiValueMap<String, String> params = new LinkedMultiValueMap<>();params.add("grant_type", "authorization_code");params.add("code", code);params.add("client_id", clientId);params.add("client_secret", clientSecret);params.add("redirect_uri", redirectUri);if (tenantId != null && !tenantId.isEmpty()) {params.add("tenant_id", tenantId);}// 發送請求獲取令牌try {RestTemplate restTemplate = new RestTemplate();HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);ResponseEntity<Map> response = restTemplate.exchange(authUrl, HttpMethod.POST, requestEntity, Map.class);return response.getBody();} catch (Exception e) {// 處理異常return null;}}
}

3.2 BladeAuthController控制器

@RestController
@RequestMapping("/blade/auth")
public class BladeAuthController {@Value("${blade.auth.url:}")private String authUrl;@Value("${blade.auth.client-id:}")private String clientId;@Value("${blade.auth.client-secret:}")private String clientSecret;@Value("${blade.auth.redirect-uri:}")private String redirectUri;@Autowiredprivate ISysUserService userService;@Autowiredprivate TokenService tokenService;@Autowiredprivate UserDetailsServiceImpl userDetailsService;@GetMapping("/getTokenInfo")public AjaxResult getTokenInfo(@RequestParam("code") String code, @RequestParam(value = "tenant_id", required = false) String tenantId) {// 獲取BladeX令牌Map<String, Object> tokenInfo = BladeAuthUtil.getTokenByCode(authUrl, clientId, clientSecret, code, redirectUri, tenantId);// 提取用戶名并查找若依系統用戶if (tokenInfo != null && tokenInfo.containsKey("account")) {String userName = (String) tokenInfo.get("account");SysUser user = userService.selectUserByUserName(userName);if (user != null) {// 使用UserDetailsServiceImpl創建LoginUser對象LoginUser loginUser = (LoginUser) userDetailsService.createLoginUser(user);// 記錄登錄信息recordLoginInfo(user.getUserId());// 使用TokenService生成JWT令牌String token = tokenService.createToken(loginUser);// 返回令牌AjaxResult ajax = AjaxResult.success();ajax.put(Constants.TOKEN, token);return ajax;}}return AjaxResult.error("認證失敗");}
}

4. 前端實現

4.1 登錄頁面增加BladeX登錄按鈕

<template><div class="login"><!-- 現有登錄表單 --><!-- 添加BladeX登錄按鈕 --><el-button type="primary" class="blade-login-btn" @click="handleBladeLogin">使用BladeX登錄</el-button></div>
</template><script>
export default {methods: {handleBladeLogin() {// BladeX授權頁面URLconst bladeAuthUrl = process.env.VUE_APP_BLADE_AUTH_URL;const clientId = process.env.VUE_APP_BLADE_CLIENT_ID;const redirectUri = encodeURIComponent(process.env.VUE_APP_BLADE_REDIRECT_URI);// 跳轉到BladeX授權頁面window.location.href = `${bladeAuthUrl}?client_id=${clientId}&response_type=code&redirect_uri=${redirectUri}`;}}
}
</script>

4.2 BladeCallback.vue回調處理頁面

<template><div class="blade-callback-container"><div class="callback-card"><div v-if="loading"><h2>正在處理BladeX授權...</h2><el-progress :percentage="progress"></el-progress></div><div v-else-if="error"><h2>授權處理失敗</h2><p>{{ errorMessage }}</p><el-button type="primary" @click="returnToLogin">返回登錄頁</el-button></div></div></div>
</template><script>
import { Message } from 'element-ui';
import { setToken } from '@/utils/auth';export default {data() {return {loading: true,error: false,errorMessage: '',code: '',tenantId: ''};},created() {// 獲取URL參數中的授權碼this.code = this.$route.query.code;this.tenantId = this.$route.query.state || '';// 處理授權碼this.handleAuthorizationCode();},methods: {// 處理授權碼handleAuthorizationCode() {request({url: '/blade/auth/getTokenInfo',method: 'get',params: {code: this.code,tenant_id: this.tenantId}}).then(response => {if (response.code === 200 && response.data && response.data.token) {// 使用若依token登錄this.handleLoginSuccess(response.data.token);} else {// 顯示錯誤信息this.handleError(response.msg || '獲取令牌失敗');}}).catch(error => {this.handleError('獲取令牌失敗: ' + error.message);});},// 處理登錄成功handleLoginSuccess(token) {// 保存tokensetToken(token);// 獲取用戶信息并生成路由this.$store.dispatch('GetInfo').then(() => {this.$store.dispatch('GenerateRoutes').then(accessRoutes => {// 動態添加可訪問路由表this.$router.addRoutes(accessRoutes);// 跳轉到首頁this.$router.push({ path: '/' });});});}}
};
</script>

5. 配置說明

5.1 后端配置 (application.yml)

# BladeX認證配置
blade:auth:# BladeX認證服務地址url: https://auth.example.com/oauth/token# 客戶端IDclient-id: your_client_id# 客戶端密鑰client-secret: your_client_secret# 重定向URIredirect-uri: http://your-app-url/auth/blade-callback

5.2 前端配置 (.env.development)

# BladeX配置
VUE_APP_BLADE_AUTH_URL=https://auth.example.com/oauth/authorize
VUE_APP_BLADE_CLIENT_ID=your_client_id
VUE_APP_BLADE_REDIRECT_URI=http://your-app-url/auth/blade-callback

5.3 安全配置

SecurityConfig.java中添加允許匿名訪問的路徑:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {httpSecurity// 其他配置.antMatchers("/blade/auth/getTokenInfo",// 其他允許匿名訪問的路徑).permitAll()
}

6. 實現步驟

6.1 前置準備

  1. 向BladeX系統管理員申請OAuth2.0客戶端ID和密鑰
  2. 確認并配置授權回調URL
  3. 確保若依系統中存在與BladeX用戶名相匹配的賬號

6.2 后端實現步驟

  1. 創建BladeAuthUtil工具類
  2. 實現BladeAuthController控制器
  3. 在application.yml中添加BladeX配置
  4. 更新SecurityConfig安全配置

6.3 前端實現步驟

  1. 在登錄頁添加BladeX登錄按鈕
  2. 創建回調處理頁面BladeCallback.vue
  3. 配置前端環境變量
  4. 更新路由配置,添加回調頁面路由

6.4 路由配置

在前端路由配置中添加BladeX回調頁面:

// router/index.js
export const constantRoutes = [// 其他路由{path: '/auth/blade-callback',component: () => import('@/views/auth/BladeCallback'),hidden: true}
]

7. 集成測試

7.1 測試流程

  1. 點擊BladeX登錄按鈕,驗證是否正確重定向到BladeX授權頁面
  2. 在BladeX系統完成登錄授權
  3. 驗證是否正確重定向回若依系統
  4. 檢查是否成功獲取若依JWT令牌
  5. 驗證是否成功進入若依系統首頁
  6. 測試若依系統的各項功能是否正常

7.2 故障排查

  1. 檢查瀏覽器控制臺日志
  2. 查看后端日志輸出
  3. 使用開發者工具檢查網絡請求
  4. 驗證Redis中是否成功緩存了登錄用戶信息

8. 安全與性能考慮

8.1 安全

  • 確保client_secret不被暴露在前端代碼中
  • 實現CSRF防護
  • 設置合理的token過期時間
  • 考慮實現單點登出功能

8.2 性能

  • 緩存用戶權限信息
  • 考慮多Redis節點的情況下的token共享
  • 優化前端資源加載

9. 常見問題與解決方案

9.1 回調地址配置問題

問題:BladeX系統報錯"重定向URI不匹配"

解決方案:確保在BladeX系統注冊的重定向URI與application.yml和前端環境變量中配置的完全一致,包括協議、域名、端口和路徑。

9.2 無法獲取用戶信息

問題:獲取到BladeX令牌但無法獲取用戶信息

解決方案:檢查請求參數是否正確,特別是client_id和client_secret,并確認BladeX用戶賬號是否有效。

9.3 若依系統找不到對應用戶

問題:BladeX認證成功但若依系統找不到對應用戶

解決方案:確保在若依系統中創建與BladeX用戶名相匹配的賬號,或實現自動創建用戶的功能。

10. 結論

通過本文檔介紹的方法,成功實現了BladeX單點登錄與若依框架的無縫集成,用戶可以使用BladeX賬號直接登錄若依系統,享受到統一認證的便利性。集成過程充分利用了若依現有的登錄機制,最小化了代碼修改,確保了系統的穩定性和安全性。

本集成方案具有以下優勢:

  • 完全復用若依原生登錄流程的后半部分,確保與系統其他部分的一致性
  • 令牌格式、存儲、過期機制與原生系統保持一致
  • 最小化修改,降低集成風險
  • BladeX用戶享有與普通登錄用戶相同的體驗

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

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

相關文章

初識Redis · set和zset

目錄 前言&#xff1a; set 基本命令 交集并集差集 內部編碼和應用場景 zset 基本命令 交集并集差集 內部編碼和應用場景 應用場景&#xff08;AI生成&#xff09; 排行榜系統 應用背景 設計思路 熱榜系統 應用背景 設計思路 熱度計算方式 總結對比表 前言&a…

playwright 教程高級篇:掌握網頁自動化與驗證碼處理等關鍵技術詳解

Playwright 教程高級篇:掌握網頁自動化與驗證碼處理等關鍵技術詳解 本教程將帶您一步步學習如何使用 Playwright——一個強大的瀏覽器自動化工具,來完成網頁任務,例如提交鏈接并處理旋轉驗證碼。我們將按照典型的自動化流程順序,從啟動瀏覽器到關閉瀏覽器,詳細講解每個步驟…

數據結構(完)

樹 二叉樹 構建二叉樹 int value;Node left;Node right;public Node(int val) {valueval;} 節點的添加 Node rootnull;public void insert(int num) {Node nodenew Node(num);if(rootnull) {rootnode;return;}Node index root;while(true) {//插入的節點值小if(index.value&g…

FastAPI與SQLAlchemy數據庫集成與CRUD操作

title: FastAPI與SQLAlchemy數據庫集成與CRUD操作 date: 2025/04/16 09:50:57 updated: 2025/04/16 09:50:57 author: cmdragon excerpt: FastAPI與SQLAlchemy集成基礎包括環境準備、數據庫連接配置和模型定義。CRUD操作通過數據訪問層封裝和路由層實現,確保線程安全和事務…

一個基于Django的寫字樓管理系統實現方案

一個基于Django的寫字樓管理系統實現方案 用戶現在需要我用Django來編寫一個寫字樓管理系統的Web版本&#xff0c;要求包括增刪改查寫字樓的HTML頁面&#xff0c;視頻管理功能&#xff0c;本地化部署&#xff0c;以及人員權限管理&#xff0c;包含完整的代碼結構和功能實現&am…

mongodb在window10中創建副本集的方法,以及node.js連接副本集的方法

創建Mongodb的副本集最好是新建一個文件夾&#xff0c;如D:/data&#xff0c;不要在mongodb安裝文件夾里面創建副本集&#xff0c;雖然這樣也可以&#xff0c;但是容易造成誤操作或路徑混亂&#xff1b;在新建文件夾里與現有 MongoDB 數據隔離&#xff0c;避免誤操作影響原有數…

Maven 多倉庫與鏡像配置全攻略:從原理到企業級實踐

Maven 多倉庫與鏡像配置全攻略&#xff1a;從原理到企業級實踐 一、核心概念&#xff1a;Repository 與 Mirror 的本質差異 在 Maven 依賴管理體系中&#xff0c;repository與mirror是構建可靠依賴解析鏈的兩大核心組件&#xff0c;其核心區別如下&#xff1a; 1. Repositor…

STM32 四足機器人常見問題匯總

文章不介紹具體參數&#xff0c;有需求可去網上搜索。 特別聲明&#xff1a;不論年齡&#xff0c;不看學歷。既然你對這個領域的東西感興趣&#xff0c;就應該不斷培養自己提出問題、思考問題、探索答案的能力。 提出問題&#xff1a;提出問題時&#xff0c;應說明是哪款產品&a…

MySQL 中 `${}` 和 `#{}` 占位符詳解及面試高頻考點

文章目錄 一、概述二、#{} 和 ${} 的核心區別1. 底層機制代碼示例 2. 核心區別總結 三、為什么表名只能用 ${}&#xff1f;1. 預編譯機制的限制2. 動態表名的實現 四、安全性注意事項1. ${} 的風險場景2. 安全實踐 五、面試高頻考點1. 基礎原理類問題**問題 1**&#xff1a;**問…

C語言編譯預處理2

#include <XXXX.h>和#include <XXXX.c> #include "XXXX.h" 是 C 語言中一條預處理指令 #include <XXXX.h>&#xff1a;這種形式用于包含系統標準庫的頭文件。預處理器會在系統默認的頭文件搜索路徑中查找XXXX.h 文件。例如在 Linux 系統中&#…

Elasticvue-輕量級Elasticsearch可視化管理工具

Elasticvue一個免費且開源的 Elasticsearch 在線可視化客戶端&#xff0c;用于管理 Elasticsearch 集群中的數據&#xff0c;完全支持 Elasticsearch 版本 8.x 和 7.x. 功能特色&#xff1a; 集群概覽索引和別名管理分片管理搜索和編輯文檔REST 查詢快照和存儲庫管理支持國際…

Git提交規范及最佳實踐

Git 提交規范通常是為了提高代碼提交的可讀性、可維護性和自動化效率&#xff08;如生成 ChangeLog&#xff09;。以下是常見的 Conventional Commits 規范&#xff0c;結合社區最佳實踐總結而成&#xff1a; 1. 提交格式 每次提交的 commit message 應包含三部分&#xff1a;…

Ubuntu中snap

通過Snap可以安裝眾多的軟件包。需要注意的是&#xff0c;snap是一種全新的軟件包管理方式&#xff0c;它類似一個容器擁有一個應用程序所有的文件和庫&#xff0c;各個應用程序之間完全獨立。所以使用snap包的好處就是它解決了應用程序之間的依賴問題&#xff0c;使應用程序之…

android studio 運行java main報錯

運行某個帶main函數的java文件報錯 Could not create task :app:Test.main(). > SourceSet with name main not found. 解決辦法&#xff1a;在工程的.idea/gradle.xml 文件下添加&#xff1a; <option name"delegatedBuild" value"false" /&g…

openssh離線一鍵升級腳本分享(含安裝包)

查看當前的版本 [rootmyoracle ~]#ssh -V相關安裝包下載地址 openssh下載地址&#xff1a;http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下載地址&#xff1a;https://www.openssl.org/source/zlib下載地址&#xff1a;http://www.zlib.net/今天演示從7.4升級…

Mac M1管理多個Node.js版本

目錄 1. 使用 nvm (Node Version Manager) 1.1.安裝 nvm 1.2.安裝Node.js版本 1.3.查看已安裝的node版本列表 1.4.使用特定版本的Node.js 1.5.查看當前使用的版本 2. 使用 fnm (Fast Node Manager) 2.1.安裝 fnm 2.2.安裝Node.js版本 2.3.查看已安裝的版本 2.4.使用…

Unity中國戰略調整簡訊:Unity6下架 團結引擎接棒

Unity中國戰略調整簡訊&#xff1a;Unity6下架 團結引擎接棒 免費版 2025年4月9日 —— Unity中國宣布自即日起&#xff0c;中國大陸及港澳地區停止提供Unity 6及后續版本下載與服務&#xff0c;相關功能由國產引擎“團結引擎”承接。國際版2022 LTS及更早版本仍由Unity中國維護…

TestNG 單元測試詳解

1、測試環境 jdk1.8.0 121 myeclipse-10.0-offline-installer-windows.exe TestNG 插件 org.testng.eclipse 6.8.6.20130607 0745 2、介紹 套件(suite):由一個 XML 文件表示,通過<suite>標簽定義,包含一個或更多測試(test)。測試(test):由<test>定義&#xf…

C復習(主要復習)

指針和數組 指針數組是一個數組&#xff0c;數組的每個元素都是指針。它適用于需要存儲多個指針的場景&#xff0c;如字符串數組。數組指針是一個指針&#xff0c;指向一個數組。它適用于需要傳遞整個數組給函數或處理多維數組的場景。 函數指針&#xff1a;函數指針的定義需要…

探索大語言模型(LLM):定義、發展、構建與應用

文章目錄 引言大規模語言模型的基本概念大規模語言模型的發展歷程1. 基礎模型階段&#xff08;2018年至2021年&#xff09;2. 能力探索階段&#xff08;2019年至2022年&#xff09;3. 突破發展階段&#xff08;以2022年11月ChatGPT的發布為起點&#xff09; 大規模語言模型的構…