在vue项目中实现单点登录

核心依赖版本,vue3.4.x,vue-router4.3.x。
由于vue项目一般都是前后端分离的,所以这里单点的跳转需要在vue中处理。
一开始考虑将单点跳转做在后端,但那样感觉又将前后端强耦合了起来,所以最终还是决定将单点认证的跳转做在前端。

实现逻辑

在路由守卫中对url进行判断,如果url中包含了需要进行单点登录的query参数,比如type=sso,则向后端请求sso跳转路径,并将跳转路径的回调路径设置为当前的window.location.href。
在sso回调当前url时,会带上对应的code值或者token,我们再在路由守卫中通过code值获取token,或者直接存储token,并根据token获取用户信息,和跳转到目标页面。
说的可能不是很详细,可以结合后边的具体代码来理解。

具体代码

注意这里的代码只是截取,方便理解,所以直接贴到编辑器会报错哈。

router.beforeEach(async (to: ToRouteType, _from, next) => {//。。。省略了不相关代码let userInfo = storageLocal().getItem<DataInfo>(userKey);//获取本地缓存,看用户是否已经登录if (!userInfo) {let currentUrl = window.location.href;//存储当前浏览器url。由于vue只识别hash后的参数,所以这里使用window.location.href获取url中的参数const match = currentUrl.match(/testCode=([^&#]*)/); //匹配url中的testCode参数,使用&和#作为分隔符const testCode = match ? match[1] : null;if (testCode) {// 5.如果有值,代表是从单点登录回调的url,则根据testCode获取认证信息// 6.由于我这边的场景,testCode不是直接的token,所以需要发请求获取token和用户信息,并缓存到本地await loginByTestCode(testCode);} else if (to.query.type == "sso") {//1.如果query参数中包含type=sso,则代表需要进行单点认证。//2.替换url中的sso为sse,防止出现死循环跳转currentUrl = currentUrl.replace("sso", "sse");//3.向后端发请求获取sso认证跳转链接const ssoUrl = await getSsoUri(currentUrl);//4.直接通过href跳转window.location.href = ssoUrl;}}//再次获取用户信息,如果没获取到,则跳转到登录页。获取到用户信息,则跳转到对应的具体信息页userInfo = storageLocal().getItem<DataInfo>(userKey);//。。。省略了不相关代码
});

最终的过程会是这样的

  1. 浏览器访问http://zcywxy.blog.csdn.net/#/detail?id=xxx&type=sso
  2. 路由拦截到type=sso,即走代码注释中1-4的逻辑
  3. 跳转到回调url,http://zcywxy.blog.csdn.net/?testCode=xe2dr4_#/detail?id=xxx&type=sse
  4. 路由拦截到testCode,走注释中5-6的逻辑。

文章对您有帮助的话,可以帮忙点个赞或者关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

excel的XLOOKUP的快速多列关联查询

我们前几章上面介绍了&#xff0c;根据某国产品牌官网介绍的使用&连接来进行多列关联查询&#xff0c;非常的慢。有没有公式可以快速进行XLOOKUP多列关联查询&#xff0c;我们找到了一个速度还可以的办法。 原理&#xff1a;有几列需要关联查询&#xff0c;我们就写几个XLO…

高考填报志愿,怎么分析自己适合什么专业?

高考结束后&#xff0c;很多考生不知道自己的分数段适合什么学校&#xff0c;缺乏目标感&#xff0c;有些专业名称很大&#xff0c;听起来光鲜亮丽&#xff0c;但是是否适合自己&#xff0c;学什么课程&#xff0c;将来就业去向&#xff0c;这些都是需要细致了解的。 专业选择…

matlab 异常值检测与处理——Z-score法

目录 一、算法原理1、算法概述2、主要函数3、参考文献二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、算法概述 使用Z分数法,可以找出距离平均值有多少个标准差值…

提高篇(八):扩展Processing功能:从库使用到跨平台应用

提高篇(八):扩展Processing功能:从库使用到跨平台应用 引言 Processing是一款强大的创意编程工具,广泛应用于艺术、设计和教育等领域。但其真正的魅力在于其可扩展性:你可以通过使用各种扩展库、结合其他编程语言、在不同硬件平台上应用,甚至创建自己的扩展库来丰富Pro…

第十九章 SOAP 错误处理

文章目录 第十九章 SOAP 错误处理Web 服务中的默认故障处理在 Web 服务中返回自定义 SOAP 错误 第十九章 SOAP 错误处理 本主题介绍如何处理 Web 服务和 Web 客户端内的故障。 请注意&#xff0c;SOAPPREFIX 参数会影响任何 SOAP 错误中使用的前缀&#xff1b;请参阅指定 SOA…

Python SQLAlchemy库详解

大家好&#xff0c;在Python生态系统中&#xff0c;SQLAlchemy库是一个强大的工具&#xff0c;为开发人员提供了便捷的方式来处理与数据库的交互。无论是开发一个小型的Web应用程序&#xff0c;还是构建一个大型的企业级系统&#xff0c;SQLAlchemy都能满足你的需求&#xff0c…

