RBAC在现在的系统中依然是常用权限控制,有必要掌握
本文地址http://yangjianyong.cn/?p=171转载无需经过作者本人授权
什么是RBAC
RBAC。英文名称Role-Based Access Control。顾名思义,就是基于角色的权限控制系统。理解的基本思路就是,在角色的前提下,按照角色不同将权限分配到对应的角色,再将管理员设置成对应的角色,进而管理员获得权限。在管理员请求某个业务权限的时候,从数据库中查询该管理员所拥有的权限,并将请求的业务权限跟数据库比对。以此进行权限控制
实现思路
RBAC通常是通过数据库来实现的。也就是说将权限的数据保存在数据库中,然后在请求时拿出来进行比对
在设计RBAC的时候有以下几张权限表:
admin
管理员表
role
管理员表就是用来保存该系统中需要有的管理员。比如用户管理员、财务管理员、运维人员等等
role
角色表
role
角色表就是用来保存该系统中需要用到的角色。比如用户管理角色、财务管理角色、运维角色
permission
权限表
permission
权限表就是用来保存整套系统中表示权限请求的入口。在常见的开发中就是API接口或者URI地址。就是用来保存整套系统中对外暴露业务操作的接口
role_permission
角色权限关联表
role_permission
角色关联表就是用来保存各个不同角色所拥有的权限
role_admin
角色管理员关联表
role_admin
角色管理员关联表就是用来保存管理员所属哪个角色的
menu
菜单表
menu
这个菜单表其实从RBAC的角度出发,并不需要这个表。这个表只是从业务的层面的来表示的,并不是真正意义上权限的逻辑控制。很多时候很多开发人员把menu
表等同于role
表,从RBAC的角度来理解其实并不正确
表结构
admin
管理员表结构
#code start
CREATE TABLE `backend_admin` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`username` varchar(255) DEFAULT '' COMMENT '用户名',
`password` varchar(255) DEFAULT '' COMMENT '密码',
`register_time` int(11) DEFAULT '0' COMMENT '注册时间',
`update_time` int(11) DEFAULT '0' COMMENT '更新时间',
`status` tinyint(1) DEFAULT '1' COMMENT '账户状态0=禁用1=正常',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理员表';
#code end
role
角色表结构
#code start
CREATE TABLE `rbac_role` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`role_name` varchar(255) DEFAULT '' COMMENT '角色名称',
`status` tinyint(1) DEFAULT '1' COMMENT '角色状态0=禁用1=启用',
`create_time` int(11) DEFAULT '0' COMMENT '添加时间',
`update_time` int(11) DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色表';
#code end
permission
权限表结构
#code start
CREATE TABLE `rbac_permission` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`permission_name` varchar(255) DEFAULT '' COMMENT '权限名称',
`route_controller` varchar(255) DEFAULT '' COMMENT '控制器',
`route_action` varchar(255) DEFAULT '' COMMENT '执行动作',
`parent_id` int(11) DEFAULT '0' COMMENT '父级id',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态0=禁用1=启用',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='权限表';
#code end
role_permission
角色权限关联表结构
#code start
CREATE TABLE `rbac_permission_role` (
`permission_id` int(11) DEFAULT '0' COMMENT '权限id',
`role_id` int(11) DEFAULT '0' COMMENT '角色id'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色权限关联表';
#code end
role_admin
角色管理员关联表结构
#code start
CREATE TABLE `rbac_admin_role` (
`role_id` int(11) DEFAULT '0' COMMENT '角色id',
`admin_id` int(11) DEFAULT '0' COMMENT '管理员id'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色管理员关联表';
#code end
menu
菜单表结构
#code start
CREATE TABLE `rbac_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`menu_name` varchar(255) DEFAULT '' COMMENT '菜单名称',
`visible` tinyint(1) DEFAULT '1' COMMENT '是否可见0=不可见1=可见',
`parent_id` int(11) DEFAULT '0' COMMENT '父级id',
`status` tinyint(1) DEFAULT '1' COMMENT '状态0=可用1=不可用',
`admin_id` int(11) NOT NULL DEFAULT '0' COMMENT '管理员id',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
`permission_id` int(11) DEFAULT '0' COMMENT '权限id',
`icon` varchar(255) DEFAULT '' COMMENT '图标',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='菜单表';
#code end