基于RBAC权限管理

一般web系统操作人员多时都会需求权限管理,一来限制操作范围,二来限制数据公开度。

现在最流行的一个模式为 RBAC (Role-Based Access Control) 基于角色的访问控制。设定权限范围定义到角色中,然后再分配到每个用户。

这里仅以一般后台管理系统为例,叙说数据结构:

需求:

  1. 菜单需要针对不同部门使用不同的菜单结构。
  2. 权限项能精确到页面中某个内容或局部功能。

基本要求:没有权限的菜单,页面中内容或链接禁止显示。

表结构

CREATE TABLE `power_item` (
  `power_item_id` int UNSIGNED primary key auto_increment,
  `name` varchar(35) not null comment ‘权限项名称‘,
  `code` varchar(80) unique not null comment ‘权限项代码‘,
  `power_item_group_id` int unsigned not null comment ‘权限项组ID‘,
  `status` enum(‘disable‘,‘enable‘) NOT NULL DEFAULT ‘enable‘ COMMENT ‘启用或禁用,enable为启用‘,
  `comment` varchar(1000) not null default ‘‘ comment ‘备注说明‘,
  `created_at` int unsigned not null comment ‘创建时间‘,
  `updated_at` int unsigned not null comment ‘修改时间‘
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=‘权限项表‘;

CREATE TABLE `power_item_group` (
  `power_item_group_id` int UNSIGNED primary key auto_increment,
  `name` varchar(35) not null comment ‘权限项组名称‘,
  `comment` varchar(1000) not null default ‘‘ comment ‘备注说明‘,
  `created_at` int unsigned not null comment ‘创建时间‘,
  `updated_at` int unsigned not null comment ‘修改时间‘
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=‘权限项组表‘;

CREATE TABLE `power_role` (
  `power_role_id` int UNSIGNED primary key auto_increment,
  `name` varchar(35) not null comment ‘角色名‘,
  `status` enum(‘enable‘,‘disable‘) not null default ‘enable‘ comment ‘启用或禁用,enable为启用‘,
  `comment` varchar(1000) not null default ‘‘ comment ‘备注说明‘,
  `created_at` int unsigned not null comment ‘创建时间‘,
  `updated_at` int unsigned not null comment ‘修改时间‘
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=‘角色表‘;

CREATE TABLE `power_role_item` (
  `id` int UNSIGNED primary key auto_increment,
  `power_role_id` int unsigned not null comment ‘角色ID‘,
  `power_item_id` int unsigned not null comment ‘权限项ID‘,
   unique key role_item(power_role_id,power_item_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=‘角色与权限项关联表‘;

CREATE TABLE `power_role_admin` (
  `id` int UNSIGNED primary key auto_increment,
  `power_role_id` int unsigned not null comment ‘角色ID‘,
  `admin_id` int unsigned not null comment ‘管理员ID‘,
   unique key role_admin(power_role_id,admin_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=‘角色与管理员关联表‘;

CREATE TABLE `power_menu_group` (
  `power_menu_group_id` int UNSIGNED primary key auto_increment,
  `name` varchar(35) not null comment ‘菜单组名‘,
  `comment` varchar(1000) not null default ‘‘ comment ‘备注说明‘,
  `created_at` int unsigned not null comment ‘创建时间‘,
  `updated_at` int unsigned not null comment ‘修改时间‘
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=‘菜单组表‘;

CREATE TABLE `power_menu` (
  `power_menu_id` int UNSIGNED primary key auto_increment,
  `name` varchar(35) not null comment ‘菜单名‘,
  `url` varchar(60) not null comment ‘链接地址‘,
  `power_item_id` int unsigned not null default 0 comment ‘关联权限项ID‘,
  `comment` varchar(1000) not null default ‘‘ comment ‘备注说明‘,
  `created_at` int unsigned not null comment ‘创建时间‘,
  `updated_at` int unsigned not null comment ‘修改时间‘
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=‘菜单表‘;

CREATE TABLE `power_menu_level` (
  `id` int UNSIGNED primary key auto_increment,
  `power_menu_id` int unsigned not null default 0 comment ‘菜单ID‘,
  `power_menu_group_id` int unsigned not null default 0 comment ‘所属菜单组ID‘,
  `parent_id` int unsigned not null default 0 comment ‘上级层级ID‘,
  `sort` smallint unsigned not null default 0 comment ‘排序值,大到小‘,
  unique key menu_level(power_menu_id,power_menu_group_id,parent_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=‘菜单层级关联表‘;

关联关系图

对应关系

  1. 角色与权限项通过 power_role_item 表随意组合
  2. 角色与管理员通过 power_role_admin 表随意组合
  3. 菜单与菜单组通过 power_menu_level 表随意组合(包含菜单层级关系)

设计思想

角色只是划分范围或添加维度方便理解,实际使用中很多管理员扮演了多种角色,所以一个管理员允许同时拥有N个角色。

权限项相当于一把锁,程序在关键地方安装对应的锁,然后把这些锁的钥匙分配给不同的角色,所以权限项与角色之间是多对多关系,即一个权限项可以关联多个角色,而一个角色也可以关联多个权限项。

权限项组只是为了把众多的权限项进行简单的分组,以便角色在勾选权限项时能把权限项分组展示,比如,权限管理相关,会员管理相关,订单管理相关等,这样在勾选时会更容易操作。

菜单可以关联到对应的权限项,这样可以过滤掉没有权限的菜单显示,为了方便不同部门菜单结构不同的目的,额外添加了菜单层级与菜单组,这样一来,每个管理员只显示自己所在的菜单组的菜单结构,中间相对复杂点的就是菜单结构组合处理,power_menu_level 表中需要保存当前菜单,上级菜单,及菜单组,和排序。

备注说明

角色设计中弃用所谓的上级角色关系(即角色继承)感觉很高尚的设计,实际容易造成误解,误操作,程序复杂化等问题,比如继承会拥有上级权限那么对实际分配人员对角色的理解就不仅限于当前角色还得考虑上级角色否则容易造成权限分配过度,再者继承的权限在权限查询中存在着递归结构,复杂化判断程序,如果不继承权限那这个功能形同虚设,当然如果只是为了给角色分类,完全可以增加一个角色组表,进行区分。

菜单弃用了单一预定义好的结构,使用了可自定义的菜单结构,也只是为了满足不同部门菜单结构的需求,当前这块功能并非必需的,在实际应用中是可选的。

以上内容为个人观点或想法,如有不妥还请纠正或路过,后续如果有必要再抽时间把对应程序整理发布到github上。

时间: 2024-12-07 16:40:35

基于RBAC权限管理的相关文章

基于RBAC权限管理模型学习

在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限.这就极大地简化了权限的管理. 在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色.角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收. 角色与角色的关系可以建立起来以囊括更广泛的客观情况. BAC支持三个著名的安全原则:最小权限原则,责任分离原则和数据抽象原则. (1)最小权限原则之所以被RBAC所支持,是因

vue基于d2-admin的RBAC权限管理解决方案

前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-admin的结构和代码是让我感到最舒服的,而且基于d2-admin实现RBAC权限管理也很方便,对d2-admin没有大的侵入性的改动. 预览地址 Github 相关概念 不了解RBAC,可以看这里企业管理系统前后端分离架构设计 系列一 权限模型篇 实现了RBAC模型权限控制 菜单与路由独立管理,完全

RBAC权限管理

RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限. 这样,就构造成“用户-角色-权限”的授权模型.在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系.(如下图) 角色是什么?可以理解为一定数量的权限的集合,权限的载体.例如:一个论坛系统,“超级管理员”.“版主”都是角色.版主可管理版内的帖子.可管理版内的用户等,这些是权限.要给某个用户授予这些权限,不需要直接

使用SpringSecurity3实现RBAC权限管理

1. What? 什么是权限管理? 具体可参见百度:http://baike.baidu.com/view/2108713.htm 名词备注: 数据级权限:百科内的权限管理一文解释的比较不错,但其中的"数据级权限"有的人看来会觉得有点摸不着头脑.数据级权限,即表示权限与特定数据有联系的权限,比方说,某用户只能创建100个用户.这个100,就是数据级权限的一个指标. 2. How?怎么样实现权限管理? 2.1.一种烦恼 也许很多程序员会在权限管理中遇到这样的一个问题. 大部分项目都需要权

基于Django实现RBAC权限管理

概述 RBAC(Role-Based Access Control,基于角色的访问控制),通过角色绑定权限,然后给用户划分角色.在web应用中,可以将权限理解为url,一个权限对应一个url. 在实际应用中,url是依附在菜单下的,比如一个简单的生产企业管理系统,菜单可以大致分为以下几块:制造.资材.生产管理.人事.财务等等.每个菜单下又可以有子菜单,但最终都会指向一个url,点击这个url,通过Django路由系统执行一个视图函数,来完成某种操作.这里,制造部的员工登录系统后,肯定不能点击财务

【基于url权限管理 shiro(一)】--基础

只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.权限管理包括用户认证和授权两部分.   用户认证 1.概念 用户认证,用户去访问系统,系统要验证用户身份的合法性.最常用的用户身份验证的方法:1.用户名密码方式.2.指纹打卡机.3.基于证书验证方法..系统验证用户身份合法,用户方可访问系统的资源. 2.用户认证流程   3.关键对象 subject:主体,理解为用户,可能是程序,都要去访问系统的资源,系

shiro教程(1)-基于url权限管理

shiro教程系列 shiro教程(2) shiro教程(3) shiro教程(4) 一. 权限管理 1.1 什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理包括用户身份认证和授权两部分,简称认证授权.对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问. 1.2 用户身份认证 1.2.1 概念 身份认证,就是

【转】RBAC权限管理

RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授权模型.在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系.(如下图) 角色是什么?可以理解为一定数量的权限的集合,权限的载体.例如:一个论坛系统,“超级管理员”.“版主”都是角色.版主可管理版内的帖子.可管理版内的用户等,这些是权限.要给某个用户授予这些权限,不需要直接将

ThinkPHP RBAC权限管理机制

RBAC是ThinkPHP很好用的后台权限管理的,话不多说,实现方法如下,也方便以后自己查询使用: 1.新建4个数据库表 self_role权限表 CREATE TABLE `self_role` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `pid` smallint(6) DEFAULT NULL, `status` tinyint(1) unsigned DEFAULT