vue3如何实现单点登录

 更新时间:2024年03月04日 14:13:51   作者:左直拳  
这篇文章主要介绍了vue3如何实现单点登录问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

严格来说,所谓利用vue3实现单点登录,是指实现单点登录的前端。

身份验证,只能是服务器端干的活。

一、原理

单点登录,就是一处登录,到处运行。

以我现在做的项目为例,该项目有多个子系统,采用微服务架构,各子系统,包括其前端,都是独立开发,独立部署。那么很自然,应当有一个公共登录。

只需在这个公共登录模块中登录,那么其他子系统就可以正常使用了。

具体流程

1)当打开子系统时,发现未登录,则转向公共登录,否则打开请求页面

2)转到公共登录后,公共登录检查是否已登录,是则附上token返回子系统,否则打开登录页面

3)公共登录成功登录后,附上token返回子系统

4)子系统使用过程中,登出后,需要通知公共登录,公共登录做相应处置

5)前端向后端请求数据时,如果后端返回登录无效等信息,则做登出处理

二、单点登录

1、登录

前端输入账号密码等,提交到服务器端,服务器校验、确认,生成token返回,登录成功。

2、登录状态

前端拿到token后,保存在cookie。检查是否已登录,就是检查有没有这个cookie。

选择cookie而不是localstorage的原因是关闭浏览器后,cookie即失效,而localstorage却一直保存下来,需要额外处理,麻烦。

const TOKEN_KEY = "token";
export const isLogined = () => {
  return Cookies.get(TOKEN_KEY);
};

3、转向公共登录

子系统刚开始时没有这个token,那么转向公共登录。

跳转时,需要附上返回地址。

vue这类框架,是单页面应用(SPA),跳转一般用router,但这仅限于系统内部;跳到别的系统,我找不到有什么方法,只好祭出location.replace()。

1)子系统

export const toLogin = (next) => {
  const ssoUrl = loginSetup.sso;
  location.replace(ssoUrl + "?login=" + location.origin);
};

2)公共登录模块接收、检查并相应处置

//路由守卫
router.beforeEach((to, from, next) => {
  //请求登录
  if (to.path !== "/login" && ssoIsToLogin() === true) {
    if (isLogined()) {
      ssoReturn(location.href, next("/"));
    } else {
      next("/login");
    }
    return;
  }

  //请求退出
  if (ssoIsToLogout() === true) {
    ssoLogout();
    return;
  }

  。。。
});
export const ssoIsToLogin = () => {
  return location.href.indexOf("?login") >= 0;
};
export const ssoIsToLogout = () => {
  return location.href.indexOf("?logout") >= 0;
};
export const ssoReturn = (origin, defaultDo) => {
  const p = origin.indexOf("?login=");
  if (p >= 0) {
	//附上token返回子系统
    const url = origin.substr(p + 7) + "?token=" + getToken();
    location.replace(url);
  } else {
    defaultDo();
  }
};

三、单点登出

首先,子系统自己先做相应处理,比如删掉cookie;然后通知公共登录模块处置。

所谓通知,就是地址带上参数,跳转到公共登录模块。

//登出
logout(() => {
  toLogout();
});

export const logout = (callback) => {
  _beforeLogout(callback);
};
function _beforeLogout(callback) {
  //先通知后端退出,然后执行相关操作和回调函数
  logoutApi().then(() => {
    _clearLoginInfo();//清除cookie等

    if (callback) callback();
  });
}
export const toLogout = () => {//通知登录模块
  const ssoUrl = loginSetup.sso;
  location.replace(ssoUrl + "?logout");
};

四、自动登录及登出

1、自动登录

当子系统被首次打开时,比如直接在浏览器地址栏输入子系统地址时,系统会先检查登录状态,发现未登录,则转向登录模块,见上面 二.3。

2、自动登出

有2种情况,一是子系统主动登出,二是登录模块登出。

子系统主动登出,会先清除本身的登录状态,然后通知登录模块,执行登录模块登出,如三所述;如果是登录模块登出,那么不会通知子系统。

但由于token已经失效,只要子系统向服务器端请求数据,则必然收到相关信息,触发登出处理。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue.js中过滤器的使用教程

    vue.js中过滤器的使用教程

    过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数。下面这篇文章主要给大家介绍了关于vue.js中过滤器使用的相关资料,需要的朋友可以参考借鉴,下面来看看详细的介绍。
    2017-06-06
  • vue 3.x 中mixin封装公用方法应用方式

    vue 3.x 中mixin封装公用方法应用方式

    这篇文章主要介绍了vue 3.x 中mixin封装公用方法应用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue条件渲染列表渲染原理示例详解

    vue条件渲染列表渲染原理示例详解

    这篇文章主要为大家介绍了vue条件渲染列表渲染原理示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • element-ui中按需引入的实现

    element-ui中按需引入的实现

    这篇文章主要介绍了element-ui中按需引入的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 在Vue中使用Echarts实例图的方法实例

    在Vue中使用Echarts实例图的方法实例

    这篇文章主要给大家介绍了关于如何在Vue中使用Echarts实例图的相关资料,文中介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • vue3使用echarts并封装echarts组件方式

    vue3使用echarts并封装echarts组件方式

    这篇文章主要介绍了vue3使用echarts并封装echarts组件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • vue-router判断页面未登录自动跳转到登录页的方法示例

    vue-router判断页面未登录自动跳转到登录页的方法示例

    这篇文章主要介绍了vue-router判断页面未登录自动跳转到登录页的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • 详解Vue.js中引入图片路径的几种方式

    详解Vue.js中引入图片路径的几种方式

    这篇文章主要介绍了Vue.js中引入图片路径的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 在Vant的基础上封装下拉日期控件的代码示例

    在Vant的基础上封装下拉日期控件的代码示例

    这篇文章主要介绍了在Vant的基础上封装下拉日期控件的代码示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • vue裁切预览组件功能的实现步骤

    vue裁切预览组件功能的实现步骤

    这篇文章主要介绍了vue裁切预览组件功能的实现代码,本文通过实例代码相结合的形式给大家介绍的非常详细,具有一定的参考借鉴价值,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05

最新评论