vue 路由及按钮权限控制 思路总结

时间: 2020-03-20阅读: 63标签: 路由

路由权限控制

前端路由是全部都由后端返回,还是后端返回对应角色下的权限,然后前端通过遍历的方式来修改当前路由呢?

引用上面这个问题的采纳答案:

第一种后台返回路由,第二种后台返回权限。
共同点:

两种方法都可以实现需求
前端都要维护一份路由地址与模块文件地址的映射
后段返回的数据一般都要再遍历做二次处理
有关页面内元素(按钮)的权限都要另做处理
技术点都会涉及路由守卫和路由鉴权

差异点:

默认路由列表:方法一只维护home、login等无权限需求路由,其他路由需要后续通过接口和路由api:addRoutes动态添加;方法二需要维护一个全量的路由列表,不需要额外添加路由,通过配置每个路由的access数组来做鉴权。
路由跳转:因为方法一返回的就是该用户权限下的路由,所以不需要再做权限鉴权;方法二需要。
路由的自定义程度:方法一可以通过修改数据库的路由数据来自定义前端的菜单结构,因此也需要做一个实现路由重组的递归函数,拓展性更好;方法二针对的是菜单结构相对稳定的项目,一般不支持结构变动。
返回报文:一般来说,返回报文大小 方法一比方法二要大

总结补充:
第一种是指动态路由,路由是分两部分,一部分是home、login等无权限需求路由,一部分是由后端返回的该用户权限下的路由,当用户登录后得到 roles,前端根据roles 去向后端请求可访问的路由表,从而动态生成可访问页面,之后就是 router.addRoutes 动态挂载到 router 上;前端需要有菜单管理,可以通过修改路由数据来自定义前端的菜单结构,拓展性更好。
第二种是前端配置路由表,后端仅返回权限,前端需要有菜单的权限管理,并且加载路由和菜单时要做权限验证;该方法是针对菜单结构相对稳定的项目,一般不支持结构变动。


按钮权限控制

视图控制

依据权限实现的按钮显隐控制和界面变化:
方法一:v-if

方法二:自定义指令

根据用户权限判断各个按钮的显示与否,方式无非是v-if或自定义指令,而且只要将v-if背后的权限校验逻辑抽象成方法,无论是代码量还是使用形式上都跟自定义指令几乎一样

v-if的特点是它会响应数据变化,因此随着应用的运行会频繁触发权限校验,而权限在应用的整个生命周期内其实只需校验一次。

自定义指令内部仍然是调用全局验证方法,但优点在于只会在元素初始化时执行一次,多数情况下都应该使用自定义指令实现视图控制。

所以,最好是使用自定义指令。

不一定每个操作按钮都会发起AJAX请求,比如编辑按钮本身并不会触发请求,真正触发请求的是另一个保存按钮。

划重点:
让按钮和请求联系起来,比如说按钮涉及一个名称为A的请求,那么权限指令可以这样写:

<btn v-has="A" @click="Fn">按钮</btn>
这里对A的实现可以有多种形式,比如A可以是一个包含两个属性的对象:
const A = {
  p: ['put,/menu/**'],
  r: params => {
    return axios.put(`/menu/${params.id}`, params)
  }
};
//用作权限:
<btn v-has="[A]" @click="Fn">按钮</btn>
//用作请求:
function Fn(){
    A.r().then((res) => {})
}


请求控制

利用axios拦截器实现的,目的是将越权请求在前端拦截掉。在请求拦截器中判断本次请求是否符合用户权限,以决定是否拦截。在请求发起前集中拦截,这时可以直接根据请求方法和请求地址来校验权限。

以axios为例,拦截器大概长这样:

axios.interceptors.request.use(function (config) {
 if(!has(config)){
 //验证不通过
   return Promise.reject({
     message: `no permission`
   });
 }
 return config;
});

来自:https://segmentfault.com/a/1190000022682269


站长推荐

1.阿里云: 本站目前使用的是阿里云主机,安全/可靠/稳定。点击领取2000元代金券、了解最新阿里云产品的各种优惠活动点击进入

2.腾讯云: 提供云服务器、云数据库、云存储、视频与CDN、域名等服务。腾讯云各类产品的最新活动,优惠券领取点击进入

3.广告联盟: 整理了目前主流的广告联盟平台,如果你有流量,可以作为参考选择适合你的平台点击进入

链接: http://www.fly63.com/article/detial/9068

vue.router中replace需要返回两次问题及解决方案

现有三个页面a , b , c , 递进关系,a页面router.push跳转至b,b再router.push跳转至c,c使用$router.replace()回到b,然后点击b页面的返回键,需要点击两次才能回到a页面

vue 路由模式hash和history的区别

给个警告,因为这么做以后,你的服务器就不再返回 404 错误页面,因为对于所有路径都会返回index.html文件。为了避免这种情况,你应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。

JS是如何实现前端路由的 JS实现原生路由

路由就是根据不同的 url 地址展示不同的内容或页面,早期路由的概念是在后端出现的,通过服务器端渲染后返回页面,随着页面越来越复杂,服务器端压力越来越大。后来ajax异步刷新的出现使得前端也可以对url进行管理,此时

React Router拦截器(钩子)、静态路由、route-view 实现

React Router 再 v3 版本之前 是有 onEnter 钩子函数的,也支持静态路由配置;,但到了 v4 版本后钩子函数被移除,官方说是为了将此提供给开发者,由开发者自由发挥。既然如此我们就只能自己实现

前端路由(history+hash)

在传统网站开发中,我们一般使用比如asp、php、jsp等技术进行开发,开发完成后统一部署在服务器上,我们访问时,会在浏览器中发送带有\\\'.asp\\\',\\\'.php\\\',\\\'.jsp\\\'等后缀路径的url请求,服务器会根据对应的路由映射表

Flutter路由导航

我们通常会用屏(Screen)来称呼一个页面(Page),一个完整的App应该是有多个Page组成的。通过点击BottomNavigationBarItem来设置IndexedStack的index属性来切换,除了上面这种管理页面的方式,我们还需要实现其它功能的页面跳转

小程序多种路由跳转的区别

从Anjular转换到微信小程序,从功能丰富,便捷操作的WebStorm转换到十分难用,不是很人性的微信开发者工具,一开始真的特别不适应,也许是心理作用吧,从一开始就觉得它不好用,后来也是写不下去,后来调整心态,说试试看吧,后来就是越写越顺手

Vue 嵌套路由、路由守卫

嵌套路由挺常用的,比如导航栏有首页、文章、想法、留言4个模块,我们以嵌套路由的形式集成这些模块,在导航栏中点击对应的条目,就会路由到对应的页面(下方显示对应的页面),和html的<iframe>效果差不多。

Vue开发之vue-router的基本使用

如果你用vue-cli脚手架来搭建项目,配置过程会选择是否用到路由,如果选择Yes,后面下载依赖会自动下载vue-router。将组件 (components) 映射到路由 (routes)并渲染

在 Vue.js 中使用嵌套路由

随着 Vue.js 单页应用(SPA)变得相当复杂,你开始需要 Vue 路由以及嵌套路由。嵌套路由允许更复杂的用户界面以及相互嵌套的组件。让我们创建一个相对简单的用例,来展示 Vue Router 中嵌套路由的实用性。

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!

文章投稿关于web前端网站点搜索站长推荐网站地图站长QQ:522607023

小程序专栏: 土味情话心理测试脑筋急转弯幽默笑话段子句子语录成语大全运营推广