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


    路由权限控制

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

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

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

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

    差异点:

    默认路由列表:方法一只维护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为例,拦截器大概长这样:

    vi设计http://www.maiqicn.com 办公资源网站大全https://www.wode007.com

     
    axios.interceptors.request.use(function (config) {
     if(!has(config)){
     //验证不通过
       return Promise.reject({
         message: `no permission`
       });
     }
     return config;
    });
  • 相关阅读:
    Android中的网络编程
    JAVA 中的IO流
    JAVA网络编程
    JAVA中List的三个子类。
    JAVA中List的几个方法
    JAVA集合中的迭代器的遍历
    JAVA中集合转数组遍历
    【安卓4】事件处理——时间日期事件处理、长按事件
    【安卓4】事件处理——单选按钮触发事件、下拉列表触发事件
    【安卓4】事件处理——单击事件
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/13714257.html
Copyright © 2020-2023  润新知