聊一聊前后端权限控制 RBAC(完整流程)

介绍

RBAC(Role-Based Access Control)模型也就是基于角色的权限控制。

在这里插入图片描述

权限会分配到角色中,角色再分配给用户,这样用户就根据角色有了不同的权限。

当然,你可以说把权限直接挂载到用户上,这样不是更直接?

如果用户量有1W个,权限有100个,每个用户要分配不同的权限,试想一下需要多久完成这份工作,如果把不同的权限分配到角色上,用户只需要分配对应的角色,这样工作量是不是就较少了很多呢?

从根不上讲前端仅仅只是视图层的展示, 权限的核心在于后端,后端权限可以控制某个用户是否能够查询数据,是否能够修改数据等操作。前端权限的控制本质上来说, 就是控制端的视图层的展示和前端所发送的请求。但是只有前端权限控制没有后端权限控制是万万不可的。 前端权限控制只可以说是达到锦上添花的效果。

后端如何设计

数据库表结构设计

首先需要创建5张表。

  1. 用户表
  2. 角色表
  3. 权限表
  4. 用户与角色 关联表(多对多)
  5. 角色与权限 关联表(多对多)

其中用户角色关联表里存的是用户表id和角色表id,同样的,角色权限表存的是用户表id和权限表id。

关联表的作用就是将两张表通过唯一标识关联起来,并且存储关联的数据,比如user_id = 2的用户有两个角色,role_id分别是11, 12,那么在用户角色表中,存储的就有两条数据,如下图:

在这里插入图片描述

如果我想查找user_id为1的用户下的角色就可以直接去这张表里查找。

接口访问权限控制

先举个不做接口访问权限控制例子,假如A角色本身没有访问 addUser 接口的权限,前端页面中也确实没有入口可以使用,但是token被人恶意使用了,别人不知道从哪知道的 addUser 接口地址,然后通过postman工具或者其它发送http请求的工具就恶意调取使用了,这个时候后端校验token没问题,addUser 接口就放行了,那这种情况下系统就被搞坏了!

所以需要后端对接口进行权限控制。

主要具体做法就是,通过登陆的用户信息拿到该用户所拥有的权限,比如 addUser 接口对应的接口权限为add_user。需要先校验用户是否存在add_user权限,如果存在则放行,不存在就需要返回错误信息。

后端返回前端什么样的数据(类似于下面的数据模型)

一般会有两个接口,分别为获取用户信息,权限等 getUserInfo 接口 和 获取菜单信息 getMenu 接口。无非就是根据单个条件查询,连表查询

getUserInfo 接口数据模型如下:

在这里插入图片描述

getMenu 接口数据模型如下:

在这里插入图片描述

前端如何设计

前端权限的意义

如果仅从能够修改服务器中数据库中的数据层面上讲, 确实只在后端做控制就足够了, 那为什么越来越多的项目也进行了前端权限的控制, 主要有这几方面的好处

  1. 降低非法操作的可能性
    在页面中展示出一个就算点击了也最终会失败的按钮,势必会增加有心者非法操作的可能性
  2. 尽可能排除不必要清求,减轻服务器压力。
    没必要的请求,操作失败的清求,不具备权限的清求,应该压根就不需要发送,请求少了,自然也会减轻服务器的压力。
  3. 提高用户体验。
    根据用户具备的权限为该用户展现自己权限范围内的内容,避免在界面上给用户带来困扰,让用户专注于分内之事

定义路由

前端需要把所需要的路由定义好,分为两部分:一部分是静态路由,可以随意访问;另一部分是权限路由,需要做权限控制。

我们的页面结构通常是左侧有一个侧边栏,然后页面在中间的内容区域显示。所以这部分需要定义成嵌套路由。内容区为路由出口,React里边的 <Outlet />,Vue中的 <RouterView />; 然后还可以把一些页面通过懒加载的方式引入。

示例代码:

/*** 静态路由 可随意访问*/
export const staticRoutes: RouteRecordRaw[] = [{path: '/',element: <Login />,name: '首页',title: '首页',},{path: '/login',element: <Login />,name: '登陆页',title: '登陆页',},{path: '/403',element: <NotAuth />,name: '无权限',title: '无权限',lazy: true,},{path: '/404',element: <NotFond />,name: '页面不存在',title: '页面不存在',lazy: true,},{path: '/500',element: <Error />,name: '错误',title: '错误',lazy: true,},{path: '*',element: <Navigate to="/404" />,name: '404',title: '404',},
];export default function Router() {return (<Routes>{/* 静态路由 */}{renderRoutes(staticRoutes)}{/* 嵌套路由 权限路由 */}<Route path="/*" element={<LayoutIndex />}>{renderRoutes(baseRoutes)}</Route></Routes>);
}

