Vue项目实现单点登录(SSO)的逻辑和基本流程

news2024/11/25 22:48:29

项目集群如果一个一个登录会非常麻烦,尤其是一些大企业或者多项目使用一套体系数据的环境中,这时候登录中心也就应用而生, 今天简单说一下vue sso的实现思路,vue项目实现单点登录(SSO)通常涉及以下几个步骤:

  1. SSO:单点登录允许用户使用一组凭证(如用户名和密码)访问多个相关但独立的软件系统,尤其是再大企业内或者多个项目用一套体系登录的环境中,要实现sso需要一个中央认证服务器(登录中心)来处理认证。
  2. 集成认证服务:应用需要与SSO服务提供商集成,涉及到使用OAuth2.0、OpenID Connect或其他认证协议。
  3. 应用配置:您需要在Vue应用中配置认证流程,包括处理登录、注销和认证令牌的刷新。
  4. 处理登录跳转:当用户尝试访问需要认证的资源时,Vue应用应重定向到SSO登录中心。
  5. 处理回调:用户在SSO登录中心认证后,会被重定向回您的Vue应用,通常携带一个认证令牌。
  6. 验证令牌:Vue应用需要验证从SSO登录中心接收到的令牌,并据此建立用户会话。
  7. 维护会话状态:一旦用户通过SSO认证,Vue应用需要维护用户的登录状态,直到用户注销或令牌过期。

下面是一个简化的基础示例,说明Vue应用如何集成SSO:
由浅入深,我们先看一个未登录情况下,直接访问项目页面的示例:

router/index.js配置路由是否需要auth授权

// router.js 或类似的路由配置文件
import Vue from 'vue';
import Router from 'vue-router';
import Home from './views/Home.vue';
import Callback from './views/Callback.vue';

Vue.use(Router);

const router = new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home,
    },
    {
      path: '/callback',
      name: 'callback',
      component: Callback,
      meta:{
      	requireAuth:true,   //true为需要, false不需要
      }
    },
    // 其他路由...
  ],
});

export default router;

main.js

/** 前置导航守卫,用于进入router前判断是否已登录 */
router.beforeEach((to, from, next) => {
  if (to.meta.requireAuth) {
    // 判断是否已登录
    if (JSON.parse(localStorage.getItem('user')) !== null) {
      next()   //放行
    } else {
      next({path: '/login'})   // 去登录页
      //这里可以把当前进入的页面用本地存储保存起来或者或者用url传到登录页,登陆后再跳转回来,我建议直接传过去就行,如果是保存起来跳转回来时不要忘记删除掉该信息
    }
  } else {
    // 不需要auth 正常跳转
    next()
  }
})

跳转登录页这里可以把当前进入的页面用本地存储保存起来或者或者用url传到登录页,登陆后再跳转回来,我建议直接传过去就行,如果是保存起来跳转回来时不要忘记删除掉该信息

再看一下跳转其他项目实现登录,一个应用内令牌失效后跳转登录和回到页面的示例:

// main.js
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import axios from 'axios';
Vue.config.productionTip = false;

// 假设你的SSO登录中心有一个登录URL和一个回调URL
const SSO_LOGIN_URL = 'https://sso.center/login';   //登陆中心
const SSO_CALLBACK_URL = 'http://your.vue.app/callback';    //当前页面

router.beforeEach((to, from, next) => {
  // 检查路由是否需要认证
  if (to.meta.requiresAuth) {
    // 检查本地是否有有效的认证令牌
    const token = localStorage.getItem('authToken');
    if (token) {
      next();     // 如果有令牌,继续
    } else {
      // 如果没有令牌,重定向到SSO登录中心
      window.location.href = `${SSO_LOGIN_URL}?redirect=${encodeURIComponent(SSO_CALLBACK_URL)}`;
    }
  } else {
    next();    // 如果路由不需要认证,直接继续
  }
});

new Vue({
  router,
  render: h => h(App),
}).$mount('#app');

//登录中心登录后处理

