vue和react通用后台管理系统权限控制方案

news/2024/5/17 16:34:17

1. 介绍

在任何企业级应用中,尤其是后台管理系统,权限控制是一个至关重要的环节。它确保了系统资源的安全性,防止非法访问和操作,保障业务流程的正常进行。本文件将详细解析后台管理系统中的权限控制机制及其实施策略。

那么权限控制都包括什么呢?

  • 页面权限:菜单栏是否显示,路由是否可访问
  • 功能权限:按钮是否显示,是否可点击
  • 接口权限:接口是否可访问(后端内容)

不同的账号显示的菜单栏不同,页面上可以操作的按钮也不一样,这些操作都是通过权限模型实现的,那么接下来我们就来学习下常见的权限模型

2. 常见权限模型

  1. 基于角色的访问控制(Role-Based Access Control, RBAC)
  • 在RBAC模型中,权限不直接授予用户,而是首先定义一系列角色,然后将权限分配给这些角色用户通过成为某个或多个角色的成员来获取对应的权限。这种模型简化了权限管理,因为它允许管理员集中管理角色而不是逐个管理用户。角色可以按组织结构、职责或者工作流进行划分。
  1. 自主访问控制(Discretionary Access Control, DAC)
  • 在DAC模型中,资源的所有者可以自行决定谁可以访问该资源。用户可以自由地将其所控制的信息或资源的访问权限转让给其他用户。操作系统中的文件权限设置就是一个典型的DAC实例,用户可以设置文件的读、写、执行权限给其他用户或用户组。
  1. 强制访问控制(Mandatory Access Control, MAC)
  • MAC是一种严格的安全策略,其中系统本身负责所有权限决策,不允许用户随意更改。权限级别是由系统内定的安全策略决定,通常是基于信息的敏感性和用户的安全许可级别。在这种模型下,即使资源所有者也不能随意更改权限设置。
  1. 基于属性的访问控制(Attribute-Based Access Control, ABAC)
  • ABAC模型基于用户、资源、环境和操作的多种属性来决定访问权限。权限决策基于多重属性组合,例如用户的身份、位置、时间以及操作上下文等多种因素。这种方式更为灵活和精细,可以支持复杂的动态权限策略。
  1. 基于任务的访问控制(Task-Based Access Control, TBAC)
  • TBAC关注的是完成特定任务所需的最小权限集。用户在执行特定任务时获得必要的权限,任务完成后权限则会被收回。
  1. 基于能力的访问控制(Capability-Based Access Control, CBAC)
  • 在CBAC模型中,访问控制基于“能力”这一概念,能力是表示对某一资源具有特定访问权限的令牌。用户拥有一个或多个能力令牌,持有令牌意味着有权访问相应的资源。

3. RBAC(角色的访问控制模型)

  • RBAC 模型的基本思想是将用户和权限分离,通过角色作为中间层来连接用户和权限。一个角色可以关联多个权限,一个用户可以拥有多个角色。这样可以实现灵活的权限配置和管理,避免直接给用户分配权限带来的复杂性和冗余性。
  • RBAC 模型有多个扩展版本,如 RBAC0、RBAC1、RBAC2 等。我们使用的是 RBAC0 模型,即最基本的 RBAC 模型。RBAC0 模型包含三个要素:用户(User)、角色(Role)和权限(Permission)。用户是指使用系统的主体,角色是指一组相关的权限的集合,权限是指对系统资源的访问或操作能力。

  • 从上图中我们可以梳理出来的业务,就有,用户管理,角色管理,权限管理(有的系统中是菜单管理,后续给大家分析两者的差异)。所以我们在这里最少可以拆分出三张表,即用户,角色,权限,当然因为用户和角色,角色和权限都是多对多的关系,我们还可以有两张中间表,即总共5张表,但是在很多情况下,我们并没有反查的需求,所以3张表的设计是够用的。

4. vue3中实现权限控制方案

4.1. 分析

页面权限 的核心是 路由表配置,路由表分为两部分:

  • 固定路由表(constantRoutes):每个角色都有的路由表,例如登录界面、404界面
  • 私有路由表(privateRoutes):不同角色拥有不同的路由表

实现 页面权限 我们有两种方式:

  • 前端复杂版:即后端只返回当前用户的权限数据,前端根据权限数据,清洗路由后,再将清洗剩下的路由动态添加到路由表中。(推荐)
  • 后端复杂版:我们将所有私有路由都放到后端,在登录时,后端将当前用户的路由返回给我们(这里的路由也是我们的菜单数据,因为菜单和路由是关联的,也有的项目中是将路由和菜单分开,这里不探讨这种实现),这也就是上面说到的有的项目中会有个菜单管理的原因。

前端复杂方案:

优点:1. 后端只需关注rbac模型的核心,即用户,角色,权限。不需要关心我们的菜单标题,图标等。2. 我们可以在前端随时调整我们的项目视图文件路径。3. 路由元数据配置更方便。

