rbac数据库设计 mysql_设计-RBAC数据库的设计与使用

本文详细介绍了如何使用MySQL设计实现RBAC(Role-Based Access Control)权限管理系统,包括用户表、权限表、角色表及其关联表的创建,以及在实际使用中的角色与菜单权限分配策略,为构建安全的后台权限控制提供了数据库设计方案。
摘要由CSDN通过智能技术生成

这种关系的讲解,推荐一篇文章--[文章2]

先看几张图,了解下RBAC

1d20fd8c3029

权限模型

ACL是用户直接拥有权限,RBAC是用户通过角色来拥有的权限。与权限之间是间接关系

1d20fd8c3029

图片.png

RBAC简化了用户和权限的关系,易扩展和维护

1d20fd8c3029

图片.png

1d20fd8c3029

图片.png

1d20fd8c3029

图片.png

1d20fd8c3029

图片.png

1d20fd8c3029

图片.png

1d20fd8c3029

图片.png

数据库设计-- 要时刻牢记一个原则,用户是通过角色来拥有的权限。也就是用户是跟角色有关联,而跟权限没有关联

开发之前有必要先来分析一下数据表:

我们给角色赋权限,让角色与用户关联

- 1.用户表--users

- 2.权限表--permissions

- 3.角色表--roles

- 4.角色表和权限表--role_permission

- 5.用户和角色表--user_role

drop table `permissions` if EXISTS ;