// 处理SSO回调
router.beforeEach((to, from, next) => {
  if (to.path === '/callback') {
    // 从URL中提取认证令牌
    const token = extractTokenFromUrl();
    if (token) {
      // 验证令牌并存储
      localStorage.setItem('authToken', token);
      // 重定向到用户最初请求的页面
      next(from.fullPath);
    } else {
      // 如果没有令牌,重定向到错误页面或登录页面
      next('/login');
    }
  } else {
    next();
  }
});

function extractTokenFromUrl() {
  // 实现从URL中提取令牌的逻辑
}

sso大致的流程图示如下:
在这里插入图片描述

附上基础的登录和推出登录伪代码:
login


// login
// 判断有无已保存账号信息
if (JSON.parse(localStorage.getItem('user') !== null)) {
  localStorage.removeItem('user')
}
const user = {
  id: username,
  password: password
}
localStorage.setItem('user', JSON.stringify(user))

//---------------------------------------------

// logout
// 移除本地保存账号信息
localStorage.removeItem('user')

请求封装401处理,有token但是无效的情况下,会触发401状态,需要处理跳转登录。

大致的思路就是
1.判断权限
2.获取用户登录信息
3.获取http请求状态
4.直接访问或去登录
5.保存当前页并去登录页
6.登录后保存用户信息并跳转回访问页面

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

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

相关文章

JVM调优:根据JVM自带工具定位问题(jps、jstat、Visual VM的使用)

JVM调优步骤 发现问题、定位问题、解决问题 发现问题 常见问题如下 GC频繁CPU负载过高内存溢出(OOM)内存泄露死锁程序响应时间较长 用JDK自带命令调优工具定位问题 jps(java process status):查看正在运行的Java进程 基本语…

图解正激和Buck AC/DC转换

所谓正激式 正激方式是构造较简单,容易控制,非常普遍的方式之一。 其特征是输出功率比反激方式大,但必须加装电感和续流二极管(转流二极管:D2)。此外,和反激式相同,能利用光耦合器…

将半自动化标签绘制在原图上

用yolov8的推理,做了半自动化标签处理。 yolo的标签格式是: 标签 + 每个顶点的坐标 比如: 第一个数字0是类别,后面是每个顶点的坐标,(x,y)这样的。 而且可能是多行的 所以,要把标签画在原图上,看看打的对不对。 画标签到原图上.py import os import cv2 import n…

K3s部署及研究

这里写自定义目录标题 K3s和K8s的部署及研究Kubernetes (K8s)K3s使用场景总结1、备份系统自带yum源配置文件2、进入 /etc/yum.repos.d3、删除文件4、设置5、缓存 K3s和K8s的部署及研究 K3s 和 K8s(Kubernetes)是两个相关但不同的容器编排平台。以下是对…

43 华三AC登录Web页面

一 无线上WEB页面 1 创建vlan 56 [AC-KongZhi]vlan 56 2 退出 [AC-KongZhi-vlan56]quit 3 进入vlan三层口 配置IP地址 [AC-KongZhi]interface Vlan-interface 56 [AC-KongZhi-Vlan-interface56]ip address 192.168.56.55 24 4 在AC控制器与Host主机的接口上能通关vlan 5…

基于Nginx搭建RTMP流媒体服务器视频无法保存

文章目录 基于Nginx搭建RTMP流媒体服务器安装Nginx-RTMPNginx 配置文件 视频无法保存 基于Nginx搭建RTMP流媒体服务器 安装Nginx-RTMP 要实现RTMP流媒体服务器需要安装Nginx-RTMP模块 已有Nginx安装Nginx-RTMP模块 sudo apt update sudo apt install libnginx-mod-rtmp可能会…

心动小站Ⅰ--矢量数据库:塑造 AI 技术的新时代

前言 随着专家预测的采用率不断提高以及教育资源的引入,矢量数据库将在塑造下一个 AI 技术时代中发挥关键作用。矢量数据库相对于传统数据库的优势越来越明显,使其成为 AI 和机器学习应用不可或缺的工具。以下是矢量数据库受到关注并有望彻底改变 AI 技…

Leetcode - 周赛406