缺点:修改菜单后,需要前端发版。

后端复杂方案:

优点:1. 可以直接在数据库中调整菜单标题,图标等。2. 可支持用户在界面配置菜单选项

缺点:1. 需要增加菜单管理功能。2. 适用项目模板的人,必须对后端有一定了解。3. 前端目录结构受限,必须与后端返回的数据一致。

推荐前端复杂方案:1. 我们即使有了菜单管理功能,当他新增一个菜单,我们前端一样需要新增对象文件。2. 菜单的顺序,图标,标题让用户自己修改的概率不大。3. 逻辑性更清晰。

4.2. 实现页面控制
4.2.1. 获取权限数据(省略了部分其余代码)
export const useUserStore = defineStore('user', () => {// ...const permissions = ref<Ipermissions>([])// ...// 获取权限function getPermissions() {return permissionApi().then((res) => {permissions.value = res.result.permissionsreturn permissions.value})}// ...return {  permissions, getPermission }
}, {persist: {key: `${STORAGE_PREFIX}${USER}`,paths: ['token', 'userInfo'],storage: localStorage,},
})

mock的后端返回数据

4.2.2. 在我们的路由上新增我们的权限字段auth

auth类型如下

在元信息中加入我们auth

4.2.3. 清洗路由

  1. 利用 addRoute API 动态的将路由添加到路由表中

4.3. 实现按钮权限

在vue中,他给我们提供了指令功能

所以我们可以封装一个权限指令,来解决我们的按钮权限

使用

处理这样,我们还可以吧这个封装成一个权限组件

使用

5. react18中实现权限控制方案

5.1. 分析

和vue一致,不赘述

5.2. 实现页面控制
5.2.1. 获取权限数据

mock的后端返回数据

5.2.2. 在我们的路由上新增我们的权限字段auth

auth类型如下

在元信息中加入我们auth

5.2.3. 权限控制

react-router中,他并没有给我们提供动态添加路由的方案,但是由于react非常灵活,所以以前我们是自己实现的动态添加路由,但是在最新的react-router版本中,他推荐使用最新的路由创建方式

但是这种方案,会导致我们很难动态的添加路由,所以采用的把所有路由都注入到路由表中,在路由进入的时候,判断权限,没权限的跳转403的方案。

5.3. 实现按钮权限

react中是没有像vue那样给我们提供自定义指令功能的,但是我们完全可以自己封装一个权限按钮组件。

6. 完整项目

6.1. vue3

码云:xt-admin-vue3: 🔥 🎉一款基于Vue3+Typescript Vite pinia+ element plus+unocss且超级好用的中后台管理框架

github:https://github.com/1245488569/xt-admin-vue3

6.2. react18

码云:https://gitee.com/nideweixiaonuannuande/xt-admin-react18

github:https://github.com/1245488569/xt-admin-react18


http://www.mrgr.cn/p/82868157

相关文章

使用Docker部署开源建站工具—Halo,并实现个人博客公网访问

目录 推荐 前言 1. Docker部署Halo 1.1 检查Docker版本 如果未安装Docker可参考&#xff1a; 已安装Docker步骤&#xff1a; 1.2 在Docker中部署Halo 2. Linux安装Cpolar 2.1 打开服务器防火墙 2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址 4. 固定Halo公网…

如何使用XSSFWorkbook读取文本薄?

本篇文章暂不对XSSFWorkbook类进行解析和说明,仅附有实现代码。 如果文中阐述不全或不对的,多多交流。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18146625 出自【进步*于辰的博客】1、文件兼容类型。 // 兼…

GAMES101 作业7 踩坑指南

