vue 权限管理怎么做

摘要:
通过产品的需求,在项目中进行权限点的配置,然后通过permissionList寻找是否有配置的权限点,有就显示,没有就不显示。接下来我们设置router.beforeEach://引入项目的vueximportstorefrom@/store//引入判断是否拥有权限的函数import{includePermission}from@/utils/permissionrouter.beforeEach(async(to,from,next)=˃{//先判断是否为登录,登录了才能获取到权限,怎么判断登录就不写了if(!

前言

在一个项目中,一些功能会涉及到重要的数据管理,为了确保数据的安全,我们会在项目中加入权限来限制每个用户的操作。作为前端,我们要做的是配合后端给到的权限数据,做页面上的各种各样的限制。

需求

因为这是一个工作上的业务需求,所以对于我来说主要有两个地方需要进行权限控制。

第一个是侧边菜单栏,需要控制显示与隐藏。

第二个就是页面内的各个按钮,弹窗等。

流程

  1. 如何获取用户权限?

    后端(当前用户拥有的权限列表)-> 前端(通过后端的接口获取到,下文中我们把当前用户的权限列表叫做 permissionList)

  2. 前端如何做限制?

    通过产品的需求,在项目中进行权限点的配置,然后通过 permissionList 寻找是否有配置的权限点,有就显示,没有就不显示。

  3. 然后呢?

    没了。

当我刚开始接到这个需求的时候就是这么想的,这有什么难的,不就获取 permissionList 然后判断就可以了嘛。后来我才发现真正的需求远比我想象的复杂。

真正的问题

上面的需求有提到我们主要解决两个问题,侧边菜单栏的显示 & 页面内操作。

假设我们有这样一个路由的设置(以下只是一个例子):

import VueRouter from  vue-router

/*注意:以下配置仅为部分配置,并且省去了 component 的配置 */
export const routes =[

  {

    path:  /,

    name:  Admin ,

    label:  首页

  },

  {

    path:  /user ,
name:  User ,

    label:  用户 ,

    redirect: { name:  UserList  },

    children: [

      {

        path:  list ,

        name:  UserList ,

        label:  用户列表

      },

      {

        path:  group ,

        name:  UserGroup ,

        label:  用户组 ,

        redirect: { name:  UserGroupList  },

        children: [

          {

            path:  list ,

            name:  UserGroupList ,

            label:  用户组列表

          },

          {

            path:  config ,

            name:  UserGroupConfig ,

            label:  用户组设置

          }

        ]

      }

    ]

  },

  {

    path:  /setting ,
name:  Setting ,

    label:  系统设置

  },

  {

    path:  /login ,
name:  Login ,

    label:  登录

  }

]

 

const router = newVueRouter({

  routes

})

 

export default router

其中前两级路由会显示在侧边栏中,第三级就不会显示在侧边栏中了。

页面内操作的权限设置不需要考虑很多其他东西,我们主要针对侧边栏以及路由进行问题的分析,通过分析,主要有以下几个问题:

  1. 什么时候获取 permissionList,如何存储 permissionList

  2. 子路由全都没权限时不应该显示本身(例:当用户列表和用户组都没有权限时,用户也不应该显示在侧边栏)

  3. 默认重定向的路由没有权限时,应寻找 children 中有权限的一项重定向(例:用户路由重定向到用户列表路由,若用户列表没有权限,则应该重定向到用户组路由)

  4. 当用户直接输入没有权限的 url 时需要跳转到没有权限的页面或其他操作。(路由限制)

下面我们针对以上问题一个一个解决。

什么时候获取权限,存储在哪 & 路由限制

我这里是在router 的beforeEach 中获取的,获取的 permissionList 是存放在vuex 中。

原因是考虑到要做路由的限制,以及方便后面项目中对权限列表的使用,以下是实现的示例:

首先我们加入权限配置到 router 上:

//以下只展示部分配置
{

  path:  /user ,
name:  User ,

  label:  用户 ,

  meta: {

    permissions: [ U_1 ]

  },

  redirect: { name:  UserList  },

  children: [

    {

      path:  list ,

      name:  UserList ,

      label:  用户列表 ,

      meta: {

        permissions: [ U_1_1 ]

      }

    },

    {

      path:  group ,

      name:  UserGroup ,

      label:  用户组 ,

      meta: {

        permissions: [ U_1_2 ]

      },

      redirect: { name:  UserGroupList  },

      children: [

        {

          path:  list ,

          name:  UserGroupList ,

          label:  用户组列表 ,

          meta: {

            permissions: [ U_1_2_1 ]

          }

        },

        {

          path:  config ,

          name:  UserGroupConfig ,

          label:  用户组设置 ,

          meta: {

            permissions: [ U_1_2_2 ]

          }

        }

      ]

    }

  ]

}

