基于ThinkPHP的RBAC权限管理的设计与实现
作者:谢飞翔 黄谦
来源:《活力》2018年第18期
作者:谢飞翔 黄谦
来源:《活力》2018年第18期
【摘要】权限认证作为信息管理系统中必要的重要组成部分,它不仅要提供安全、可靠、高效的权限认证,而且应具备很好的适应性和灵活性以满足不同信息系统的需求。本文正是基于以上理念,给出了一个通用RBAC数据库设计方案,并以ThinkPHP框架为开发环境,着重介绍了系统权限的设置、分配和验证。
【关键词】权限控制:权限验证;RBAC;ThinkPHP
引言
权限认证模块在任何一个信息管理系统中都是不可或缺的,能有效防止非法用户访问系统资源以及合法用户越权使用系统资源。
目前主要的访问控制技术有自主访问控制、强制访问控制和基于角的访问控制等,从优越性上看,RBAC优于前两者,RBAC是基于角的访问控制,通过角可以很好地把权限和
用户独立开来,因此RBAC是目前信息系统的主流设计模型,尤其被广泛应用于Web信息管理系统。
本文以RBAC模型为核心理念,基于TinkPHP优越的框架底层,实现了Web环境下,以角为基础的权限控制功能。
一、RBAC模型简介
简单而言,RBAC核心思想是提出了角(Role)的概念,把用户与权限相分离。主要包括三个要素,用户、角和权限。权限与角相关联,用户通过成为适当角的成员而得到这些角对应的权限。这就极大地简化了权限的管理。角可依据新的需求被赋予新的权限,而权限也可根据需要而从某角中回收。一个用户可以根据需要被指派多个角以适应更为灵活的系统需求。
本文所采用的RBAC模型包括用户(USERS)、角( ROIES)和权限(PRMS)等3类实体集合。三者之间的逻辑关系如图1所示。
每个角至少具备一个权限,每个用户至少扮演一个角;可以对两个完全不同的角
分配完全相同的访问权限;需要强调的是,将用户和许可权进行分离,使得彼此相互独立,它们之间是多对多的关系,这种关系将使得模型具备足够的灵活性以适应不同的系统需求。如,企业副总经理兼任财务总监,该用户将一身兼两职,也将同时拥有两个角的权限。
二、RBAC数据库设计
RBAC就是用户通过角与权限进行关联,一个用户拥有若干角,每一个角拥有若干权限。这样,就构造成“用户一角一权限”的授权模型。在这种模型中,用户与角之间,角与权限之间,一般是多对多的关系。基于以上RBAC思想,给出图2所示的数据库设计概要,鉴于突出问题重点,省去了表中的一些通用业务字段。
用户表与角表之间的关系是多对多的关系,中间表为用户角分配表,一个用户可以指定多个角,一个角也可以同时分配给多个用户;角表与权限表之间的关系也是多对多的关系,中间表为角权限分配表,一个角可以指定拥有多个权限,一个权限也可以同时分配给多个角。
三、RBAC系统功能的实现
ThinkPHP是一个免费开源的,快速、简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。本文拟基于ThinkPHP实现RBAC的权限管理、用户管理、角管理、用户授权及认证等功能。
(一)RBAC权限的设置和分配
在数据库设计中,我们知道程序中核心的数据库表有用户表( user)、角表(role)、用户角分配表(role_user)、权限表(node)、角权限分配表(access)等5张表。以下重点讨论,程序怎样实现系统权限的设置和分配的。
1. RBAC权限的设置
权限的设置是基于系统权限表(node),表结构及样例如图3所示。
可见,所有权限节点都有一个pid值,意为其父亲节点id,如果pid-0,表示当前节点为模块级权限,同时对应level-1,意为一级根节点,所有当前模块下授权控制器和方法都会隶属于该根节点;每一个授权控制器对应一个pid-l/level-2/type-1的二级节点,意为隶属xfadmin模块的二级控制器节点;每一个授权控制器方法对应一个pid-n/level-3/type-0的三级节点,意
为隶属n号控制器的三级方法节点,如,29号节点是隶属于“用户管理”控制器的“添加”方法节点。通过pid、level、type三个字段的合理设置,所有权限节点就构成了一棵权限树。说明:表中 group_id并非rbac的要素字段,该字段设置的目的是对所有节点功能进行分组,便于在前台界面进行展示,group_id=0,表示未分组,该权限只作为功能点存在,并不会在功能界面展示;groupid>0,表示进行了分组,该权限会以独立的功能点展示在前台界面中。
name和title是权限的名称和标题,name属性对应具体程序的模块名、控制器名。如,34号结点是xfadmin模块下的AdminUser控制器下的password方法。title字段主要是前台展示时的标记名。
系统权限管理功能主要有:权限添加、权限删除、权限编辑、权限禁用与恢复等几个核心操作;权限节点分为一级模块节点,如“后台管理”,二级控制器节点,如“节点管理”,三级方法节点,如php订单管理系统源码“添加”。
下面重点看看“添加”权限功能,其实现代码是AdminNode\add方法,下面重点看看“添加”权限功能,其实现代码是AdminNo de\add方法,对应源码片段为:
public function add() {
$controller - $this->request->controller();
if ($this->request->isAjax() {
$data - $this->request->except(['id']);
if (
class exists($validateClass = Loader: :parseClass(Config: :get(app.validate_path'), 'validate'. $controller))) {
$validate - new $validateClass();
if (!$validate->check($data)) {return ajax_return_adv_error($validate->getError));}
}
if (
classexists($mo deIClass - Loader: :parseClass(Config : :get(' del_path'), 'model'. $this->parseCameICase($controller)))
||classexists($modeIClass=Loader::parseClass(Config::get(del_path'), 'model', $controller))) {
$model=new $modeIClass();
$ret=$model->isUpdate(false)->save($data);
} else {
Db : :startTrans();
try {
$model=Db::name($this->parseTable($controller));
$ret=$model->insert($data);
Db: :commit();
} catch(\Exception $e) {
Db::rollback();
return ajax_return_adv_error($e->getMessage());
}
}
return ajax_return_adv('success');
} else {
return $this->view->fetch(isset($this->template) ?$this->template:'edit');
}
}
代码分析:由以上代码分析可知,该add方法实际上一个通用添加方法,控制器名称对应数据库表名和验证器名称,用户在访问控制器时,程序会自动调用对应的验证器和数据库表进行数据处理。另外,可以针对不同的控制器在模型库中定义不同的模型,充分体现了程序设计扩展性的优越性。
2. RBAC权限的分配
权限设置完之后,就需要基于用户表(user)、用户角表(roleuser)、角表(role)、角权限表(access)将权限分配给用户。其逻辑是先基于“角权限表”将权限分配给角,然后再基于“用户角表”将角分配给用户,进而完成用户权限的授权。
(1)角授权
角表包括的核心字段有id和name,角权限表包括核心字段有role id、node id,其中 role id对应角表id,node id对应node表id;一个角分配了一个权限就会生成一条角权限表记录,一个角可以分配若干个权限,同一个权限可以被分配给多个角。
角的授权功能在角管理模块中实现,通过过添加功能创建角后,可以立即通过授
权功能对其进行权限分配,系统权限会以树型的方式提供给用户进行选择分配,操作界面如图4所示。
以上所有功能都是通过AdminRole控制器来实现的,其中角授权是通过AdminRole\access方法实现的,access方法源码为:
public function access(){
$roleid=$this->request->param('id/d');
if ($this->request->isPost()){
if(! $role_id){return ajax_return adv error(''缺少
必要参数'');}
if (
true !==$error=Loader::modeI('AdminAccess', 'Iogic')->insertAccess($role_id, $this->request->post()》
{return ajax_return_adv_error($error); }
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论