首先回顾路径追踪的原理,如下图基本思想 wo是射向眼镜(相机)的光线,包含来自光源的直接光照ws,来自其他物体的间接光照wi两部分。 在实现path tracing时,我们考虑的是黄色线的方向,即光线从相机射向p点(实际上是从p点射向相机),然后通过多次随机采样从p点射出(实际上…

MoJoCo 入门教程(七)XML 参考

系列文章目录 前言 表格第二列中的符号含义如下&#xff1a; ! 必填元素&#xff0c;只能出现一次 ? 可选元素&#xff0c;只能出现一次 * 可选元素&#xff0c;可多次出现 R 可选元素&#xff0c;可递归出现多次 一、简介 本章是 MuJoCo 中使用的 MJCF 建模语言的参考手册。…

【继承】菱形继承以及虚拟菱形继承

文章目录 什么叫菱形继承菱形继承带来的问题 虚拟继承虚拟继承的内存布局总结&#xff1a; 关于继承和组合组合的优势代码复用最常见的几种手段有&#xff1a;继承的合理使用场景总结 什么叫菱形继承 菱形继承是多继承的一种特殊情况。什么叫多继承呢&#xff1f; 多继承又称多…

实验一原型设计-汽水音乐app

一、对比墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点墨刀 • 适用领域:主要专注于app原型设计,适合高保真原型、复杂多交互项目以及安卓/ios端项目。 • 优点:操作效率高,易于上手,特别适合设计移动应用的交互原型。 • 缺点:在后台和网页设计方面稍显…

数据库的物化视图

数据库的物化视图 数据库的物化视图(Materialized View)是一种预先计算和存储的查询结果集,可以提高查询性能和减少查询开销。与普通视图不同,物化视图是实际存储在磁盘上的表,而不是只是一个查询语句。物化视图可以在需要时更新,以保持其数据的实时性。 优点提高查询性能…

LCD显示屏 --- 介绍

LCD数据手册关键信息提取 LCD说明 LCD 即 液晶显示器,依据驱动方式可以分为静态驱动,简单矩阵驱动,主动矩阵驱动三种,其中简单矩阵分为TN和STN两种,主动矩阵则以薄膜式晶体管(TFT)为主。TFT LCD的现实质量是最佳的,从硬件角度看,一块LCD屏显示图像不但需要LCD驱动器,还…

艾拓琪光电威灏光电携手无锡哲讯启动SAP ERP数字化转型项目,共创未来发展

4月16日,艾拓琪光电&威灏光电携手SAP实施商无锡哲讯举行SAP数字化转型项目启动会,全面推动企业数智化转型。启动会受到双方企业高度重视,苏州艾拓琪总经理何总、安徽威灏光电总经理刘总,无锡哲讯总经理崔新华先生及全体项目团队成员出席本次SAP ERP项目启动会。苏州艾拓…

PgSQL之WITH Queries/Statement

PostgreSQL WITH 子句 在 PostgreSQL 中&#xff0c;WITH 子句提供了一种编写辅助语句的方法&#xff0c;以便在更大的查询中使用。 WITH 子句有助于将复杂的大型查询分解为更简单的表单&#xff0c;便于阅读。这些语句通常称为通用表表达式&#xff08;Common Table Express…

在 Elasticsearch 中扩展 ML 推理管道:如何避免问题并解决瓶颈

作者&#xff1a;来自 Elastic Iulia Feroli 是时候考虑语义搜索运营了吗&#xff1f; 无论你是一位经验丰富的搜索工程师&#xff0c;希望探索新的人工智能功能&#xff0c;还是一位机器学习专家&#xff0c;希望更多地利用搜索基础设施来增强语义相似性模型 —— 充分利用这…

Qt菜单栏

文章目录 创建菜单栏创建菜单并在菜单栏中添加创建子菜单并添加到菜单创建菜单项并在菜单中添加分割线实现简易的记事本 Qt 窗口是通过 QMainWindow类 来实现的 创建菜单栏 Qt 中的菜单栏是通过 QMenuBar 这个类来实现的&#xff0c;一个窗口最多只有一个菜单栏。 菜单栏包含…

项目7-音乐播放器5+注册账号

前端之登录注册页面案例_前端登录页面-CSDN博客 1.前端代码 MAPPER Insert("insert into user(username,password) values (#{username},#{password}) ")Integer insertUserInfo(String username,String password); Service public Result insertUserInfo(String…

wifi解析方法(简易版,未成功)

本篇文章阐述的wifi解析方法很简单,尽管失败了,不妨为一种思路。 如果文中阐述有不全或不对的,多多交流。【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18032045 出自【进步*于辰的博客】目录1、完整代码2、改…

超越现实的展览体验,VR全景展厅重新定义艺术与产品展示

随着数字化时代的到来&#xff0c;VR全景展厅成为了企业和创作者展示作品与产品的新兴选择。通过结合先进的虚拟现实技术&#xff0c;VR全景展厅不仅能够提供身临其境的观展体验&#xff0c;而且还拓展了传统展示方式的界限。 一、虚拟现实技术的融合之美 1、高度沉浸的观展体验…

IDEA自定义模板方法

新建一个自己的模板分组在分组下创建自己的模板样例:

KubeSphere中间件部署

中间件部署实战 语雀 RuoYi-Cloud部署实战 语雀 https://www.bilibili.com/video/BV13Q4y1C7hS?p79 1. 应用部署三要素 应用的部署方式&#xff08;Deployment、StatefulSet、DaemonSet&#xff09; 应用的数据挂载&#xff08;数据、配置文件&#xff09; 应用的可访…

Java 的注释

文章目录 java 的注释共有三种形式单行注释多行注释文档注释文档注释的文档需要命令进行生成GBK 不可映射问题 与大多数的编程语言一样&#xff0c;Java 中的注释也不会出现在可执行程序中。 因此我们可以在源程序中根据需要添加任意多的注释&#xff0c;而不必担心可执行代码受…

jenkins从节点配置说明

目的 打包构建时使用从节点&#xff0c;从节点所在服务器配置4C8G5000G&#xff08;服务器2&#xff09; 前提 首先在服务器1上部署jenkins服务&#xff0c;即主节点&#xff0c;默认节点名称为master 步骤 1&#xff09;登录进入jenkins平台&#xff0c;在系统设置中&…