lnmp - RBAC方案设计与实现

news/2024/10/11 22:49:03 标签: java, 开发语言

概述

实践的是一套企业内部使用后台OA管理系统,对这套系统设计的RBAC(Role-Based Access Control,基于角色的访问控制),RBAC 方案旨在通过将后台用户与角色进行关联,再将角色与权限进行关联,实现对系统资源的灵活、高效和安全的访问控制。

这种方式可以大大简化权限管理的复杂性,提高系统的可维护性和安全性。

关键概念

在看方案设计之前,有几个关键概念需要理解:

  • 后台用户(admin):台管理系统(OA)的使用者,为了区分C端用户,把这里的概念定义为后台用户。
  • 角色(Role):一组特定的权限集合,代表了特定的工作职责或功能,同一个用户可以分配多个角色,角色不同,职能也不同。
  • 权限(Permission):对系统资源的具体操作许可,如查看、编辑、删除、添加等,权限可以针对不同的功能模块或数据对象进行设置,也就是Node节点。
  • 组织架构(Department):所有的后台管理系统(OA)都是有组织架构,也就是部门,所有的部门负责人对所属子部门进行管理。

工作原理

在这里插入图片描述

1、首先,在系统中定义各种角色,比如并为每个角色分配相应的权限,根据职能角色有销售、客服、财务、工程师等角色。
2、给角色分配对应的权限,比如销售角色有添加客户、查看自己或自己部门销售的客户。
3、将用户分配到特定的角色,比如创建stark张宇 这个用户时,分配给stark张宇后端开发工程师的角色,一个用户也可以同时分为多个角色,角色和用户是多对多的关系。
4、当后台用户登录系统后,系统获取当前用户的角色,如果是多角色,在登录时进行选择即可。
5、Node节点仅对有权限的角色进行可见和对应操作。

注意事项

1、权限的分配应遵循最小权限原则,即只给予用户完成其工作所需的最小权限。
2、定期审查用户的权限,确保权限的合理性和安全性。
3、在系统升级或功能调整时,及时检查和更新权限设置,以防止出现权限漏洞。

数据库设计

RBAC的数据库设计最主要的记录就是以下5个数据表实现,重点叙述一下用户角色关系表 admin_roles,把用户stark张宇设置成为多个角色,是一个多对多的关系,在操作数据时使用事务操作,来保证数据的原子性和一致性,系统中设置先设置菜单,生成菜单的节点,对角色直接操作,不作用在用户上,用角色分离后台用户和权限。

1、后台用户表 admin

