• 作者:老汪软件技巧
  • 发表时间:2024-10-13 04:00
  • 浏览量:

概述

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

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

关键概念

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

工作原理

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='角色菜单关系表';

最后

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