可以看到我们把权限加在了 meta 上,是为了更简单的从router.beforeEch 中进行权限判断,权限设置为一个数组,是因为一个页面可能涉及多个权限。

接下来我们设置router.beforeEach :

//引入项目的 vuex
import store from  @/store

//引入判断是否拥有权限的函数
import { includePermission } from  @/utils/permission

 

router.beforeEach(async (to, from, next) =>{

  //先判断是否为登录,登录了才能获取到权限,怎么判断登录就不写了

  if (!isLogin) {

    try{

      //这里获取 permissionList
await store.dispatch( getPermissionList )

      //这里判断当前页面是否有权限
const { permissions } =to.meta

      if(permissions) {

        const hasPermission =includePermission(permissions)

        if (!hasPermission) next({ name:  NoPermission  })

      }

      next()

    }

  } else{

    next({ name:  Login  })

  }

})

我们可以看到我们需要一个判断权限的方法 & vuex 中的 getPermissionList 如下:

//@/store
export default{

      state: {

        permissionList: []

      },

      mutations: {

        updatePermissionList: (state, payload) =>{

          state.permissionList =payload

        }

      },

      actions: {

        getPermissionList: async ({ state, commit }) =>{

          //这里是为了防止重复获取

          if (state.permissionList.length) return

          //发送请求方法省略
const list =await api.getPermissionList()

          commit( updatePermissionList , list)

        }

      }

    }
//@/utils/permission
import store from  @/store

 

/**

 * 判断是否拥有权限

 * @param {Array<string>} permissions - 要判断的权限列表

 */

function includePermission (permissions =[]) {

  //这里要判断的权限没有设置的话,就等于不需要权限,直接返回 true

  if (!permissions.length) return true
  const permissionList =store.state.permissionList

  return !!permissions.find(permission =>permissionList.includes(permission))

}

重定向问题

转载于:https://www.cnblogs.com/duanlibo/p/12033858.html

https://blog.csdn.net/ningqiugu/article/details/83591112

免责声明:文章转载自《vue 权限管理怎么做》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Appium如何自动判断浏览器驱动图像处理之基础---滤波器 高斯滤波下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

flask 关于 url_for的解析方式

flask 关于 url_for的解析方式使用url_for()反解析: 即使当路由发生改变时,依然能通过视图函数访问对应的路由 1.没有蓝图管理路由: {{ url_for(' 视图函数 ', 参数) }} 2.用蓝图管理路由时: {{ url_for(' 蓝图的第一个参数.视图函数 ', 参数) }} 1.方式一 前端显示: <h2> &l...

无线路由器信道怎么设置 无线路由器信道选择哪个好

问题: 网页打开经常慢, ping baidu.com 出现请求超时 或者ping局域网ip 出现超时,掉包 的情况? 原因: 周围信号多,一般家用路由器wifi 设置无线信道设置 都是默认,默认是在信道6,这样会造成信号干扰, 通常情况下,默认的信道是“6”,这在单一的无线网络环境中可以正常使用,但如果处于多个无线网络的覆盖范围内,无线路由器都使用默认...

Batch脚本的简单应用

网易博客停用,转几篇原来写的文章过来 在做自动化过程中,碰到Java代码与windows相互交互的情况,需要获取一些windows的系统信息,用到了Batch脚本,比较方便。 需要完成的功能很简单,获取windows中运行的进程的pid,写在一个文本文件中供Java代码读取。 主要用到的功能包括管道、重定向等。 脚本如下: @echoofftasklis...

apache配置虚拟目录和URL重定向

1. 虚拟目录 认识虚拟目录 虚拟目录就是在站点中建立一个链接指向某个物理路径,可用于发布站点主目录以外资源或缩短物理路径 虚拟目录配置命令 a. alias URL-path 物理路径 映射URL到文件系统的特定区域 b. aliasMatch 正则表达式 物理路径 使用正则表达式映射URL到文件系统 c. scriptAlias URL-path 物理...

#学习分享#开发基础知识之前端测试(一)

前言:本文用于2018/1/30晚内部分享。主题:前端单元测试 正文: 一、思考 我的目标是,如何浅入本次的主题,让愿意接收陌生信号的“对象”快速简单的get到信号,并且对本次分享产生一个小兴趣。 二、What     本章节主要讲述前端单元测试做什么,vue单元测试做什么。   (1) 基础概念 测试的概念:测试是检测你的应用代码(也叫“生产代码”)...

前端框架Vue自学之webpack(四)

终极目标:掌握和使用Vue(全家桶:Core+Vue-router+Vuex) 本博客目的:记录Vue学习的进度和心得(webpack) 内容:学习和使用webpack。为学习Vue CLI做准备。 正文: webpack 一、webpack 1、认识webpack 本质上来说,webpack是一个现代的JavaScript应用的静态模块打包工具。模块和打...