前端权限控制分类

菜单动态显示控制

在登录成功后,会得到权限数据,前端根据后端返回的菜单数据,展示对应的菜单,点击菜单,才能查看相关的界面。

页面的权限控制

使用路由守卫就可以了,通过路由守卫来控制显示路由出口、登陆页、404页React中可以自定义一个AuthRouter;Vue中可以使用router.beforeEach

使用React举例:

/*** 路由守卫* @param children* @returns*/
export function AuthRouter({ children }: { children: JSX.Element }) {const location = useLocation();const menu = useMenu();const paths = menu.map((i) => i.permissionCode);const ignore = baseRoutes.find((i) => location.pathname === i.path)?.ignore;// 判断是否有登录态if (!isLoginStatus()) {store.dispatch(clear());return (<Navigateto={`/login${location.search}`}state={{ from: location, login: true, back: location.pathname + location.search }}replace/>);}if (ignore) return children;// 无权限数据if (menu.length === 0) return null;// 用户无权限访问if (paths.indexOf(location.pathname) == -1) return <Navigate to="/403" />;return children;
}// 使用
<AuthRouter><Outlet />
</AuthRouter>

按钮的权限控制

用户不具备权限的按钮需要隐藏或者禁用,React中可以定一个组件根据权限来控制按钮的现实逻辑或者禁用逻辑;Vue中可以使用自定义指令

以React为例,我们已经获取了所有的权限数据。比如 某个用户不需要显示添加用户按钮

const AuthButton = ({ permission, children, ...props }) => {const permissions = useAuth();if (!hasPermission(permissions, permission)) {return null;}return children;
};<AuthButton permission="add_user"> 添加用户 </AuthButton>

结语

这就是前后端完整的权限控制流程,也是市面上比较常见的一种方案。关于前端无论使用React还是Vue,只要理解并梳理清楚了这个流程。在代码层面是较容易实现的。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端工程化10-webpack静态的模块化打包工具之各种loader处理器

9.1、案例编写 我们创建一个component.js 通过JavaScript创建了一个元素&#xff0c;并且希望给它设置一些样式&#xff1b; 我们自己写的css,要把他加入到Webpack的图结构当中&#xff0c;这样才能被webpack检测到进行打包&#xff0c; style.css–>div_cn.js–>main…

代码随想录二刷复习(二分法)

二分法模板&#xff1a; 1&#xff1a;左闭右闭区间写法 第一种写法&#xff0c;我们定义 target 是在一个在左闭右闭的区间里&#xff0c;也就是[left, right] &#xff08;这个很重要非常重要&#xff09;。 区间的定义这就决定了二分法的代码应该如何写&#xff0c;因为定…

泛微e-cology WorkflowServiceXml SQL注入漏洞(POC)

漏洞描述&#xff1a; 泛微 e-cology 是泛微公司开发的协同管理应用平台。泛微 e-cology v10.64.1的/services/接口默认对内网暴露&#xff0c;用于服务调用&#xff0c;未经身份认证的攻击者可向 /services/WorkflowServiceXml 接口发送恶意的SOAP请求进行SQL注入&#xff0c;…

Web渗透:Shiro550漏洞(CVE-2016-4437)

Apache Shiro 是一个强大且易于使用的Java安全框架&#xff0c;提供了身份验证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、会话管理&#xff08;Session Management&#xff09;和密码学支持等功能。Apache Shiro 550反序列化漏洞&a…

AI算法19-偏最小二乘法回归算法Partial Least Squares Regression | PLS

偏最小二乘法回归算法简介 算法概述 偏最小二乘法模型可分为偏最小二乘回归模型和偏最小二乘路径模型。其中偏最小二乘回归模型是一种新型的多元统计方法&#xff0c;它集中了主成分分析、典型相关分析和线性回归的特点&#xff0c;特别在解决回归中的共线性问题具有无可比拟…

内网安全:权限维持的各种姿势

1.Linux权限维持 2.Windows权限维持 目录&#xff1a; 一.Linux权限维持&#xff1a; 1.webshell&#xff1a; 2.定时任务&#xff1a; 3.SUID后门&#xff1a; 4.SSH Key免密登录后门&#xff1a; 5.添加用户后门&#xff1a; 二.Windows权限维持 1.计划任务后门&…

记录些Spring+题集(1)

接口防刷机制 接口被刷指的是同一接口被频繁调用&#xff0c;可能是由于以下原因导致&#xff1a; 恶意攻击&#xff1a;攻击者利用自动化脚本或工具对接口进行大量请求&#xff0c;以消耗系统资源、拖慢系统响应速度或达到其他恶意目的。误操作或程序错误&#xff1a;某些情…

