RBAC的权限设计模型
权限系统设计模型分析(DAC,MAC,RBAC,ABAC)

权限系统设计模型分析(DAC,MAC,RBAC,ABAC)此篇⽂章主要尝试将世⾯上现有的⼀些权限系统设计做⼀下简单的总结分析,个⼈⽔平有限,如有错误请不吝指出。
术语这⾥对后⾯会⽤到的词汇做⼀个说明,⽼司机请直接翻到常见设计模式。
⽤户发起操作的主体。
对象(Subject)指操作所针对的客体对象,⽐如订单数据或图⽚⽂件。
权限控制表 (ACL: Access Control List)⽤来描述权限规则或⽤户和权限之间关系的数据表。
权限 (Permission)⽤来指代对某种对象的某⼀种操作,例如“添加⽂章的操作”。
权限标识权限的代号,例如⽤“ARTICLE_ADD”来指代“添加⽂章的操作”权限。
常见设计模式⾃主访问控制(DAC: Discretionary Access Control)系统会识别⽤户,然后根据被操作对象(Subject)的权限控制列表(ACL: Access Control List)或者权限控制矩阵(ACL: Access Control Matrix)的信息来决定⽤户的是否能对其进⾏哪些操作,例如读取或修改。
⽽拥有对象权限的⽤户,⼜可以将该对象的权限分配给其他⽤户,所以称之为“⾃主(Discretionary)”控制。
这种设计最常见的应⽤就是⽂件系统的权限设计,如微软的NTFS。
DAC最⼤缺陷就是对权限控制⽐较分散,不便于管理,⽐如⽆法简单地将⼀组⽂件设置统⼀的权限开放给指定的⼀群⽤户。
Windows的⽂件权限强制访问控制(MAC: Mandatory Access Control)MAC是为了弥补DAC权限控制过于分散的问题⽽诞⽣的。
在MAC的设计中,每⼀个对象都都有⼀些权限标识,每个⽤户同样也会有⼀些权限标识,⽽⽤户能否对该对象进⾏操作取决于双⽅的权限标识的关系,这个限制判断通常是由系统硬性限制的。
⽐如在影视作品中我们经常能看到特⼯在查询机密⽂件时,屏幕提⽰需要“⽆法访问,需要⼀级安全许可”,这个例⼦中,⽂件上就有“⼀级安全许可”的权限标识,⽽⽤户并不具有。
RBAC

基于角色访问控制RBAC1 RBAC模式介绍RBAC的基本思想是在用户和访问权限之间引入角色的概念,将用户和角色联系起来,通过对角色的授权来控制用户对系统资源的访问。
角色是访问权限的集合,用户通过赋予不同的角色获得角色所拥有的访问权限。
一个用户可拥有多个角色,一个角色可授权给多个用户;一个角色可包含多个权限,一个权限可被多个角色包含。
用户通过角色享有权限,它不直接与权限相关联,权限对存取对象的操作许可是通过角色实现的。
2 NIST标准RBAC的4种部件模型NIST(The National Institute of Standards and Technology,美国国家标准与技术研究院)标准RBAC模型由4个部件模型组成:1.基本模型RBAC0(Core RBAC)2.角色分级模型RBAC1(Hierarchal RBAC)3.角色限制模型RBAC2(Constraint RBAC)4.统一模型RBAC3(Combines RBAC)1. 基本模型RBAC0RBAC0定义了能构成一个RBAC控制系统的最小的元素集合。
在RBAC 之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素,此模型指明用户、角色、访问权限和会话之间的关系。
每个角色至少具备一个权限,每个用户至少扮演一个角色;可以对两个完全不同的角色分配完全相同的访问权限;会话由用户控制,一个用户可以创建会话并激活多个用户角色,从而获取相应的访问权限,用户可以在会话中更改激活角色,并且用户可以主动结束一个会话。
2.角色分级模型RBAC1RBAC1引入角色间的继承关系,角色间的继承关系可分为一般继承关系和受限继承关系。
一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。
而受限继承关系则进一步要求角色继承关系是一个树结构,实现角色间的单继承。
基于RBAC模型的权限管理系统设计