CREATE TABLE `admin` (
  `admin_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '真实姓名',
  `account` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '账号:即手机号',
  `idcard` varchar(18) NOT NULL DEFAULT '',
  `birth` int(8) NOT NULL DEFAULT '0' COMMENT '生日',
  `gender` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '性别 1男2女',
  `password` char(32) NOT NULL DEFAULT '' COMMENT '密码',
  `department_id` int(10) NOT NULL DEFAULT '0' COMMENT '部门ID',
  `current_role_id` tinyint(1) NOT NULL COMMENT '当前角色',
  `master_uid` tinyint(3) unsigned NOT NULL COMMENT '是否负责人 0-否',
  `status` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1正常 2禁用 3删除',
  `position` varchar(128) NOT NULL DEFAULT '' COMMENT '职务',
  `public_openid` char(28) NOT NULL DEFAULT '' COMMENT '公众号openid',
  `organ_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '所属机构主键ID',
  `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
  `create_admin_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建后台用户ID',
  `create_admin_name` varchar(255) NOT NULL DEFAULT '' COMMENT '创建后台用户名称',
  `update_time` int(10) NOT NULL DEFAULT '0' COMMENT '更新时间',
  `update_admin_id` int(11) NOT NULL DEFAULT '0' COMMENT '最后更新后台用户ID',
  `update_admin_name` varchar(255) NOT NULL DEFAULT '' COMMENT '最后更新后台用户姓名',
  PRIMARY KEY (`admin_id`) USING BTREE,
  KEY `account` (`account`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='后台用户表';

2、角色表 role

CREATE TABLE `role` (
  `role_id` int(11) NOT NULL AUTO_INCREMENT,
  `role_name` varchar(64) NOT NULL DEFAULT '' COMMENT '角色名称',
  `organ_id` tinyint(11) NOT NULL DEFAULT '0' COMMENT '机构ID',
  `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态 1正常 2删除',
  `show` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '是否显示 1:是 2:否',
  `create_time` int(11) NOT NULL DEFAULT '0',
  `create_admin_id` tinyint(1) NOT NULL DEFAULT '1' COMMENT '创建人ID',
  `create_admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人姓名',
  `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后更新时间',
  `update_admin_id` tinyint(1) NOT NULL DEFAULT '1' COMMENT '更新人ID',
  `update_admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '更新人姓名',
  PRIMARY KEY (`role_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

3、用户角色关系表 admin_roles

CREATE TABLE `admin_roles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `admin_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户ID',
  `role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色ID',
  `organ_id` int(11) unsigned NOT NULL DEFAULT '0',
  `status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态 1正常 2删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='后台用户角色关系表';

4、菜单表

CREATE TABLE `menu` (
  `node_id` int(11) NOT NULL AUTO_INCREMENT,
  `node_name` varchar(64) NOT NULL DEFAULT '' COMMENT '菜单名称',
  `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '父级ID',
  `node_route` varchar(600) NOT NULL DEFAULT '' COMMENT '路由Url',
  `node_type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '菜单类型 1菜单 2按钮',
  `node_order` smallint(6) NOT NULL DEFAULT '0' COMMENT '顺序',
  `node_status` tinyint(2) NOT NULL DEFAULT '1' COMMENT '状态 1正常 2删除',
  `node_show` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT '是否显示 1:是 2:否',
  `icon_url` varchar(500) NOT NULL DEFAULT '' COMMENT '图标url',
  `organ_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '机构主键ID',
  `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  `create_admin_id` tinyint(1) NOT NULL DEFAULT '1' COMMENT '创建人ID',
  `create_admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '创建人姓名',
  `update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最后更新时间',
  `update_admin_id` tinyint(1) NOT NULL DEFAULT '1' COMMENT '更新人ID',
  `update_admin_name` varchar(64) NOT NULL DEFAULT '' COMMENT '更新人姓名',
  PRIMARY KEY (`node_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';

5、角色菜单关系表

CREATE TABLE `role_menus` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_id` int(11) DEFAULT '0' COMMENT '角色ID',
  `node_id` int(11) DEFAULT '0' COMMENT '菜单ID',
  `status` tinyint(2) DEFAULT '1' COMMENT '状态 1正常 2删除',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色菜单关系表';

最后

所有的方案设计都是循序渐进,先完成再完美,有和我同道的朋友可以私信我,大家一起学习一起加油。


http://www.niftyadmin.cn/n/5700323.html

相关文章

Android15之解决:Dex checksum does not match for dex:services.jar问题(二百三十五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…

CV方法再学习

轻量化模型 Mobile系列(V1~V3) MobileNetV1 MobileNetV1之所以轻量,与深度可分离卷积的关系密不可分 深度可分离卷积 主要是两种卷积变体组合使用,分别为逐通道卷积(Depthwise Convolution)和逐点卷积(Pointwise C…

Java的IO操作与文件的基本常识

首先什么是IO操作呢? IO操作其实解释操作硬盘 1. 文件系统操作 创建文件,删除文件,重命名文件,创建目录…操作 2. 文件内容操作 进行读与写操作 先来了解一下基本的文件知识方便学习接下来的IO操作 文件路径 文件路径是从数根节点触发,沿着树杈一直往下走,到达目标文件…

[SQL] 数据库增删改操作

一 增加 关键字: insert注意: 插入的数据如果是: 字符串和日期类型数据需要包含在单引号内。 1.1 给指定字段添加数据 insert into 表名 (字段名1,字段名2,...) values(值1,值2...); 1.2 给全部字段添加数据 不指定字段名时要添加所有字段并且值一一对应。即使…

『网络游戏』进入游戏主城UI跳转主城【26】

首先在Unity客户端中创建一个空节点重命名为MainCityWnd 设置父物体为全局 创建空节点钉在左上角作为角色信息UI 在钉子下创建Image 创建脚本:MainCityWnd.cs 编写脚本:MainCityWnd.cs 挂载脚本 创建脚本:MainCitySys.cs 编写脚本&#xff1a…

CDN绕过学习

1.什么是CDN? CDN就是分布在各个地区的服务器,这些服务器储存着数据的副本。 哪些服务器比较接近你,当你发起请求时,提前就会快速为你提供服务。 总结来说就是: 其实就是用来加速访问的,以及缓解压力&a…

vue基础语法的用法(API组合式风格)

一、项目文件结构 .vscode我们在那个编辑器中编辑时就会有对应的这个文件夹,不是固定的 进行编写代码前先把资源自带的页面删除,以防误导,可以像我一样的删除内容 vue文件结构 二、你好 vue el插值 script代码 v-text插值 script代码 三、…

Python 如何使用 Bert 进行中文情感分析

前言 在自然语言处理(NLP)领域,情感分析是一个非常常见且重要的应用。情感分析通常用于识别文本中的情感,例如判断一条微博或评论是正面、负面还是中性。在过去的几年中,随着深度学习的发展,BERT&#xff…