RBAC的写法

本文介绍了基于角色的权限管理(RBAC)系统的基本概念及其实现方式,包括使用不同数量的表格来存储用户、角色与权限的关系,并提供了具体的表结构设计实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RBAC(Role-Based Access Control)基于角色的权限管理。
目前常见的RBAC方式有三种:
①文件(数组)的方式存储RBAC数据的;
②三表 (user:用户表、角色表(role)、权限表(rule));
③四表(user:用户表、角色表(role)、角色和权限对应表(role_id-rule_id)、权限表(rule));
④五表
不管是三表还是五表,原理都是一样的。

rbac有5个属性
分别是用户,角色,权限,用户角色关系(某个用户属于某个角色例如张三属于管理员角色或者属于普通用户角色),角色权限关系(某个角色对应的权限例如管理员角色拥有增删改查的权限而普通用户角色只有查的权限)


程序思路:
1、用户登录后通过用户的role_id 可以拿到所有的权限类别的id;
2、通过所有的权限列表的rule_id 可以将所有的权限列表信息取出来-》$ruleRows;
3、将取出的数据利用递归组装,方便放入导航栏中

 $ruleData = [];
 foreach ($ruleRows as $key => $ruleRow) {
      if ($ruleRow['parent_id'] == 0) {
          if (isset($ruleData[$ruleRow['id']])) {
              $ruleData[$ruleRow['id']] = array_merge($ruleData[$ruleRow['id']], $ruleRow);
          } else {
              $ruleData[$ruleRow['id']] = $ruleRow;
          }
      } else {
          $ruleData[$ruleRow['parent_id']]['sub'][$ruleRow['id']] = $ruleRow;
      }
  }
  return $ruleData;

三表:用户表(user)、角色表(role)、权限表(rule)


–用户表

CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(32) NOT NULL COMMENT ‘用户姓名’,
email varchar(100) NOT NULL COMMENT ‘用户邮件地址’,
password varchar(64) NOT NULL COMMENT ‘用户密码’,
role_id int(11) NOT NULL COMMENT ‘用户角色’,
status tinyint(5) NOT NULL COMMENT ‘是否启用’,
sex tinyint(5) NOT NULL DEFAULT ‘0’ COMMENT ‘0:保密 1:男 2:女’,
head varchar(150) DEFAULT NULL,
birthday date DEFAULT ‘1000-01-01’ COMMENT ‘生日’,
tel varchar(20) DEFAULT ”COMMENT ‘电话号码’,
create_time int(11) NOT NULL COMMENT ‘创建时间’,
update_time int(11) NOT NULL COMMENT ‘更新时间’,
PRIMARY KEY (id),
UNIQUE KEY email (email) USING BTREE,
KEY user_role_id(role_id),
CONSTRAINT user_role_id FOREIGN KEY (role_id) REFERENCES role (id) ON DELETE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT=’后台用户表’

– 角色表(用户组表)

drop table if exists `role`;
CREATE TABLE `role` (
  `role_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `role_name` varchar(20) NOT NULL COMMENT '角色/用户组名称',
  `role_rule_ids` varchar(128) NOT NULL DEFAULT '' COMMENT '权限ids,1,2,5,权限表中的主键集合',
  `role_rule_ac` text COMMENT 'Goods-showlist,Goods-add,控制器-操作,控制器-操作,控制器-操作',
  `create_time` int(11) NOT NULL COMMENT '创建时间',  
  `update_time` int(11) NOT NULL COMMENT '更新时间',  
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCRE

–权限表

CREATE TABLE rule (
id int(11) NOT NULL AUTO_INCREMENT,
parent_id int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘父菜单’,
name varchar(100) NOT NULL COMMENT ‘url地址 c+a’, (控制器/方法)
title varchar(100) NOT NULL COMMENT ‘菜单名称’,
icon varchar(100) DEFAULT NULL COMMENT ‘图标’,
islink tinyint(5) NOT NULL DEFAULT ‘0’ COMMENT ‘是否菜单’,
sortint(3) NOT NULL DEFAULT ‘255’ COMMENT ‘排序’,
PRIMARY KEY (id),
UNIQUE KEY rulename (name)
) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8mb4 COMMENT=’权限&菜单表

创建5张表


3张实体表分别是用户表,角色表,权限表

CREATE TABLE user (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL DEFAULT ” COMMENT ‘姓名’,
email varchar(30) NOT NULL DEFAULT ” COMMENT ‘邮箱’,
is_admin tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘是否是超级管理员 1表示是 0 表示不是’,
status tinyint(1) NOT NULL DEFAULT ‘1’ COMMENT ‘状态 1:有效 0:无效’,
updated_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘最后一次更新时间’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id),
KEY idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’用户表’;

CREATE TABLE role (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL DEFAULT ” COMMENT ‘角色名称’,
status tinyint(1) NOT NULL DEFAULT ‘1’ COMMENT ‘状态 1:有效 0:无效’,
updated_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘最后一次更新时间’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’角色表’;

CREATE TABLE access (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
title varchar(50) NOT NULL DEFAULT ” COMMENT ‘权限名称’,
urls varchar(1000) NOT NULL DEFAULT ” COMMENT ‘json 数组’,
status tinyint(1) NOT NULL DEFAULT ‘1’ COMMENT ‘状态 1:有效 0:无效’,
updated_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘最后一次更新时间’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’权限详情表’;

两张关系表分别是用户角色关系表,角色权限关系表。

CREATE TABLE user_role (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
uid int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘用户id’,
role_id int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘角色ID’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id),
KEY idx_uid (uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’用户角色表’;

CREATE TABLE role_access (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
role_id int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘角色id’,
access_id int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘权限id’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id),
KEY idx_role_id (role_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’角色权限表’;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值