基于RBAC模型的权限管理系统设计权限管理系统是现代信息管理系统极为重要的组成部分,其主要任务在于对系统中各个用户的权限进行管理,保障系统的安全性和稳定性,同时保证用户数据的隐私和保密性。
而基于rbac模型的权限管理系统,是目前被广泛采用的权限管理技术之一,其具有权限灵活、易于维护等优点,在具体的实现过程中也面临着一些问题。
本篇文章将会结合实例,对基于rbac模型的权限管理系统进行设计和探讨。
一、rbac模型的基本概念rbac模型,即基于角色的访问控制(Role-Based Access Control),其是一个灵活且易于维护的权限控制模型。
该模型主要由角色、用户、权限和访问控制的策略几部分组成,其中角色是rbac模型的核心概念,通过角色的授予和收回,来实现对用户权限的管理。
rbac模型的安全策略可以描述为:一个用户只能执行已被授权给他的角色所允许的操作,任何用户均不能超越其权限范围所赋予的功能和任务的边界。
具体而言,rbac模型主要包括以下几个基本概念:1. 用户(User):指系统中执行任务的实体,需要进行权限控制;2. 角色(Role):权限的集合,具有相同权限的用户集合,每个用户可以拥有多个角色;3. 权限(Permission):系统中的功能、资源、操作等,需要设置相应的权限控制;4. 授权(Authorization):将用户赋予相应角色以获取特定权限的过程;5. 会话(Session):用户与系统进行交互的时间段,系统应在这个时间段内有效地控制用户访问权限。
二、rbac模型的优点和实现方式rbac模型相对于其他权限管理模型,具有如下优点:1. 集中化管理:通过对角色和权限进行集中管理,可以实现系统的动态管理和维护;2. 适应性强:对于各种企业的权限管理需求,尤其是大规模集成的企业环境,应用rbac能够很好地适应变化;3. 灵活性高:通过管理角色、权限和用户之间的映射关系,实现了权限的灵活控制;4. 安全性好:通过一系列的访问控制策略(如分级权限、非法访问限制等),确保系统信息的安全性和保密性。
基于RBAC模型的权限管理系统的设计和实现

基于RBAC模型的权限管理系统的设计和实现RBAC(Role-Based Access Control)模型是一种常见的权限管理模型,它根据用户的角色来控制其访问系统资源的权限。
下面将详细介绍基于RBAC模型的权限管理系统的设计和实现。
权限管理系统是一种用于控制用户对系统资源进行访问的系统。
它通过定义角色、权限和用户的关系,实现了对用户的访问进行控制和管理。
基于RBAC模型的权限管理系统可以提供更加灵活和安全的权限控制机制。
首先,需要设计和构建角色,角色是对用户进行权限管理的一种方式。
可以将用户划分为不同的角色,每个角色具有一组特定的权限。
例如,一个网站的角色可以包括管理员、用户、访客等。
然后,定义角色与权限之间的关系。
一个角色可以具有多个权限,一个权限可以被多个角色具有,这种关系通常是多对多的。
可以使用关联表来表示角色和权限之间的对应关系,关联表中存储了角色ID和权限ID的对应关系。
接下来,需要创建用户,并将用户与角色进行关联。
用户是系统中的具体实体,每个用户可以拥有一个或多个角色。
通过将用户与角色关联,可以根据用户的角色来判断其具有的权限。
最后,实现权限的验证和控制。
在用户访问系统资源时,系统需要验证该用户是否具有访问该资源的权限。
可以通过在系统中添加访问控制的逻辑来实现权限的验证和控制。
例如,在网站中,可以通过添加访问控制列表(ACL)来限制用户访问一些页面或功能。
1.灵活性:RBAC模型允许根据不同的需求进行灵活的权限控制和管理。
2.可扩展性:可以根据系统的需求轻松地添加新的角色和权限。
3.安全性:通过对用户的访问进行控制和管理,可以提高系统的安全性,防止未授权的用户访问系统资源。
在实现权限管理系统时,需要考虑以下几个方面:1.用户界面:需要设计一个用户友好的界面,使用户能够轻松地管理和配置角色和权限。
2.数据库设计:需要设计合适的数据结构来存储角色、权限和用户之间的关系。
3.访问控制逻辑:需要实现权限的验证和控制的逻辑,确保只有具有相应权限的用户才能访问系统资源。
B端权限规则模型:RBAC模型

