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='角色菜单关系表';
最后
所有的方案设计都是循序渐进,先完成再完美,有和我同道的朋友可以私信我,大家一起学习一起加油。