iOS ------ 消息传递和消息转发

一&#xff0c;消息传递 在OC中&#xff0c;传递消息就是在对象上调用方法。 相对于C语言的方法就“静态绑定”的函数&#xff0c;在编译器就决定了运行时所要调用的函数。在OC中&#xff0c;如果向某对象传递消息&#xff0c;就会使用动态绑定机制来决定需要调用那个方法。调…

【操作系统】定时器(Timer)的实现

这里写目录标题 定时器一、定时器是什么二、标准库中的定时器三、实现定时器 定时器 一、定时器是什么 定时器也是软件开发中的⼀个重要组件.类似于⼀个"闹钟".达到⼀个设定的时间之后,就执行某个指定 好的代码. 定时器是⼀种实际开发中⾮常常用的组件. ⽐如⽹络通…

浅谈C嘎嘎类与对象

本篇文章与大家浅谈一下C嘎嘎的类与对象知识点 类的定义 关键字&#xff1a;class 语法格式&#xff1a; class 类名 { }&#xff1b;//这里的分号不能少 此外&#xff0c;class有三个属性分别是private、public、protected&#xff0c;这三个属性是干啥的&#xff0c;相…

FPGA CFGBVS 管脚接法

说明 新设计了1个KU040 FPGA板子&#xff0c;回来之后接上JTAG FPGA不识别。做如下检查&#xff1a; 1、电源测试点均正常&#xff1b; 2、查看贴片是否有漏焊&#xff0c;检查无异常&#xff0c;设计上NC的才NC&#xff1b; 3、反复检查JTAG接线是否异常&#xff0c;贴片是…

【BUG】已解决:ValueError: Expected 2D array, got 1D array instead

已解决&#xff1a;ValueError: Expected 2D array, got 1D array instead 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉…

本地多模态看图说话-llava

其中图片为bast64转码&#xff0c;方便json序列化。 其中模型llava为本地ollama运行的模型&#xff0c;如&#xff1a;ollama run llava 还有其它的模型如&#xff1a;llava-phi3&#xff0c;通过phi3微调过的版本。 实际测试下来&#xff0c;发现本地多模型的性能不佳&…

音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的色彩格式&#xff08;又译作色度采样结构、像素格式&#xff09;&#xff1a; 在vlc中也可以获取到色彩格式&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 这个色彩格式就是之前的文章《音视频入门基础…

【unity实战】使用unity制作一个红点系统

前言 注意&#xff0c;本文是本人的学习笔记记录&#xff0c;这里先记录基本的代码&#xff0c;后面用到了再回来进行实现和整理 素材 https://assetstore.unity.com/packages/2d/gui/icons/2d-simple-ui-pack-218050 框架&#xff1a; RedPointSystem.cs using System.…

入职前回顾一下git-01

git安装 Linux上安装git 在linux上建议用二进制的方式来安装git&#xff0c;可以使用发行版包含的基础软件包管理工具来安装。 红帽系 sudo yum install gitDebian系 sudo apt install gitWindows上安装git 去官网下载和操作系统位数相同的安装包.或者可以直接安装GitHub…

MAVSDK动态库与静态库及mavsdk_server程序macOS平台编译与安装

1.克隆mavsdk: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编译静态库 cmake -Bbuild/default -H. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF 生成makefile 生成成功,开始编译 cmake --build build/default -j8 成功生成libmavsdk.a 开…

谷歌邮箱被停用,开发者账号也要完犊子了?还能申诉回来?怎么申诉

当谷歌邮箱突然被停用&#xff0c;不少开发者可能会感到一阵心慌。大家最担心的是&#xff0c;这会不会影响到自己用这个邮箱注册的开发者账号&#xff1f;自己的APP还能不能顺利通过审核&#xff1f;毕竟&#xff0c;邮箱一旦“歇菜”&#xff0c;可能就意味着和它绑定的开发者…

VAE论文阅读

在网上看到的VAE解释&#xff0c;发现有两种版本&#xff1a; 按照原来论文中的公式纯数学推导&#xff0c;一般都是了解生成问题的人写的&#xff0c;对小白很不友好。按照实操版本的&#xff0c;非常简单易懂&#xff0c;比如苏神的。但是却忽略了论文中的公式推导&#xff…

几何相关计算

目录 一、判断两个矩形是否相交 二、判断两条线段是否相交 三、判断点是否在多边形内 四、垂足计算 五、贝塞尔曲线 六、判断多边形顺时针还是逆时针 七、判断凹多边形 一、判断两个矩形是否相交 当矩形1的最大值比矩形2的最小值都小&#xff0c;那矩形1和矩形2一定不相…