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 element-ui中表格过长内容隐藏显示的实现方式
在Vue项目中,使用ElementUI渲染表格数据时,如果某一个列数值长度超过列宽,会默认换行,造成显示不友好,下面这篇文章主要给大家介绍了关于Vue element-ui中表格过长内容隐藏显示的实现方式,需要的朋友可以参考下2022-09-09
最新评论