B端权限规则模型:RBAC模型导读:B端项目上,需要设计实现一个权限管理模块,就要知道到一个很重要的RBAC模型,所以整理总结了RBAC的一些知识。
目前,使用最普遍的权限管理模型正是RBAC(Role-Based Access Control)模型,这篇文章主要是介绍基于RBAC 的权限管理系统,将会从RBAC是什么、如何设计RBAC两部分来介绍。
一、RBAC模型是什么?1. RBAC模型概述RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是20世纪90年代研究出来的一种新模型,但其实在20世纪70年代的多用户计算时期,这种思想就已经被提出来,直到20世纪90年代中后期,RBAC才在研究团体中得到一些重视,并先后提出了许多类型的RBAC模型。
其中以美国George Mason大学信息安全技术实验室(LIST)提出的RBAC96模型最具有代表,并得到了普遍的公认。
RBAC认为权限授权的过程可以抽象地概括为:Who是否可以对What进行How 的访问操作,并对这个逻辑表达式进行判断是否为True的求解过程,也即是将权限问题转换为What、How的问题,Who、What、How构成了访问权限三元组,具体的理论可以去调查RBAC96的研究文件,这里就不做详细的展开介绍,让大家有个了解和即可。
2. RBAC的组成在RBAC模型里面,有3个基础组成部分,分别是:用户、角色和权限。
RBAC通过定义角色的权限,并对用户授予某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型),极大地方便了权限的管理。
下面在讲解之前,先介绍一些名词:User(用户):每个用户都有唯一的UID识别,并被授予不同的角色Role(角色):不同角色具有不同的权限Permission(权限):访问权限用户-角色映射:用户和角色之间的映射关系角色-权限映射:角色和权限之间的映射它们之间的关系如下图所示:例如下图,管理员和普通用户被授予不同的权限,普通用户只能去修改和查看个人信息,而不能创建创建用户和冻结用户,而管理员由于被授予所有权限,所以可以做所有操作。
RBAC权限管理系统数据模型