什么是shell脚本?

简介 Shell脚本&#xff0c;又称Shell命令稿、程序化脚本&#xff0c;是一种电脑程序使用的文本文件&#xff0c;内容由一连串的shell命令组成&#xff0c;经由Unix Shell直译其内容后运作。Shell脚本可以用来自动化操作&#xff0c;简化管理任务&#xff0c;提高工作效率。 …

事件驱动和动画

目录 表盘交互逻辑 24点纸牌游戏事件驱动 动画 图形动画 属性动画 帧动画 总结 表盘交互逻辑 1.定时器的使用 2.线程中如何更新UI 代码: public static void main(String[] args) {Application.launch();}public void start(Stage stage) {Timer timer = new Timer(…

从零手写实现 nginx-10-sendfile 零拷贝 zero-copy

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

【操作与配置】MySQL安装及启动

【操作与配置】MySQL安装及启动 下载MySQL 进入官网&#xff0c;选择社区版下载 在windows安装 选择不登陆下载 安装MySQL 双击官方安装包 选择“Developer Default”&#xff08;默认&#xff09;即可 Execute&#xff0c;安装完成后next TCP/IP端口等&#xff0c;默认即可…

vue3中作用域插槽

1、先说一下具名插槽 有时在一个组件中包含多个插槽出口是很有用的。举例来说&#xff0c;在一个 组件中&#xff0c;有如下模板&#xff1a; <div class"container"><header><!-- 标题内容放这里 --></header><main><!-- 主要内容…

【TS】进阶

一、类型别名 类型别名用来给一个类型起个新名字。 type s string; let str: s "123";type NameResolver () > string;: // 定义了一个类型别名NameResolver&#xff0c;它是一个函数类型。这个函数没有参数&#xff0c;返回值类型为string。这意味着任何被…

路灯夜景视频素材去哪里找?傍晚黄昏夜景路灯视频素材网分享

在这个数字化的时代&#xff0c;视频创作者们总是在寻找各种优质素材来提升作品的质感。特别是充满浪漫氛围的路灯夜景&#xff0c;为短视频、电影、广告等增添了独特的视觉魅力。今天&#xff0c;我为大家整理了几个优秀的视频素材网站&#xff0c;帮助您轻松找到高质量的路灯…

flask 之JWT认证实现

目录 1、JWT 1.1、JWT概述 1.2、token的生成 1.3、token校验 1.4、flask项目中实现JWT认证 1、JWT 1.1、JWT概述 JWT&#xff08;JSON Web Token&#xff09;是一种用于身份验证和授权的开放标准。它由三部分组成&#xff0c;分别是头部、负载和签名。 头部&#xff0…

最新鲸发卡v11.61开心版 无后门发卡平台源码

安装说明 上传所有文件到服务器 或者宝塔 修改thinkphp伪静态&#xff0c;php版本为7.0 /install 安装 登录后台 /admin 定时任务计划设置 进入宝塔控制面板—–计划任务 填写计划任务 解冻任务 设置时间每小时第2分钟 执行 cd /www/wwwroot/website php think UnfreezeMoney 提…

gulimall-search P125 springboot整合elasticsearch版本冲突

一、问题 spring-boot.version 2.2.4.RELEASE,在gulimall-search pom.xml中添加elasticsearch.version 7.4.2后&#xff0c;发现出现如下问题&#xff1a;elasticsearch版本是springboot引入的6.8.6&#xff0c;没有变为7.4.2。 二、原因 在gulimall-search 的pom文件中&#…

Numpy练习

参考链接 创建数组 TestArray.py import numpy as np# 一维数组 def test1DArray():one np.array([1, 2, 3])print("1D Array:\n", one)# 二维数组 def test2DArray():two np.array([[1, 2, 3], [4, 5, 6]])print("2D Array:\n", two)# 创建全0数组 d…

Python中的列表推导式和字典推导式:优雅且高效的数据结构生成方式

Python中的列表推导式和字典推导式&#xff1a;优雅且高效的数据结构生成方式 在Python中&#xff0c;列表推导式&#xff08;List Comprehensions&#xff09;和字典推导式&#xff08;Dictionary Comprehensions&#xff09;是两种强大且优雅的工具&#xff0c;它们允许开发…

分享一个简单的文件下载器

抽空写了一个用于下载文件的控制器类&#xff0c;只需要把文件的路径通过参数name传递到后台即可完成文件下载到本地&#xff0c;非常方便~ 控制器类代码 package cn.edu.sgu.www.download.controller;import cn.edu.sgu.www.download.entity.RequestURI; import org.springfr…

Kotlin 中,扩展函数(Extension Functions)

在 Kotlin 中&#xff0c;扩展函数&#xff08;Extension Functions&#xff09;是用于向已有的类添加新功能而无需继承或使用装饰模式的一个特性。这允许你通过更自然的语法为现有类型添加方法。 下面是一个简单的扩展函数示例&#xff1a; // 定义一个扩展函数&#xff0c;…