CREATE TABLE IF NOT EXISTS `permissions` (

`id` int(11) NOT NULL auto_increment,

`Title` char(64) NOT NULL,

`Description` text NOT NULL,

`slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,

`http_path` text COLLATE utf8mb4_unicode_ci,

PRIMARY KEY (`id`),

KEY `Title` (`Title`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='权限表';

slug表示权限的名称,比如登录

http_path表示uri路径 比如 /login /logout

drop table `roles` if EXISTS ;

CREATE TABLE IF NOT EXISTS `roles` (

`id` int(11) NOT NULL auto_increment,

`Title` varchar(128) NOT NULL,

`Description` text NOT NULL,

PRIMARY KEY (`id`),

KEY `Title` (`Title`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色表';

drop table `role_permission` if EXISTS ;

CREATE TABLE IF NOT EXISTS `role_permission` (

`role_id` int(11) NOT NULL,

`premission_id` int(11) NOT NULL,

PRIMARY KEY (`role_id`,`premission_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色权限表';

drop table `user_role` if EXISTS ;

CREATE TABLE IF NOT EXISTS `user_role` (

`user_id` int(11) NOT NULL,

`role_id` int(11) NOT NULL,

PRIMARY KEY (`user_id`,`role_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户角色表';

当然,还有user表。此处不再写

`role_permission` 表里可以使用 PRIMARY KEY (`role_id`,`premission_id`)索引。无需自增id 。`user_role`表也是一样

在使用上:

`user_role` 的表,哪个用户想拥有哪个菜单的角色,就在这个表添加一条数据

`role_permission` 的表,哪个角色想拥有哪个权限,就在这个表添加一条数据

这样我们只是建好了表,但实际我们是要用于某些后台连接点击权限的

所以我们还需要两张表链接菜单表menus和用户和链接菜单表role_menu

drop table `role_menu` if EXISTS ;

CREATE TABLE `role_menu` (

`role_id` int(11) NOT NULL,

`menu_id` int(11) NOT NULL,

PRIMARY KEY (`role_id`,`menu_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户和链接菜单表';

drop table `menus` if EXISTS ;

CREATE TABLE `menus` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`parent_id` int(11) NOT NULL DEFAULT '0',

`order` int(11) NOT NULL DEFAULT '0' COMMENT '排序,这个表可以不要',

`title` varchar(50) COLLATE utf8_unicode_ci NOT NULL,

`uri` varchar(50) COLLATE utf8_unicode_ci NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='链接菜单表';

`role_menu` 的表,哪个角色想拥有哪个菜单的权限,就在这个表添加一条数据

1d20fd8c3029

`menus表`

再进一步想,我们可以通过管理组来与用户关联.此处的组,可以理解为上面的角色。那么我们需要如下两个表。我们给组赋权限,让组与用户关联

drop table `groups` if EXISTS ;

CREATE TABLE IF NOT EXISTS `groups` (

`id` int(11) NOT NULL auto_increment,

`Title` varchar(128) NOT NULL,

`Description` text NOT NULL,

PRIMARY KEY (`id`),

KEY `Title` (`Title`),

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户组表';

drop table `group_permission` if EXISTS ;

CREATE TABLE IF NOT EXISTS `group_permission` (

`premission_id` int(11) NOT NULL,

`group_id` int(11) NOT NULL,

`slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,

`http_path` text COLLATE utf8mb4_unicode_ci,

PRIMARY KEY (`group_id`,`premission_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色组';

drop table `user_group` if EXISTS ;

CREATE TABLE IF NOT EXISTS `user_group` (

`group_id` int(11) NOT NULL,

`user_id` int(11) NOT NULL,

PRIMARY KEY (`user_id`,`group_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='角色组与用户表';

第二部分,使用篇

上面我们介绍完表关联设计后,接下来谈一谈怎么使用。使用的时候应该是某个角色role可以操作某些路由,所以应该有两个表。路由表menu和角色路由表role_menu

CREATE TABLE `role_menu` (

`role_id` int(11) NOT NULL,

`menu_id` int(11) NOT NULL,

KEY `role_menu_role_id_menu_id_index` (`role_id`,`menu_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `menu` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`parent_id` int(11) NOT NULL DEFAULT '0',

`order` int(11) NOT NULL DEFAULT '0',

`title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,

`uri` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

1d20fd8c3029

表单层级表

此处我讲下路由限制的menu表,

parent_id就是本url属于哪个层级(这里用的是无限分类)

比如此处表单和test都在4Roles下面

order是列表显示的排序,序号小的在上面,此处表单在test上面

uri是角色可以访问的路由,自己通过代码限制即可

menu与role_menu`表的配合是指图中最坐变那排图标的显示

然后是 permissions中 slug、http_path字段也是路由限制,permissions是表示直接在浏览器上输入路由不可以访问

要说明的是,如果不显示图标的情况,如果你没做路由访问限制,输入对应的uri其实也是可以访问页面的。

我们在显示某个用户的菜单列表的时候,

在role_menu表中,role_id,menu_id都可以是多个

1.通过user.id查到role_menu.menu_id集合,

2.然后查到符合menu_id集合的menu.id显示出来

在做某个用户访问某个路由的时候

role_user表中user_id是唯一的,role_id是可以多个的

1.通过user.id得到role_user.role_id

2.然后得到role_permissions表中的permissions.(表中的permissions_id和role_id都可以是多个)

3.去permissions表取出id对应的uri(即http_path)数据

rbac数据库设计 1 rbac数据库设计 RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中⼼进⾏访问控制分享⽜原创,分享⽜系列,分享⽜。rbac ⽤户⾓⾊权限资源表如 何设计呢?下⾯开始表的设计RBAC表结构。 1.1 ⽤户表 CREATE TABLE `sys_user` ( `id` varchar(36) NOT NULL COMMENT '主键', `usercode` varchar(32) NOT NULL COMMENT '账号', `username` varchar(64) NOT NULL COMMENT '姓名', `password` varchar(32) NOT NULL COMMENT '密码', `salt` varchar(64) DEFAULT NULL COMMENT '盐', `locked` char(1) DEFAULT NULL COMMENT '账号是否锁定,1:锁定,0未锁定', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.2 ⾓⾊表 CREATE TABLE `sys_role` ( `id` varchar(36) NOT NULL, `name` varchar(128) NOT NULL, `available` char(1) DEFAULT NULL COMMENT '是否可⽤,1:可⽤,0不可⽤', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.3 ⽤户⾓⾊中间表 CREATE TABLE `sys_user_role` ( `id` varchar(36) NOT NULL, `sys_user_id` varchar(32) NOT NULL, `sys_role_id` varchar(32) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.4 权限表 CREATE TABLE `sys_permission` ( `id` bigint(20) NOT NULL COMMENT '主键', `name` varchar(128) NOT NULL COMMENT '资源名称', `type` varchar(32) NOT NULL COMMENT '资源类型:menu,button,', `url` varchar(128) DEFAULT NULL COMMENT '访问url地址', `percode` varchar(128) DEFAULT NULL COMMENT '权限代码字符串', `parentid` bigint(20) DEFAULT NULL COMMENT '⽗结点id', `parentids` varchar(128) DEFAULT NULL COMMENT '⽗结点id列表串', `sortstring` varchar(128) DEFAULT NULL COMMENT '排序号', `available` char(1) DEFAULT NULL COMMENT '是否可⽤,1:可⽤,0不可⽤', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.5 ⾓⾊权限表 CREATE TABLE `sys_role_permission` ( `id` varchar(36) NOT NULL, `sys_role_id` varchar(32) NOT NULL COMMENT '⾓⾊id', `sys_permission_id` varchar(32) NOT NULL COMMENT '权限id', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.6 初始化数据 /* SQLyog v10.2 MySQL - 5.1.72-community : Database - shiro ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值