开题

最近用vue来构建了一个小项目,由于项目是以iframe的形式嵌套在别的项目中的,所以对于登录的验证就比较的麻烦,索性后端大佬们基于现在的问题提出了解决的方案,在看到他们的解决方案之前,我先画了一个比较标准的单系统的解决方案。
本文目录:
一: 设想
二: 讨论
三:实现
四:总结
一: 设想
简单解释下上图就是:
首先前端从cookie获取token,如果没有token就跳转到登录页面登录,登录验证之后生成token存在数据库中并返回给前端;前端将这个token保存下来,为了让在浏览器新的tab页时不需要登录,我们前端需要将这个token保存到cookie之中。
如果用户已经有了token,那么再验证是否有用户信息,如果没有去请求用户信息的接口,后台读取用户的基本信息返回给前端,前端根据后台返回的用户权限生成固定的路由表用于页面拦截。
在用户token和权限都有的情况下,进入自己权限内的页面并且携带token访问后台进行交互。
用户在退出时,请求后台接口,清除token数据。
二: 讨论
由于公司的项目更加的复杂,属于基于原来的系统开发新的系统模块,但是这些模块又为了以后主体功能的更新下次迭代需要保持相对的独立性,预计以后的老系统只起一个用户中心的功能,所以现在是基于实现单点登录的能力去迭代更新现在的新的项目。
今天上午对于登录的实现进行了相关讨论,由于公司项目保密考虑只是单单做相关的介绍:
现有的老项目将慢慢向用户中心转换,而以前的新项目需要去这个用户中心获取登录信息。具体的实现是:
登录新项目b.exaplem.com通过session检测到未登录时(这里说下新的项目和老项目在同一个一级域名下),跳转到a.exaplem.com?returnUrl='b.exaplem.com',在a.exaplem.com下成功登录后生成一个ticket给到b.exaplem.com,b.exaplem.com将这个ticket存在session里面来保持登录状态。
因为现在基本上是先登录a.exaplem.com然后再去登录b.exaplem.com,所以当我们第一次进入b.exaplem.com系统时,b.exaplem.com会向a.exaplem.com系统发送请求来获取ticket,并且生成session来维持登录状态。
三:实现
当时想通过引入vuex并通过cookie来保存token的状态,但是由于现在的项目还是后端以session的形式来维持用户的登录状态所以还是没有引入vuex。
基本实现如下:
main.js增加引入的permission.js文件如下:
import Vue from 'vue'
import router from './router'
import { asyncRouterMap, constantRouterMap } from './router'
function hasPermission(roles, route) { //
if (route.meta && route.meta.role) {
return roles.some(role => role === route.meta.role)
} else {
return true
}
}
function filterAsyncRouter(asyncRouterMap, roles) {
const accessedRouters = asyncRouterMap.filter(route => {
if (hasPermission(roles, route)) {
if (route.children && route.children.length) {
route.children = filterAsyncRouter(route.children, roles)
}
return true
}
return false
})
return accessedRouters
}
// 加载页面之前
router.beforeEach((to, from, next) => {
NProgress.start() // 开启Progress
if (to.path == '/ContractAduit/Error') {
next()
} else if (!Vue.prototype.hasRoute) {
Vue.prototype.$ajax.get(Vue.prototype.$api.getModuleHost("用户信息接口地址"), {})
.then(data => {
if (data.code == 1000) {
let menus = data.menu
let roles = menus.map((menu, index) => {
return parseInt(menu.url);
})
const accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
router.addRoutes(accessedRouters)
Vue.prototype.userInfo = {
id: data.id,
realname: data.realname
}
Vue.prototype.hasRoute = true;
next({...to })
} else {
router.push({ name: 'ErrorPageRouter' });
}
})
.catch(err => console.log(err))
} else {
next()
}
});
route.js文件如下:
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export const constantRouterMap = [{
path: '/404',
name: 'NoFoundPagetRouter',
component: require('../views/404.page'),
meta: {
title: '404',
}
},
{
path: '/ContractAduit/NoAccess',
name: 'NoAccessPageRouter',
component: require('../views/no-access.page'),
meta: {
title: '无权限',
}
},
{
path: '/ContractAduit/Error',
name: 'ErrorPageRouter',
component: require('../views/error.page'),
meta: {
title: '内部错误',
}
}
]
export default new Router({
mode: 'history',
routes: constantRouterMap
})
export const asyncRouterMap = [{
path: '/ContractAduit/Supplier/List',
name: 'SupplierListPageRouter',
component: require('../views/supplier/supplier-list.page.vue'),
meta: {
title: '某某列表页',
role: 10001
}
},
...
{
path: '/',
redirect: '/ContractAduit/Supplier/List',
hidden: true,
meta: {
title: '某某列表页',
role: 10001
}
}, {
path: '*',
redirect: '/404',
hidden: true
}
]
因为没有引入vuex所以需要在VUE构造函数的原型对象上声明变量来判断是否已经拉取了用户的基本信息,因为我们后端的权限是配置的页面级权限(即不是按照角色来安排哪个前端页面来可访问,而是根据后台返回的页面代码来判断哪个前端页面可访问)。
四:总结
因为我们的项目不可能达到千篇一律的情况,选择适合自己项目的解决方案才是最重要的,不要为了用某个技术而去用某个技术。
以上这篇vue系列之动态路由详解【原创】就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# vue动态路由
# 讲解vue-router之什么是动态路由
# vue 实现动态路由的方法
# vue实现动态路由详细
# 手把手教你vue实现动态路由
# vue实现动态路由的方法及路由原理解析
# vue实现动态路由的详细代码示例
# 后端
# 给大家
# 如果没有
# 单点
# 跳转到
# 他们的
# 迭代
# 才是
# 不需要
# 最重要
# 提出了
# 而去
# 希望能
# 我先
# 再去
# 当我们
# 这篇
# 已经有了
# 能达到
# 数据库中
相关文章:
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
南平网站制作公司,2025年南平市事业单位报名时间?
如何通过云梦建站系统实现SEO快速优化?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
如何快速搭建个人网站并优化SEO?
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何通过商城自助建站源码实现零基础高效建站?
如何正确下载安装西数主机建站助手?
如何用免费手机建站系统零基础打造专业网站?
个人摄影网站制作流程,摄影爱好者都去什么网站?
深圳网站制作案例,网页的相关名词有哪些?
建站主机服务器选购指南:轻量应用与VPS配置解析
建站上传速度慢?如何优化加速网站加载效率?
如何通过IIS搭建网站并配置访问权限?
建站之星后台管理系统如何操作?
建站之星多图banner生成与模板自定义指南
相册网站制作软件,图片上的网址怎么复制?
七夕网站制作视频,七夕大促活动怎么报名?
宝塔新建站点报错如何解决?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Swift中switch语句区间和元组模式匹配
如何在橙子建站中快速调整背景颜色?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
如何用IIS7快速搭建并优化网站站点?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
香港服务器租用费用高吗?如何避免常见误区?
微信小程序 五星评分(包括半颗星评分)实例代码
焦点电影公司作品,电影焦点结局是什么?
如何在服务器上三步完成建站并提升流量?
创业网站制作流程,创业网站可靠吗?
建站之星代理平台如何选择最佳方案?
如何快速选择适合个人网站的云服务器配置?
北京网站制作的公司有哪些,北京白云观官方网站?
建站之星如何实现网站加密操作?
专业公司网站制作公司,用什么语言做企业网站比较好?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
如何在Golang中使用replace替换模块_指定本地或远程路径
如何选择适配移动端的WAP自助建站平台?
网站网页制作专业公司,怎样制作自己的网页?
如何在IIS中新建站点并配置端口与物理路径?
制作电商网页,电商供应链怎么做?
威客平台建站流程解析:高效搭建教程与设计优化方案
制作国外网站的软件,国外有哪些比较优质的网站推荐?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
Java解压缩zip - 解压缩多个文件或文件夹实例
如何生成腾讯云建站专用兑换码?
建站主机功能解析:服务器选择与快速搭建指南
建站之星后台密码遗忘?如何快速找回?
IOS倒计时设置UIButton标题title的抖动问题
如何通过可视化优化提升建站效果?
*请认真填写需求信息,我们会在24小时内与您取得联系。