RBAC权限管理系统数据模型懒得多写了,懂的看建表脚本就懂了。
-- ------------------------------ Table structure for ucb_user-- ----------------------------DROP TABLE IF EXISTS ucb_user;CREATE TABLE ucb_user (id char(32) NOT NULL COMMENT '主键(UUID)',user_type tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '⽤户类型:0、未定义;1、内部⽤户;2、合作⽅⽤户;3、外部⽤户', source tinyint(3) DEFAULT '0' COMMENT '来源',code varchar(8) DEFAULT NULL COMMENT '⽤户编码',name varchar(64) NOT NULL COMMENT '名称',account varchar(64) NOT NULL COMMENT '登录账号',mobile varchar(32) DEFAULT NULL COMMENT '⼿机号',email varchar(64) DEFAULT NULL COMMENT '电⼦邮箱',union_id varchar(128) DEFAULT NULL COMMENT '微信UnionID',password varchar(256) NOT NULL DEFAULT 'e10adc3949ba59abbe56e057f20f883e' COMMENT '密码(RSA加密)',paypw char(32) DEFAULT NULL COMMENT '⽀付密码(MD5)',head_img varchar(256) DEFAULT NULL COMMENT '⽤户头像',remark varchar(256) DEFAULT NULL COMMENT '备注',setting json DEFAULT NULL COMMENT '配置信息',invite_code varchar(32) DEFAULT NULL COMMENT '邀请码',inviter varchar(64) DEFAULT NULL COMMENT '邀请⼈',inviter_id char(32) DEFAULT NULL COMMENT '邀请⼈ID',is_builtin bit(1) NOT NULL DEFAULT b'0' COMMENT '是否内置:0、⾮内置;1、内置',is_invalid bit(1) NOT NULL DEFAULT b'0' COMMENT '是否失效:0、有效;1、失效',creator varchar(64) NOT NULL COMMENT '创建⼈',creator_id char(32) NOT NULL COMMENT '创建⼈ID',created_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id) USING BTREE,KEY idx_ucb_user_code (code) USING BTREE,KEY idx_ucb_user_invite_code (invite_code) USING BTREE,UNIQUE KEY idx_ucb_user_account (account) USING BTREE,UNIQUE KEY idx_ucb_user_mobile (mobile) USING BTREE,UNIQUE KEY idx_ucb_user_email (email) USING BTREE,UNIQUE KEY idx_ucb_user_union_id (union_id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='⽤户表';-- ------------------------------ Table structure for ucg_group-- ----------------------------DROP TABLE IF EXISTS ucg_group;CREATE TABLE ucg_group (id char(32) NOT NULL COMMENT '主键(UUID)',name varchar(64) NOT NULL COMMENT '名称',remark varchar(256) DEFAULT NULL COMMENT '备注',is_builtin bit(1) NOT NULL DEFAULT b'0' COMMENT '是否内置:0、⾮内置;1、内置',creator varchar(64) NOT NULL COMMENT '创建⼈',creator_id char(32) NOT NULL COMMENT '创建⼈ID',created_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id) USING BTREE,KEY idx_ucg_group_tenant_id (tenant_id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='⽤户组表';-- ------------------------------ Table structure for ucg_group_member-- ----------------------------DROP TABLE IF EXISTS ucg_group_member;CREATE TABLE ucg_group_member (id char(32) NOT NULL COMMENT '主键(UUID)',group_id char(32) NOT NULL COMMENT '⽤户组ID',user_id char(32) NOT NULL COMMENT '⽤户ID',PRIMARY KEY (id) USING BTREE,KEY idx_ucg_group_member_group_id (group_id) USING BTREE,KEY idx_ucg_group_member_user_id (user_id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='⽤户组成员表';-- ------------------------------ Table structure for uco_org-- ----------------------------DROP TABLE IF EXISTS uco_org;CREATE TABLE uco_org (id char(32) NOT NULL COMMENT '主键(UUID)',parent_id char(32) DEFAULT NULL COMMENT '⽗级ID',node_type tinyint(3) unsigned DEFAULT NULL COMMENT '节点类型:0、机构;1、部门;2、职位',index tinyint(3) unsigned NOT NULL COMMENT '序号',code varchar(8) DEFAULT NULL COMMENT '编码',name varchar(64) NOT NULL COMMENT '名称',alias varchar(64) DEFAULT NULL COMMENT '简称',full_name varchar(128) DEFAULT NULL COMMENT '全称',is_invalid bit(1) NOT NULL DEFAULT b'0' COMMENT '是否失效:0、有效;1、失效',creator varchar(64) NOT NULL COMMENT '创建⼈',creator_id char(32) NOT NULL COMMENT '创建⼈ID',created_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id) USING BTREE,UNIQUE KEY idx_uco_org_code (code) USING BTREE,KEY idx_uco_org_tenant_id (tenant_id) USING BTREE,KEY idx_uco_org_parent_id (parent_id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='组织机构表';-- ------------------------------ Table structure for uco_org_member-- ----------------------------DROP TABLE IF EXISTS uco_org_member;CREATE TABLE uco_org_member (id char(32) NOT NULL COMMENT '主键(UUID)',org_id char(32) NOT NULL COMMENT '职位ID(组织机构表ID)',user_id char(32) NOT NULL COMMENT '⽤户ID(⽤户表ID)',PRIMARY KEY (id) USING BTREE,KEY idx_uco_org_member_org_id (org_id) USING BTREE,KEY idx_uco_org_member_user_id (user_id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='职位成员表';-- ------------------------------ Table structure for ucs_application-- ----------------------------DROP TABLE IF EXISTS ucs_application;CREATE TABLE ucs_application (id char(32) NOT NULL COMMENT '主键(UUID)',index int(11) unsigned NOT NULL COMMENT '序号',name varchar(64) NOT NULL COMMENT '应⽤名称',alias varchar(64) NOT NULL COMMENT '应⽤简称',icon varchar(128) DEFAULT NULL COMMENT '应⽤图标',host varchar(128) DEFAULT NULL COMMENT '应⽤域名',token_life int(10) unsigned NOT NULL DEFAULT '24' COMMENT '令牌⽣命周期(毫秒)',is_signin_one bit(1) NOT NULL DEFAULT b'0' COMMENT '是否单点登录:0、允许多点;1、单点登录',is_auto_refresh bit(1) NOT NULL DEFAULT b'0' COMMENT '是否⾃动刷新:0、⼿动刷新;1、⾃动刷新()', creator varchar(64) NOT NULL COMMENT '创建⼈',creator_id char(32) NOT NULL COMMENT '创建⽤户ID',created_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='应⽤表';-- ------------------------------ Table structure for ucs_navigator-- ----------------------------DROP TABLE IF EXISTS ucs_navigator;CREATE TABLE ucs_navigator (id char(32) NOT NULL COMMENT '主键(UUID)',parent_id char(32) DEFAULT NULL COMMENT '⽗级导航ID',app_id char(32) NOT NULL COMMENT '应⽤ID',type tinyint(3) unsigned NOT NULL COMMENT '导航级别',index int(11) unsigned NOT NULL COMMENT '序号',name varchar(64) NOT NULL COMMENT '名称',icon varchar(128) DEFAULT NULL COMMENT '图标Url',url varchar(128) DEFAULT NULL COMMENT '模块/页⾯Url',remark varchar(256) DEFAULT NULL COMMENT '备注',creator varchar(64) NOT NULL COMMENT '创建⼈',creator_id char(32) NOT NULL COMMENT '创建⽤户ID',created_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id) USING BTREE,KEY idx_ucs_navigator_app_id (app_id) USING BTREE,KEY idx_ucs_navigator_parent_id (parent_id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='导航表';-- ------------------------------ Table structure for ucs_function-- ----------------------------DROP TABLE IF EXISTS ucs_function;CREATE TABLE ucs_function (id char(32) NOT NULL COMMENT '主键(UUID)',nav_id char(32) NOT NULL COMMENT '导航(末级模块)ID',type tinyint(3) unsigned NOT NULL COMMENT '功能类型 0:全局功能;1:数据项功能;2:其他功能',code varchar(16) DEFAULT NULL COMMENT '代码',index int(11) unsigned NOT NULL COMMENT '序号',name varchar(64) NOT NULL COMMENT '名称',alias varchar(64) DEFAULT NULL COMMENT '别名',icon varchar(128) DEFAULT NULL COMMENT '图标Url',url varchar(128) DEFAULT NULL COMMENT '功能URL',interfaces varchar(512) DEFAULT NULL COMMENT '接⼝URL,功能对应多个URL以逗号分隔(不含域名及端⼝号)', remark varchar(256) DEFAULT NULL COMMENT '备注',begin_group bit(1) NOT NULL DEFAULT b'0' COMMENT '是否开始分组',hide_text bit(1) NOT NULL DEFAULT b'0' COMMENT '是否隐藏⽂字',is_invisible bit(1) NOT NULL DEFAULT b'0' COMMENT '是否不可见:0、可见;1、不可见',creator_id char(32) NOT NULL COMMENT '创建⽤户ID',created_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id) USING BTREE,KEY idx_ucs_function_nav_id (nav_id) USING BTREE,KEY idx_ucs_function_alias (alias) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='功能表';-- ------------------------------ Table structure for ucr_config-- ----------------------------DROP TABLE IF EXISTS ucr_config;CREATE TABLE ucr_config (id char(32) NOT NULL COMMENT '主键(UUID)',data_type int(3) unsigned NOT NULL COMMENT '类型:0、⽆归属;1、仅本⼈;2、仅本部门;3、部门所有;4、机构所有', name varchar(32) NOT NULL COMMENT '名称',PRIMARY KEY (id) USING BTREE,KEY idx_ucr_role_data_permit_data_type (data_type) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='数据配置表';-- ------------------------------ Table structure for ucr_role-- ----------------------------DROP TABLE IF EXISTS ucr_role;CREATE TABLE ucr_role (id char(32) NOT NULL COMMENT '主键(UUID)',app_id char(32) DEFAULT NULL COMMENT '应⽤ID,如不为空则该⾓⾊为应⽤专有',name varchar(64) NOT NULL COMMENT '名称',remark varchar(256) DEFAULT NULL COMMENT '备注',is_builtin bit(1) NOT NULL DEFAULT b'0' COMMENT '是否内置:0、⾮内置;1、内置',creator varchar(64) NOT NULL COMMENT '创建⼈',creator_id char(32) NOT NULL COMMENT '创建⼈ID',created_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id) USING BTREE,KEY idx_ucr_role_tenant_id (tenant_id) USING BTREE,KEY idx_ucr_role_app_id (app_id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='⾓⾊表';-- ------------------------------ Table structure for ucr_role_func_permit-- ----------------------------DROP TABLE IF EXISTS ucr_role_func_permit;CREATE TABLE ucr_role_func_permit (id char(32) NOT NULL COMMENT '主键(UUID)',role_id char(32) NOT NULL COMMENT '⾓⾊ID',function_id char(32) NOT NULL COMMENT '功能ID',permit bit(1) NOT NULL DEFAULT b'0' COMMENT '授权类型:0、拒绝;1、允许',creator varchar(64) NOT NULL COMMENT '创建⼈',creator_id char(32) NOT NULL COMMENT '创建⼈ID',created_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id) USING BTREE,KEY idx_ucr_role_func_permit_role_id (role_id) USING BTREE,KEY idx_ucr_role_func_permit_function_id (function_id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='⾓⾊功能权限表';-- ------------------------------ Table structure for ucr_role_data_permit-- ----------------------------DROP TABLE IF EXISTS ucr_role_data_permit;CREATE TABLE ucr_role_data_permit (id char(32) NOT NULL COMMENT '主键(UUID)',role_id char(32) NOT NULL COMMENT '⾓⾊ID',module_id char(32) NOT NULL COMMENT '业务模块ID',mode int(3) unsigned NOT NULL COMMENT '授权模式:0、相对模式;1、⽤户模式;2、部门模式',owner_id char(32) NOT NULL COMMENT '数据所有者ID,相对模式下为模式ID',permit bit(1) NOT NULL DEFAULT b'0' COMMENT '授权类型:0、只读;1、读写',creator varchar(64) NOT NULL COMMENT '创建⼈',creator_id char(32) NOT NULL COMMENT '创建⼈ID',created_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',PRIMARY KEY (id) USING BTREE,KEY idx_ucr_role_data_permit_role_id (role_id) USING BTREE,KEY idx_ucr_role_data_permit_module_id (module_id) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='⾓⾊数据权限表';。
利用RBAC模型实现一个通用的权限管理系统

利⽤RBAC模型实现⼀个通⽤的权限管理系统本⽂主要描述⼀个通⽤的权限系统实现思路与过程。
也是对此次制作权限管理模块的总结。
制作此系统的初衷是为了让这个权限系统得以“通⽤”。
就是⽣产⼀个web系统通过调⽤这个权限系统(⽣成的dll⽂件),就可以实现权限管理。
这个权限系统会管理已⽣产系统的所有⽤户,菜单,操作项,⾓⾊分配,权限分配,⽇志等内容。
实现此功能从正常访问和⾮法访问两个⽅⾯⼊⼿。
正常访问即⽤户登录系统后只能看到或操作⾃⼰拥有的菜单;⾮法访问即通过拼写url等途径访问系统的某个功能;所以程序除了实现⽤户登录后获取⽤户拥有的菜单权限,更要挡住⽤户的⾮法请求。
两者缺⼀不可。
⼀.概念 实现这个功能主要利⽤RBAC权限设计模型,英⽂(Role-Based Access Control)译为基于⾓⾊的权限管理⼜叫基于⾓⾊的访问控制。
⼆.数据库设计1.系统表:因为要达到"通⽤",所以这个表会记录各个系统。
其他⽤户、菜单、操作、权限表每条记录都会对应系统代码。
字段说明:Code —> 系统标识代码SysName —> 系统名称2.菜单表:记录菜单。
每个功能当成⼀个菜单,菜单有url属性,⽤户通过点击菜单来访问对应功能;字段说明:ID —> 主键,⾃增标识MenuName —> 菜单名称 PageUrl —> 菜单对应url PId —> 菜单⽗级Id Lv —> 菜单等级,分⼀级菜单和⼆级菜单ControllerAction —> 菜单唯⼀标识,⽤来做权限控制SystemCode —> 系统标识代码3.操作表:此表主要是为了判断⽤户是否有来操作某个具体功能,如常⽤的【删除】功能等操作都放在这个表⾥;字段说明:ID —> 主键,⾃增标识OprateName —> 操作名称 OperateCode —> 操作标识代码SystemCode —> 系统标识代码4.⽤户表:记录所有系统的使⽤⽤户。
RBAC用户角色权限设计方案

RBAC用户角色权限设计方案RBAC(Role-Based Access Control)是一种用于控制用户访问权限的设计模型。
在RBAC中,用户角色是中心,权限被分配给角色,而不是直接分配给用户。
通过这种方式,可以简化访问控制管理,并且使权限变得更加灵活。
在设计一个RBAC的用户角色权限方案时,通常需要进行以下步骤:1.确定需要管理的权限范围:首先,需要明确哪些权限需要进行管理。
可以通过对系统进行分析,确定系统中的各种操作、功能和资源,并明确它们的访问权限。
3.确定角色权限:为每个角色定义相应的权限。
这可以通过将操作、功能和资源与角色关联来实现。
可以使用权限矩阵或其他文档形式来记录和管理角色的权限。
角色的权限应该与其所代表的职责和业务需求相匹配。
4.分配用户角色:将角色分配给用户。
在这一步骤中,需要考虑用户的职责和业务需求,以确定应该分配给该用户的角色。
用户可以拥有一个或多个角色,根据其在系统中的职责和权限需求。
5.定义角色继承关系:确定角色之间的继承关系。
这意味着一个角色可以继承其他角色的权限。
这种继承关系可以简化权限管理,并避免为每个角色都分配相同的权限。
继承关系可以通过将一个角色指定为另一个角色的父角色来实现。
7.定期进行权限审查:RBAC系统的权限会随着时间的推移而变化。
因此,需要定期审查角色和权限,以确保它们与业务需求保持一致。
可以通过与系统管理员、业务用户和安全专家进行合作来进行审查。
1.职责分离:角色应该基于职责进行定义,以确保用户只能访问他们所需要的权限。
这样可以降低权限滥用和错误配置的风险。
2.需求分析:在定义角色和权限之前,需要进行业务需求分析。
这将有助于确定每个角色应该具有哪些权限,以及角色之间的关系。
3.继承关系:角色之间的继承关系可以简化权限管理。
通过将一些角色指定为另一个角色的父角色,可以使子角色继承父角色的权限。
4.灵活性和可扩展性:设计RBAC系统时,应该具有足够的灵活性和可扩展性,以应对将来可能出现的新需求和变化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于RBAC的权限设计模型权限分析文档基于RBAC的权限设计模型:1RBAC介绍RBAC模型作为目前最为广泛接受的权限模型。
NIST(The National Institute of Standards and Technology,美国国家标准与技术研究院)标准RBAC模型由4个部件模型组成,这4个部件模型分别是基本模型RBAC0(Core RBAC)、角色分级模型RBAC1(Hierarchal RBAC)、角色限制模型RBAC2(Constraint RBAC)和统一模型RBAC3(Combines RBAC)[1]。
RBAC0模型如图1所示。
图表 1 RBAC 0模型RBAC0定义了能构成一个RBAC控制系统的最小的元素集合在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素,权限被赋予角色,而不是用户,当一个角色被指定给一个用户时,此用户就拥有了该角色所包含的权限。
会话sessions是用户与激活的角色集合之间的映射。
RBAC0与传统访问控制的差别在于增加一层间接性带来了灵活性,RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展。
l RBAC1引入角色间的继承关系角色间的继承关系可分为一般继承关系和受限继承关系。
一般继承关系仅要求角色继承关系是一个绝对偏序关系,允许角色间的多继承。
而受限继承关系则进一步要求角色继承关系是一个树结构。
l RBAC2模型中添加了责任分离关系RBAC2的约束规定了权限被赋予角色时,或角色被赋予用户时,以及当用户在某一时刻激活一个角色时所应遵循的强制性规则。
责任分离包括静态责任分离和动态责任分离。
约束与用户-角色-权限关系一起决定了RBAC2模型中用户的访问许可。
l RBAC3包含了RBAC1和RBAC2既提供了角色间的继承关系,又提供了责任分离关系。
建立角色定义表。
定出当前系统中角色。
因为有继承的问题,所以角色体现出的是一个树形结构。
2权限设计:配置资源以及资源的操作:这里资源可以定义为一个通用的资源模型。
提供通用的资源统一接口。
数据库ER 图:关系图:3分析:根据以上的类关系图和ER图可以看出。
整个权限可以抽象为五个对象组成。
OrgBean : 用于描述org模型。
Role :用于描述角色。
Permission :用于描述权限。
Resource :用于描述资源。
Operation :用于描述操作。
其中Permission中有Resource , Operation 的聚合,资源和操作组成权限。
Role 和Permission 都有自包含。
因为设计到权限的继承。
资源Resource 也可能出现一颗树形结构,那资源也要有自包含。
思想:权限系统的核心由以下三部分构成:1.创造权限, 2.分配权限,3.使用权限,然后,系统各部分的主要参与者对照如下:1.创造权限- Creator创造, 2.分配权限- Administrator 分配, 3.使用权限- User:1. Creator 创造Privilege,Creator 在设计和实现系统时会划分,一个子系统或称为模块,应该有哪些权限。
这里完成的是Privilege 与Resource 的对象声明,并没有真正将Privilege 与具体Resource 实例联系在一起,形成Operator。
2. Administrator 指定Privilege 与Resource Instance 的关联。
在这一步,权限真正与资源实例联系到了一起,产生了Operator(Privilege Instance)。
Administrator利用Operator这个基本元素,来创造他理想中的权限模型。
如,创建角色,创建用户组,给用户组分配用户,将用户组与角色关联等等...这些操作都是由Administrator 来完成的。
3. User 使用Administrator 分配给的权限去使用各个子系统。
Administrator 是用户,在他的心目中有一个比较适合他管理和维护的权限模型。
于是,程序员只要回答一个问题,就是什么权限可以访问什么资源,也就是前面说的Operator。
程序员提供Operator 就意味着给系统穿上了盔甲。
Administrator 就可以按照他的意愿来建立他所希望的权限框架可以自行增加,删除,管理Resource和Privilege之间关系。
可以自行设定用户User 和角色Role的对应关系。
(如果将Creator看作是Basic 的发明者,Administrator 就是Basic 的使用者,他可以做一些脚本式的编程)Operator是这个系统中最关键的部分,它是一个纽带,一个系在Programmer,Administrator,User之间的纽带。
4权限APIgetPermissionByOrgGuid(String orgGuid )通过传入一个org的Guid ,拿到当前这个org对象都具有那些访问权限。
getSourcePermissionByOrgGuid(String orgGuid , StringresouceGuid)通过传入一个org的Guid 和一个资源的Guid ,返回改Org对当前这个资源的访问权限。
getPermissionByResourceGuid(String resource)通过传入一个资源的Guid ,得到当前资源下都有那些权限定义。
havingHeritPermission(String orgGuid , StringresouceGuid) : Boolean传入一个orgGuid,资源GUID ,查看改OrgGuid下对资源是否有向下继承的权限。
这里继承是资源的继承。
即对父栏目有权限,可以继承下去对父栏目下的子栏目同样有权限。
havingPermission(String orgGuid , StringresourceGuid) : Boolean判断某Org对某一资源是否用权限。
以上是粗粒度的权限API 。
以下为细粒度的权限:getOperationByPermission(String permissionGuid)通过permission 的Guid 得到该permission 的所有有效操作。
getOperationByGuid(String permissionGuid , StringresourceGuid)通过permision的Guid ,资源的Guid 得到该资源下所有的有效操作。
screeningOpreationByGuid (String permissionGuid , String resourceGuid , String orgGuid)通过permission ,resource ,org的Guid 得到改Org对这一资源的有效操作。
hasOperation(String operationGuid) : boolean通过传入的operationGuid 返回是否具有操作权限。
5权限的实现:1.表单式认证,这是常用的,但用户到达一个不被授权访问的资源时,Web容器就发出一个html页面,要求输入用户名和密码。
2.用Filter防止用户访问一些未被授权的资源,Filter会截取所有Request/Response,然后放置一个验证通过的标识在用户的Session中,然后Filter每次依靠这个标识来决定是否放行Response。
这个模式分为:Gatekeeper :采取Filter或统一Servlet的方式。
Authenticator:在Web中使用JAAS自己来实现。
Filter拦截只是拦截该用户是否有访问这个页面,或这一资源的权限。
真正做到显示后拦截是在应用程序内部去做。
做显示拦截提供API ,标签这两种方式。
1 一个用户只属于一个用户组用户zhangpeng 只属于用户组FleaCMS2 一个角色包含多个权限,角色RoleFleaCMS 包含Default_Action1, Default_Action2,Default_Action3 三个权限3 一个用户自身(非继承)可以有多个角色,也可以有多个权限用户zhangpeng 自身拥有角色Developer,ProjectManager和RoleFleaCMS,并拥有权限Default_Action4,Default_Action5,Default_Action64 一个用户组可以有多个角色,也可以有多个权限用户组FleaPHP Team 拥有角色exclude_Developer,FleaPHP,权限deny_Default_Action6,Default_Action75 一个权限也可以属于多个角色。
权限Default_Action3 既属于角色RoleFleaCMS,又属于角色RoleFleaPHP6 一个用户组可以排除(exclude)一个角色, 而一旦在其子用户组或者在某个用户身上加入(include)这个角色, 那这个用户或者用户组将重拾这个角色用户组FleaPHP Team 排除了角色Developer,但后来特别为zhangpeng分配了角色Developer,那这个用户最终重拾Developer这个角色7 一个用户或用户组可以拒绝(disallow)一个权限, 一旦拒绝以后, 不管在什么地方再允许(allow)这个权限都于事无补用户组FleaPHP Team被拒绝了权限Default_Action6,在用户组FleaCMS Team和用户身zhangpeng上加上了权限Default_Action6,但最终用户zhangpeng也没能拥有权限Default_Action68 一个用户的角色和权限来自两部分,一部分继承于所有父用户组的角色和权限,另一部分来自特别为其分配的角色和权限用户zhangpeng 的角色和权限1)来自继承的角色和权限:父用户组:开发组角色Developer权限Default_Action6父用户组:FleaPHP Team角色exclude_Developer,RoleFleaPHP权限deny_Default_Action6,Default_Action7所属用户组:FleaCMS Team角色RoleFleaCMS权限Default_Action62)特别为其分配的角色和权限角色ProjectManager,RoleFleaCMS,Developer权限Default_Action4,Default_Action5最终结果:角色RoleFleaPHPRoleFleaCMSDeveloperProjectManager权限deny_Default_Action6Default_Action7Default_Action4Default_Action59 管理员可以做任何事情, 不受任何约束用户admin,或属于用户组管理员组的任何用户,都将拥有而且只拥有角色administrator 如果把用户zhangpeng移动到管理员组,那他的最终角色就只剩下administrator。