若依 根据角色权限 动态添加路由 学习

news2024/10/12 3:17:17

源于这个问题对若依权限改造的学习,用ASP.NET Core Web api 做后端,所以不是纯净的若依前端,有部分改过。

​​​​​​​若依 从字典类型跳到字典数据跳到了404-CSDN博客

从路由守卫获取到用户信息开始,到路由跳转结束的过程

大致逻辑

路由守卫获取用户信息
存用户信息
路由筛选
跳转

过程

路由守卫获取用户信息
router.beforeEach((to, from, next)调用存用户信息的方法
//在路由守卫
store.dispatch('GetInfo').then(() =>...
用户信息存储

...\src\store\modules\user.js

包括存用户信息,用户所拥有的权限,角色

注意这里权限和角色都是数组,因为一个用户可以具有多个角色

主要是将获取到的用户信息存到vuex里

    // 获取用户信息
    GetInfo({ commit, state }) {
      return new Promise((resolve, reject) => {
        //根据角色获取相应权限,由token判断用户所属角色
        getInfo().then(res => {
          
          const user = res.data
          const avatar = (user.avatarUrl == "" || user.avatarUrl == null) ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatarUrl;
          
          if (res.data.roleNameList) { // 验证返回的roles是否是一个非空数组
            commit('SET_ROLES', res.data.roleNameList)
            // commit('SET_PERMISSIONS', res.permissions)
            commit('SET_PERMISSIONS', res.data.userPower)
          } else {
            commit('SET_ROLES', ['ROLE_DEFAULT'])
          }
          commit('SET_ID', user.userId)
          commit('SET_NAME', user.userName)
          commit('SET_AVATAR', avatar)
          resolve(res)
        }).catch(error => {
          reject(error)
        })
      })
    },
路由筛选

在...\src\store\modules\permission.js

路由守卫在调完存用户信息的方法会调生成路由表的方法GenerateRoutes()

主要是这个方法,它会根据预先定义好的路由表把动态路由给筛选好

// 动态路由遍历,验证是否具备权限
export function filterDynamicRoutes(routes) {
  const res = []
  routes.forEach(route => {
    //按权限验证

    if (route.permissions) {//路由要有权限标识,及用户对应的角色权限里面也要对应有
      if (auth.hasPermiOr(route.permissions)) {
        res.push(route)
      }
    } else if (route.roles) {//按角色验证
      if (auth.hasRoleOr(route.roles)) {
        res.push(route)
      }
    }
  })
  return res
}
筛选逻辑:

    先根据权限判断,如果路由表有权限标识permissions,则会进第一个判断,其中第二个if则是调用...\src\plugins\auth.js中的方法来判断在之前存好的用户权限是否有相应权限,有则添加该路由。

    else if (route.roles)同理如果路由有角色标识roles则会进来,其余判断逻辑差不多,

注意:

    这方法是先判断有没有permissions,如果有这个字段但没相应权限,则不会添加,就算有相应角色也是。这是考虑到了同样的角色可能会有不同权限的情况。

  {
    path: '/system/dict-data',
    component: Layout,
    hidden: true,
    permissions: ['PRIV_DICTDATA_VIEW'],
    children: [
      {
        path: 'index/:id',
        component: () => import('@/views/system/dict/data'),
        name: 'Data',
        meta: { title: '字典数据', activeMenu: '/system/dict' }
      }
    ]
  }
...\src\plugins\auth.js角色/权限判断:
function authPermission(permission) {
  const all_permission = "*:*:*"; // 定义一个表示通配权限的常量 "*:*:*",通常表示拥有所有权限
  const permissions = store.getters && store.getters.permissions; // 获取用户的权限数组,如果 store.getters.permissions 存在,则赋值给 permissions
  if (permission && permission.length > 0) { // 如果传入的权限不为空且有长度(确保有效权限参数)
    return permissions.some(v => { // 使用 some() 方法检查用户权限数组中是否有匹配项
      return all_permission === v || v === permission; // 如果用户具有通配权限或具有指定的具体权限,则返回 true
    });
  } else {
    return false; // 如果传入的权限参数无效,返回 false,表示没有权限
  }
}

function authRole(role) {

  const super_admin = "系统管理员"; // 定义超级管理员角色常量 "admin",通常拥有所有角色权限
  const roles = store.getters && store.getters.roles; // 获取用户的角色数组,如果 store.getters.roles 存在,则赋值给 roles
  if (role && role.length > 0) { // 如果传入的角色不为空且有长度(确保有效角色参数)
    return roles.some(v => { // 使用 some() 方法检查用户角色数组中是否有匹配项
      return super_admin === v || v === role; // 如果用户是超级管理员或具有指定的角色,则返回 true
    });
  } else {
    return false; // 如果传入的角色参数无效,返回 false,表示没有该角色
  }
}
跳转

    添加进路由后,满足条件就可以直接跳转了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2206716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小猿搜题冲榜/刷排名/专用思路-理论速度1小时/3.6w分 附带0s教程

小猿搜题冲榜/刷排名/专用思路-理论速度1小时/3.6w分 附带0s教程 ⚠️:这个方法很多还需要手动操作,我目前无法用代码完全实现,如果你有兴趣可以给我提issue我们一起讨论。 冲榜思路 先说整体思路:抓包改答案adb模拟 之后详细…

10月更新|国内可用的ChatGPT攻略镜像中文网站

一、GPT中文镜像站 ① yixiaai.com 支持GPT4、4o以及o1,支持MJ绘画 ② chat.lify.vip 支持通用全模型,支持文件读取、插件、绘画、AIPPT ③ AI Chat支持GPT3.5/4,4o以及MJ绘画 1. 什么是镜像站 镜像站(Mirror Site&#xff0…

【GO基础学习】环境安装到基础语法(1)

文章目录 环境安装GoLand 安装GO基础GO特点类型和函数Init函数和main函数GO命令下划线变量和常量数组切片Slice 引用 环境安装 下载地址:https://www.golangroadmap.com/ 安装目录文件说明: api:每个版本的 api 变更差异。 bin&#xff1…

JAVA 字符串 trim() 方法的正确使用

JAVA类里面 trim() 方法大家都比较熟悉,就是用来清除掉字符串首尾的空白字符。但在一次程序运行崩溃后,查找具体原因时,发现是由字符串末尾的一个回车符号 "\r" 所导致的。于是有机会仔细读了下该方法的 java 文档说明。其中一段内…

Docker理念

1.为什么会出现Docker Docker 的出现并非偶然,而是由一系列技术发展趋势和实际需求所推动的一项技术创新。 随着软件行业的快速发展,开发团队的规模不断扩大,成员可能分布在不同的地理位置,使用不同的操作系统和开发工具。这就导致…

CSD(computational storage devices)架构介绍

CSD(computational storage devices)架构介绍 前言一、CSD与传统SSD的架构对比二、为什么要采用FPGA三、FPGA缺点四、个人总结reference 前言 虽然一直有接触CSD,但一直对其原理和架构知之甚少,半知不解。今天,趁着我还…

element-ui点击文字查看图片预览功能

今天做一个点击文字查看图片的功能&#xff0c;大体页面长这样子&#xff0c;点击查看显示对应的图片 引入el-image-viewer&#xff0c;点击的文字时候设置图片预览组件显示并传入图片的地址 关键代码 <el-link v-if"scope.row.fileList.length > 0" type&…

模型预测控制工具包——ACADO:简介、安装与测试

模型预测控制工具包——ACADO&#xff1a;简介、安装与测试 ACADO 工具包简介ubuntu20.04 安装 ACADO工具包安装依赖安装ACADOtoolkit 测试 ACADO 工具包简介 ACADO Toolkit 是一个用 C 编写的用于自动控制和动态优化的软件环境和算法集合。 它提供了一个通用框架&#xff0c;…

三菱FX3UPLC定位控制程序举例

测试程序的编写 1.输入输出的分配输入输出的分配如下表所示。 2、相关软元件的设定 相关软元件也有所不同。更改定位指令的脉冲输出端时&#xff0c;根因设定为定位指令的脉冲输出端的软元件不同&#xff0c;据更改的内容&#xff0c;需要变更设定的相关软元件。 3.程…

【大模型新书】掌握大语言模型:高级技术、应用、尖端方法和顶尖LLMs

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/93e5a5c008474f72a0335083ef9c4893.png)我已将 这本大模型书籍免费分享 出来&#xff0c;需要的小伙伴可以扫取。 主要特性 探索自然语言处理&#xff08;NLP&#xff09;基础和大语言模型基本原理&#xff0c;包括…

若依前端后打成一个JAR包部署

客户需要将项目前后端作为一个整体打包成jar&#xff0c;不使用nginx方式转发。使用框架是若依前后端分离&#xff0c;后端springboot&#xff0c;前端vue&#xff0c;目的就是把vue打入jar。 一、前端修改 ruoyi-ui/src/router/index.js文件 &#xff0c;将 mode: ‘history’…

一键生成二维码的源码系统 电脑+手机版自适应代码 带完整的安装代码包以及搭建部署教程

系统概述 一键生成二维码的源码系统是一款集二维码生成、管理和应用于一体的综合性平台。它采用先进的技术和算法&#xff0c;能够快速、准确地生成各种类型的二维码&#xff0c;包括文本、链接、图片等。同时&#xff0c;该系统还具备高度的灵活性和可扩展性&#xff0c;能够…

如何使用bpmn-js实现可视化流程管理

介绍 BPMN-JS是一个流行的开源库&#xff0c;用于在Web应用程序中可视化、创建、编辑和分析BPMN&#xff08;Business Process Model and Notation&#xff0c;业务流程建模与表示法&#xff09;2.0 图。BPMN是一种国际标准的图形化语言&#xff0c;用于描述企业中的业务流程&a…

mongodb 连接, 去重,索引

mongodb 去重,索引 MongoDB Community Server 下载: https://www.mongodb.com/try/download/community GUI: The Ultimate Client, IDE and GUI for MongoDB | Studio 3T 连接 设置允许远程(局域网)连接 (windows) 在打开文件 "<你的安装目录>\MongoDB\Server\…

k3s安装指定版本以及离线安装(docker)

首先下载你所需要版本的k3s安装包&#xff0c;目录结构如下所示&#xff0c;我这里是v1.19.15k3s2。 1.首先赋予可执行权限后进行安装。 # k3s 需要赋予可执行权限 sudo chmod x k3s sudo chmod x k3s-install.sh2.然后将k3s的二进制文件复制到/usr/local/bin/ cp k3s /us…

✨机器学习笔记(七)—— 交叉验证、偏差和方差、学习曲线、数据增强、迁移学习、精确率和召回率

机器学习笔记&#xff08;七&#xff09; 1️⃣评估模型&#x1f397;️使用测试集评估模型&#x1f397;️交叉验证集&#xff08;cross validation&#xff09; 2️⃣偏差和方差&#xff08;Bias / Variance&#xff09;3️⃣学习曲线&#xff08;Learning curves&#xff09…

自动化分析背后,一站式数据分析平台!

自动化分析背后&#xff0c;一站式数据分析平台&#xff01; 前言一站式数据分析平台 前言 在如今的企业管理中&#xff0c;数据已经不再是简单的存储和备份&#xff0c;而是成为了决策的核心驱动力。尤其是在面对海量数据的情况下&#xff0c;企业急需一个能够高效处理、分析…

学习笔记之指针进阶(10.11)

a[0]就相当于数组名arr&#xff0c;a[0]1就相当于arr1&#xff0c;arr1是数组中下一个元素的地址&#xff0c;所以a[0]1就是数组中下一个元素的地址&#xff0c;&#xff08;把二维数组中的每一个数组看作一个元素&#xff09; 以上解释是错误的&#xff0c;a[0]不是整个数组的…

Leetcode——数组:移除元素—27.移除元素

知识点 双指针&#xff0c;在设置时&#xff0c;设置两个指针&#xff0c;一个用来寻找目标值&#xff0c;一个用来表示新数组的下标。 当找到不是目标值的元素时&#xff0c;将其添加到新数组中&#xff0c;如果是目标值&#xff0c;直接掠过 寻找目标值的指针会遍历整个数…

从commit校验失效问题探究husky原理

一、背景 之前创建的项目&#xff0c;发现代码 commit 提交的时候没有了任何校验&#xff0c;具体表现&#xff1a; 一是 feat fix 等主题格式校验没有了二是代码 lint 不通过也能提交 尝试解决这个问题&#xff0c;并深入了解husky的实现原理&#xff0c;将相关的一些知识点…