若依集成BladeX单点登录的令牌管理与api请求流程
目录
- 概述
- 系统架构
- 单点登录流程
- 令牌管理机制
- 接口调用流程
- 关键代码实现
- 数据结构
- 安全性考虑
- 常见问题与解决
概述
本文档详细说明若依系统如何实现与BladeX的单点登录集成,包括令牌管理和接口调用的完整流程。整个集成采用基于OAuth2的授权码流程,允许用户通过BladeX账号登录若依系统,并使用BladeX令牌访问BladeX的各类API。
系统架构
整个单点登录与令牌管理系统主要包含以下组件:
前端组件
BladeCallback.vue
:处理BladeX认证回调的前端页面/src/api/blade/apiTest.js
:BladeX API封装
后端服务
BladeAuthController
:处理BladeX认证回调和token获取BladeApiController
:提供BladeX API代理接口BladeTokenManager
:管理BladeX令牌的存储和检索BladeApiClient
:调用BladeX API的客户端BladeAuthUtil
:提供BladeX认证工具方法
数据存储
- Redis:存储BladeX令牌与若依用户ID的映射关系
单点登录流程
详细步骤
-
发起BladeX授权:用户在登录页点击"使用BladeX登录"按钮,前端将用户重定向到BladeX授权页面。
-
BladeX认证:用户在BladeX系统中完成登录和授权,BladeX认证服务生成授权码并重定向回若依系统的回调URL。
-
处理授权回调:
- 前端:
BladeCallback.vue
组件接收授权码,并调用后端接口 - 后端:
BladeAuthController.getTokenInfo
方法处理授权码
- 前端:
-
获取BladeX令牌:
BladeAuthUtil.getTokenByCode
方法向BladeX认证服务发送请求,交换授权码获取访问令牌- 解析响应,获取访问令牌、过期时间、用户信息等
-
查找对应若依用户:
- 根据BladeX返回的用户名(account)或username在若依系统中查找对应用户
- 如未找到匹配用户,返回错误信息
-
创建若依登录会话:
- 使用与原生登录完全相同的流程创建LoginUser对象
- 记录登录IP和时间
- 使用TokenService生成若依系统的JWT令牌
- 保存登录状态到Redis
-
保存BladeX令牌:
- 使用BladeTokenManager将BladeX访问令牌存入Redis
- 将令牌与若依用户ID建立映射关系
- 设置与BladeX令牌相同的过期时间
-
返回登录结果:
- 前端接收若依JWT令牌并保存
- 获取用户信息和路由
- 跳转到系统首页
令牌管理机制
BladeX令牌的管理由BladeTokenManager
类负责,主要功能包括:
-
令牌保存:
- 将BladeX令牌信息封装为
BladeToken
对象存储在Redis中 - 使用"blade_tokens:userId"作为Redis键名
- 设置与BladeX原始令牌相同的过期时间
- 将BladeX令牌信息封装为
-
令牌获取:
- 通过用户ID快速检索对应的BladeX令牌
- 提供访问令牌(access_token)的便捷获取方法
-
令牌验证:
- 检查用户是否拥有有效的BladeX令牌
- 令牌自动随Redis过期机制失效
-
令牌删除:
- 在用户登出或手动清除令牌时删除Redis中的对应记录
令牌数据结构
BladeToken
类包含以下字段:
userId
:若依系统用户IDuserName
:用户名accessToken
:BladeX访问令牌loginTime
:令牌获取时间(毫秒时间戳)expireTime
:令牌过期时间(毫秒时间戳)
接口调用流程
详细步骤
-
前端发起请求:
- 前端调用若依系统API,例如
/blade/api/getUserInfo
- 前端调用若依系统API,例如
-
获取BladeX令牌:
BladeApiController
从SecurityUtils
获取当前登录用户ID- 调用
BladeTokenManager.getAccessToken(userId)
获取令牌
-
构建API请求:
BladeApiClient
负责构建请求并添加必要的请求头- 添加"Blade-Auth: bearer {accessToken}"头
- 添加Basic认证头用于API身份验证
-
发送API请求:
- 使用RestTemplate发送HTTP请求到BladeX API
- 处理各类响应和异常
-
错误处理:
- 当遇到401未授权响应时,识别为令牌过期
- 提示用户令牌已过期,需要重新登录
关键代码实现
保存BladeX令牌
// BladeAuthController.java
String accessToken = (String) tokenInfo.get("access_token");
Integer expiresIn = (Integer) tokenInfo.get("expires_in");
if (accessToken != null && expiresIn != null) {bladeTokenManager.setBladeToken(user.getUserId(), user.getUserName(), accessToken, expiresIn);log.info("成功保存用户BladeX令牌, userId={}, expiresIn={}秒", user.getUserId(), expiresIn);
}
令牌保存实现
// BladeTokenManager.java
public void setBladeToken(Long userId, String userName, String accessToken, int expiresIn) {BladeToken bladeToken = new BladeToken();bladeToken.setUserId(userId);bladeToken.setUserName(userName);bladeToken.setAccessToken(accessToken);bladeToken.setLoginTime(System.currentTimeMillis());bladeToken.setExpireTime(bladeToken.getLoginTime() + expiresIn * 1000L);// 存储到Redis,过期时间设置为令牌有效期String tokenKey = getTokenKey(userId);redisCache.setCacheObject(tokenKey, bladeToken, expiresIn, TimeUnit.SECONDS);
}
API调用示例
// BladeApiClient.java
public <T> T callBladeApi(Long userId, String url, HttpMethod method, Object requestBody, Class<T> responseType) {// 获取用户的访问令牌String accessToken = tokenManager.getAccessToken(userId);if (StringUtils.isEmpty(accessToken)) {throw new ServiceException("用户没有有效的BladeX访问令牌,请重新登录");}// 构建请求头HttpHeaders headers = new HttpHeaders();headers.set("Blade-Auth", "bearer " + accessToken);headers.set("Blade-Requested-With", "BladeHttpRequest");// 添加Basic认证String auth = clientId + ":" + clientSecret;byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes());String authHeader = "Basic " + new String(encodedAuth);headers.set("Authorization", authHeader);// 构建请求实体HttpEntity<?> requestEntity = new HttpEntity<>(requestBody, headers);// 发送请求并返回结果ResponseEntity<T> response = restTemplate.exchange(url, method, requestEntity, responseType);return response.getBody();
}
数据结构
配置参数
在application.yml
中配置BladeX相关参数:
blade:auth:# BladeX认证服务地址url: https://auth.we-safer.net/oauth/token# 客户端IDclient-id: chem_ruoyi# 客户端密钥client-secret: chem_ruoyi_secret# 重定向URIredirect-uri: http://192.168.100.106:81/auth/blade-callbackapi:# BladeX API基础地址base-url: https://we-safer.net/api
Redis存储结构
BladeX令牌在Redis中的存储格式:
- 键名格式:
blade_tokens:userId
- 值格式:序列化的
BladeToken
对象 - 过期时间:与BladeX令牌过期时间一致(通常为7200秒)
安全性考虑
-
令牌安全存储:
- BladeX令牌仅存储在服务器端Redis中,不暴露给前端
- 使用与BladeX原始令牌相同的过期时间,确保令牌及时失效
-
认证请求安全:
- BladeX认证请求使用HTTPS协议
- 客户端密钥仅在服务器端使用,不暴露给前端
-
授权码流程:
- 使用标准的OAuth2授权码流程,提高安全性
- 授权码使用一次后立即失效
-
请求安全性:
- API调用添加Basic认证头
- 添加BladeX特定请求头标识请求来源
常见问题与解决
-
用户未找到问题:
- 问题:BladeX认证成功但未找到对应的若依用户
- 解决:确保在若依系统中创建与BladeX账号同名的用户
-
令牌过期问题:
- 问题:BladeX令牌过期导致API调用失败
- 解决:检测到401错误时提示用户重新登录,自动跳转到登录页
-
认证服务配置问题:
- 问题:未正确配置BladeX认证服务参数
- 解决:检查application.yml中的BladeX认证配置是否完整
相关文章:
若依集成BladeX单点登录的令牌管理与api请求流程
目录 概述系统架构单点登录流程令牌管理机制接口调用流程关键代码实现数据结构安全性考虑常见问题与解决 概述 本文档详细说明若依系统如何实现与BladeX的单点登录集成,包括令牌管理和接口调用的完整流程。整个集成采用基于OAuth2的授权码流程,允许用…...
54常用控件_QLCDNumber的属性
目录 代码示例: 倒计时 QLCDNumer 是一个专门用来显示数字的控件.类似于“老式计算器”的效果 核心属性 属性 说明 intValue QLCDNumber显示的数字值(int). value QLCDNumber 显示的数字值(double). 和intValue是联动的. 例如给value设为1.5, intValue的值就是2. 另外&a…...
IcePlayer音乐播放器项目分析及学习指南
IcePlayer音乐播放器项目分析及学习指南 项目概述 IcePlayer是一个基于Qt5框架开发的音乐播放器应用程序,使用Visual Studio 2013作为开发环境。该项目实现了音乐播放、歌词显示、专辑图片获取等功能,展现了桌面应用程序开发的核心技术和设计思想。 技…...
【ELF2学习板】Ne10进行FFT测试
目录 引言 Ne10简介 交叉编译Ne10 测试 测试程序 测试结果 结语 引言 在上一篇博文介绍了FFTW在ELF2开发板的测试。其中我们提到--enable-neon选项在aarch64平台下无法启用。接下来测试一个专门用NEON指令优化的FFT库Ne10。 Ne10简介 NE10 是一个面向 ARM 架构的开源数…...
Android device PCO (protocol configuration options) intro
术语 英文缩写英文全称中文PCOprotocol configuration options协议配置选项RILradio interface layer 无线电接口层PCO介绍 PCO(Protocol Configuration Options) 是 3GPP 标准协议(TS 24.008)中定义的核心概念,用于在 LTE/5G 网络建立 PDN 连接时传递动态配置参数(如 D…...
HAL库通过FATFS和SDIO+DMA写入SD卡数据错误
HAL库F4版本 1.28.1 最近在使用HAL库配置SDIODMA并通过FATFS向SD卡写入数据,但是发现写入的数据经常有错误,不是少了一部分就是多了一部分,写入的数据为csv格式,通过循环向缓冲区写入"100100,12.345678\r\n"数据来观察问…...
RK Android11 修改默认语言为法语及时区为巴黎时间
文章目录 1、需求2、解决 1、需求 客户要求将系统默认语言改为法语,系统默认时区改为巴黎时间(也称为欧洲中部时间)2、解决 --- a/build/make/tools/buildinfo.shb/build/make/tools/buildinfo.sh-46,7 46,7 echo "ro.product.cpu.ab…...
文件上传Ⅰ
文件上传--前后端验证 不让上传php,所以要绕过它 遇到网站可能不是php语言,会是java或者python语言等,它只能解析网站本身的语言,那我们就上传符合网站语言识别的格式(它能解析什么后缀,就上传什么后缀)&…...
IntelliJ IDEA clean git password
IntelliJ IDEA clean git password 清除git密码 方法一:(这个要特别注意啊,恢复默认设置,你的插件什么要重新下载了) File->Manage IDE Settings->Restore Default Settings以恢复IDEA的默认设置(可选); 清空…...
【C++指南】哈希驱动的封装:如何让unordered_map/set飞得更快更稳?【上】
🌟 各位看官好,我是egoist2023! 🌍 种一棵树最好是十年前,其次是现在! 💬 注意:本文在哈希函数中主讲除法散列法,乘法散列法、全域散列法、双重散列等自行了解。 &#x…...
论坛测试报告
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
人脸扫描黑科技:多相机人脸扫描设备,打造你的专属数字分身
随着科技的迅猛发展,人脸扫描这个词已经并不陌生,通过人脸扫描设备制作超写实人脸可以为影视制作打造逼真角色、提升游戏沉浸感,还能助力教育机构等领域生产数字人以丰富教学资源,还在安防、身份识别等领域发挥关键作用࿰…...
统计字符串每个字符出现频率
输入一个字符串,统计每个字符的出现频率,然后判断最大频率与最小频率的差值 cnt: 如果 cnt 是质数,则输出 "Lucky Word" 和 差值; 否则输出 "No Answer" 和 0。 #include <bits/stdc.h> u…...
SQL-子查询
SQL子查询是嵌套在另一个SQL查询中的SELECT语句,将内部查询的结果作为外部查询的条件或者数据源。 核心概念 子查询是一个完整的SELECT语句,可以嵌入到其他查询的where, from, SELECT, HAVING等子句中,用于动态生成条件或临时数据集。 例如…...
Python(21)Python日期时间完全指南:从基础到实战注意事项
目录 一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法则 三、企业级应用案例3.1 全球日志分析系统3.2 金融交易时间校验 四、六大核心注意事项1. 时区意识优先原则2. 时间戳的精度陷阱3. 夏令时转换三步骤4. 日期格式化安全指南5. 性…...
【医学影像 AI】早产儿视网膜病变国际分类(第三版)
【医学影像 AI】早产儿视网膜病变国际分类(第三版) 0. 论文简介0.1 基本信息0.2 摘要0.3 缩略语0.4 ICROP3的关键内容总结 1. 引言2. 血管化位置:区域(ZONE)3. 加重病变与前加重病变4. 急性病变分期(阶段1-…...
焊接机器人的设计
一、引言 随着制造业的发展,焊接工艺在各个领域得到广泛应用。焊接机器人具有焊接质量高、效率高、劳动强度低等优点,能够满足现代制造业对焊接生产的要求。设计一款性能优良的焊接机器人,对于提高焊接生产的自动化水平和产品质量具有重要意…...
SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端
SQL SERVER里面也可以插入存储过程,操作TCP,WEBSOCKET吗?数据发生改变时用于通知客户端SQL存储过程入门🔥 - 人生得E不早朝 深度思考完成 用时28秒 好的,用户的问题是:SQL Server里面是否可以通过插入存储过程来操作TCP或WebSocket&…...
利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类
一、需求背景 在农业现代化进程中,作物健康监测对于保障粮食安全和提高农业生产效率起着举足轻重的作用。马铃薯作为全球重要的粮食作物之一,其种植面积广泛,产量和质量直接关系到众多农户的生计以及食品供应链的稳定。准确、快速地鉴别马铃…...
文章记单词 | 第39篇(六级)
一,单词释义 themselves [əmˈselvz] pron. 他们自己;她们自己;它们自己;(用以加强语气)他们亲自,她们亲自,它们亲自;(反身代词) 指某人或某物本…...
深入理解C++中string的深浅拷贝
目录 一、引言 二、浅拷贝与深拷贝的基本概念 2.1 浅拷贝 2.2 深拷贝 在C 中, string 类的深浅拷贝有着重要的区别。 浅拷贝 深拷贝 string 类中的其他构造函数及操作 resize 构造 构造(赋值构造) 构造(拼接构造…...
C++ 常用的智能指针
C 智能指针 一、智能指针类型概览 C 标准库提供以下智能指针(需包含头文件 <memory>): unique_ptr:独占所有权,不可复制, 可移动shared_ptr:共享所有权,用于引用计数weak_pt…...
【AI部署】腾讯云GPU-常见故障—SadTalker的AI数字人视频—未来之窗超算中心 tb-lightly
ERROR: Could not find a version that satisfies the requirement tb-nightly (from torchreid) (from versions: none) ERROR: No matching distribution found for tb-nightly 解决 阿里云 python -m pip install tb-nightly -i https://mirrors.aliyun.com/pypi/simple …...
三大等待和三大切换
三大等待 1、三大等待:等待的方式有三种:强制等待,隐性等待,显性等待。 1、强制等待:time.sleep(2),秒 优点:使用简单缺点:等待时间把握不准,容易造成时间浪费或者等待时…...
工程化实践:Flutter项目结构与规范
工程化实践:Flutter项目结构与规范 在Flutter项目开发中,良好的工程化实践对于提高开发效率、保证代码质量和团队协作至关重要。本文将从项目结构、代码规范、CI/CD流程搭建以及包管理等方面,详细介绍Flutter项目的工程化最佳实践。 项目结…...
数据结构-Map和Set
文章目录 1. 搜索树2. Map3. Set4. 哈希表4.1 哈希表的基本概念4.2 哈希表的实现方法4.3 Java中的哈希表实现 5. 哈希桶哈希桶的实现方式哈希桶的作用哈希桶的应用模拟实现 1. 搜索树 二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树࿰…...
cpolar 内网穿透 实现公网可以访问本机
1、登录网站,升级成专业版,测试的话建议选一个月付费,选择预留 2、保留的TCP地址增加一条记录,描述可以自己取 3、验证,生成一个Authtocken码 4、在安装目录下,打开CMD命令,复制上面的码运行aut…...
QT调用ffmpeg库实现视频录制
可以通过QProcess调用ffmpeg命令行,也可以直接调用ffmpeg库,方便。 调用库 安装ffmpeg ffmpeg -version 没装就装 sudo apt-get update sudo apt-get install ffmpeg sudo apt-get install ffmpeg libavdevice-dev .pro引入库路径,引入库 LIBS += -L/usr/lib/aarch64-l…...
AI专题(一)----NLP2SQL探索以及解决方案
前面写了很多编码、算法、底层计算机原理等相关的技术专题,由于工作方向调整的缘故,今天开始切入AI人工智能相关介绍。本来按照规划,应该先从大模型的原理开始介绍会比较合适,但是计划赶不上变化,前面通用大模型的工作…...
Redis 的指令执行方式:Pipeline、事务与 Lua 脚本的对比
Pipeline 客户端将多条命令打包发送,服务器顺序执行并一次性返回所有结果。可以减少网络往返延迟(RTT)以提升吞吐量。 需要注意的是,Pipeline 中的命令按顺序执行,但中间可能被其他客户端的命令打断。 典型场景&…...
群辉默认docker数据存储路径
做一下笔记 今天不小心路径规划错误,好不容易找到了数据,特此做个路径记录。 /var/packages/ContainerManager/var/docker/...
【C++】入门基础【上】
目录 一、C的发展历史二、C学习书籍推荐三、C的第一个程序1、命名空间namespace2、命名空间的使用3、头文件<iostream>是干什么的? 个人主页<—请点击 C专栏<—请点击 一、C的发展历史 C的起源可以追溯到1979年,当时Bjarne Stroustrup(本…...
Git LFS 学习笔记:原理、配置、实践与心路历程
最近在学习 Git LFS,把一些零散的笔记整理成一篇博文,记录我的学习思路与心路历程。以下内容均为个人理解总结,部分尚未在生产项目中验证,仅供回顾与参考。 🔍 Git LFS 是什么?原理是什么? 刚接…...
SpringBoot集成oshi 查询系统数据
实现功能: <!-- 获取系统信息 --><dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>6.6.1</version></dependency><dependency><groupI…...
iOS Facebook 登录
iOS Facebook 登录 官方文档 SDK下载链接...
uniapp打包IOS私钥证书过期了,如何在非mac系统操作
在非Mac系统下解决uniapp打包iOS私钥证书过期的问题,需通过以下步骤实现: --- ### **一、重新生成iOS证书(非Mac环境操作)** 1. **生成私钥和CSR文件** 使用OpenSSL工具(需提前安装)生成私钥和证书签…...
Axios的使用
Axios 是一个基于 Promise 的现代化 HTTP 客户端库,专为浏览器和 Node.js 设计。在企业级应用中,它凭借以下核心优势成为首选方案: 一、Axios 的核心优势 特性说明Promise 支持天然支持异步编程,避免回调地狱拦截器机制可全局拦截…...
第八篇:系统分析师第三遍——3、4章
目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试,训练学习能力,而非单纯以拿证为目的。 1.在复习过程中,训练快速阅读能力、掌…...
【2025-泛计算机类-保研/考研经验帖征集】
【2025-泛计算机类-保研/考研经验帖征集】 打扰您1分钟时间看下这里: 这是一个无偿为爱发电的项目,旨在收集湖南大学2025届毕业的计算机类学科同学的经验帖, 我将定期汇总链接,在校内推免群中宣传,为校内的学弟学妹们…...
Flink介绍——实时计算核心论文之Kafka论文详解
引入 我们通过S4和Storm论文的以下文章,已经对S4和Storm有了不错的认识: S4论文详解S4论文总结Storm论文详解Storm论文总结 不过,在讲解这两篇论文的时候,我们其实没有去搞清楚对应的流式数据是从哪里来的。虽然S4里有Keyless …...
细节:如何制作高质量的VR全景图
细节:如何制作高质量的VR全景图 VR全景图是通过虚拟现实和3D技术实现的全景展示方式,能够将实景以1:1的比例等比复刻,并还原到互联网上,使用户能够在线上游览世界,获得沉浸式的体验。制作高质量的VR全景图是一个复杂而…...
深度学习中的概念——元素积(哈达玛积)
元素积操作(哈达玛积) 🔢 基本定义 矩阵的哈达玛积 对于两个同维度的矩阵: A [ a i j ] , B [ b i j ] A [a_{ij}], \quad B [b_{ij}] A[aij],B[bij] 它们的哈达玛积定义为: C A ∘ B 其中 c i j a i j…...
探索 Flowable 后端表达式:简化流程自动化
什么是后端表达式? 在 Flowable 中,后端表达式是一种强大的工具,用于在流程、案例或决策表执行期间动态获取或设置变量。它还能实现自定义逻辑,或将复杂逻辑委托…… 后端表达式在 Flowable 的后端运行,无法访问前端…...
AI语音助手 React 组件使用js-audio-recorder实现,将获取到的语音转成base64发送给后端,后端接口返回文本内容
页面效果: js代码: import React, { useState, useRef, useEffect } from react; import { Layout, List, Input, Button, Avatar, Space, Typography, message } from antd; import { SendOutlined, UserOutlined, RobotOutlined, AudioOutlined, Stop…...
《软件设计师》复习笔记(11.6)——系统转换、系统维护、系统评价
目录 一、遗留系统(Legacy System) 定义: 特点: 演化策略(基于价值与技术评估): 高水平 - 低价值: 高水平 - 高价值: 低水平 - 低价值: 低水平 - 高价…...
学习threejs,使用EffectComposer后期处理组合器(采用RenderPass、GlitchPass渲染通道)
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.EffectComposer 后期…...
Yarn的定义?
YARN(Yet Another Resource Negotiator) 是 Apache Hadoop 的核心组件之一,负责集群的资源管理和任务调度。它的主要作用是将 Hadoop 的资源管理和作业调度/监控功能分离,形成一个通用的资源管理平台,可以支持多种计算…...
职坐标IT培训热门技术实战精讲
在数字化转型浪潮中,人工智能、大数据与云原生已成为驱动产业升级的核心引擎。职坐标IT培训课程以实战导向为基石,聚焦高薪岗位核心技术栈,通过拆解企业级项目案例,将复杂的技术理论转化为可落地的工程实践。课程模块涵盖从架构设…...
前端:uniapp框架中<scroll-view>r如何控制元素进行局部滚动
以下是使用 <scroll-view> 实现局部滚动的完整示例,包含动态内容、滚动控制和滚动位置监听: 一、基础局部滚动示例 <template><view class"container"><!-- 固定高度的滚动容器 --><scroll-view scroll-y :scroll…...
【KWDB 创作者计划】_算法篇---Stockwell变换
文章目录 前言一、Stockwell变换原理详解1.1 连续S变换定义1.2 离散S变换1.3简介 二、S变换的核心特点2.1频率自适应的时频分辨率2.1.1高频区域2.1.2低频区域 2.2无交叉项干扰2.3完全可逆2.4相位保持2.5与傅里叶谱的直接关系 三、应用领域3.1地震信号分析3.2生物医学信号处理3.…...