当前位置: 首页 > news >正文

lnmp - RBAC方案设计与实现

概述

实践的是一套企业内部使用后台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.mrgr.cn/news/48074.html

相关文章:

  • undefined reference to `vtable for错误
  • 【Laravel】接口的访问频率限制器
  • React第十八节 useEffect 用法使用技巧注意事项详解
  • Java测试开发平台搭建(四)拦截器
  • istio配置重复的svc报错
  • Marscode AI辅助编程
  • 使用阿里云盘将服务器上的文件上传/下载到云盘/服务器
  • MySQL数据库详细学习要点
  • 纯干货!详解Java并发之线程中断机制
  • Docker理念
  • Android Studio 安装和认识
  • SpringBoot集成Redis
  • 牛上脑和各类牛排的叫法,不要土老帽了~
  • v-html里面的标签设置样式没有用怎么办?
  • 【Linux调试工具】gdb/cgdb
  • 文件之间的输入输出
  • 在python中如何判断回文串(一)?
  • Linux内核 --内存管理之 Slab 分配器介绍
  • 太速科技-628-基于VU3P的双路100G光纤加速计算卡
  • Docker 入门篇
  • 【前端碎片记录】大文件分片上传
  • 【selenium】webdriver测试脚本
  • 常用的web服务器简述
  • ubuntu24 finalshell 无法连接ubuntu服务器, 客户端无法连接ubuntu, 无法远程连接ubuntu。
  • go开发环境设置-安装与交叉编译
  • 【C++进阶】关联式容器map的使用