目录 一,3216. 交换后字典序最小的字符串 二,3217. 从链表中移除在数组中存在的节点 三,3218. 切蛋糕的最小总开销 I 四,3219. 切蛋糕的最小总开销 II 一,3216. 交换后字典序最小的字符串 本题要求交换一次相邻字符…

接口自动化测试框架实战-0-项目功能概览

熟悉我CSDN的朋友们应该知道,之前已经更新了requests、pytest、allure2、yaml、jenkins、postman等基础知识的合集。相信大家对接口测试已经有了全面的认识,现在应该迫不及待地想要一个实战项目了。接下来的文章中,我们将把这些知识点串联起来…

数据结构C++——栈

文章目录 一、定义二、ADT三、栈的描述方法3.1 数组描述3.1.1 派生arrayList3.1.2 定制数组arrayStack3.2 链表描述3.2.1 派生chain3.2.2 定制数组LinkedStack四、应用4.1 括号匹配4.2 汉诺塔4.3 列车车厢重排4.4 迷宫老鼠一、定义 DEF. 栈(stack)是一个线性表,其插入(也称…

Window环境下MySQL管理

1、MySQL服务启用和停止 图形化界面管理 使用键盘组合键(Win R)打开运行对话框,在对话框中输入services.msc并点击确定。 这里可以看到服务名称为MySQL84并处于正在运行的状态。 选中后右键可以进行暂停、停止、重启等操作。 命令提示符管理…

python--16 GUI编程1

GUI编程简介 主流3大GUI框架 框架名称说明Tkinter一个轻量级的跨平台图形用户界面(GUI)开发工具,是Tk图形用户界面工具包标准的Python接口Kivy基于OpenGL ES 2,能够让使用相同源代码创建的程序能跨平台运行。这个框架是事件驱动…

LLaMA 背景

什么是LLaMA? 模型介绍:LLaMA是Meta开发的语言模型,旨在推动开放科学和人工智能的实践。 参数范围:这些模型的参数数量从7B到65B不等,覆盖了不同规模的需求。 训练数据:LLaMA模型是在数万亿个公开数据集的…

2024视频改字祝福 豪车装X系统源码uniapp前端源码

源码介绍 uniapp视频改字祝福 豪车装X系统源码 全开源,只有uniapp前端,API接口需要寻找对应的。 创意无限!AI视频改字祝福,豪车装X系统源码开源,打造个性化祝福视频不再难! 想要为你的朋友或家人送上一份特别的祝福…

Spring Boot 日志 (初级)

什么是日志呢?其实就是一条条的打印语句,我们就可以根据打印出来的日志,去分析程序存在的问题等。虽然作为后端开发人员,日志并不是那么重要,但是在学习的过程中,也是比较重要的,可以使用在我们…

OpenCV分水岭算法watershed函数的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 描述 我们将学会使用基于标记的分水岭算法来进行图像分割。我们将看到:watershed()函数的用法。 任何灰度图像都可以被视为一个地形表…

vue项目实战速查记录

1.图片下载到本地 2.本地静态文件访问 3.元素大小相同,相互覆盖 1.图片下载到本地 实现原理:创建a标签,利用a标签下载属性. download(){const link document.createElement(a);link.href "图片地址";link.setAttribute(download, name);document.body.ap…

Docker核心技术:Docker原理之Namespace

云原生学习路线导航页(持续更新中) 本文是 Docker核心技术 系列文章:Docker原理之Namespace,其他文章快捷链接如下: 应用架构演进容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 Docker核心技术&#xff1…

【Qt】 FFmpeg+Qt windows 32位或者64位环境搭建

简介 目前Ffmpeg官网(64位连接)下载的均为64位编译的,这要求我们采用的Qt creator也采用64位编译器。但是仍存在部分用户采用32位编译器,所以这部分用户需下载32 Ffmpeg(32位连接)。 根据使用的编译器位数…

ArkTS语言---基础知识

ArkTS是一种为构建高性能应用而设计的编程语言。ArkTS在继承TypeScript语法的基础上进行了优化,以提供更高的性能和开发效率。目前流行的编程语言TypeScript是在JavaScript基础上通过添加类型定义扩展而来的,而ArkTS则是TypeScript的进一步扩展。TypeScr…