基于ThinkPHPRBAC权限管理的设计与实现
作者:谢飞翔 黄谦
来源:《活力》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号节点是隶属于用户管理控制器的添加方法节点。通过pidleveltype三个字段的合理设置,所有权限节点就构成了一棵权限树。说明:表中 group_id并非rbac的要素字段,该字段设置的目的是对所有节点功能进行分组,便于在前台界面进行展示,group_id=0,表示未分组,该权限只作为功能点存在,并不会在功能界面展示;groupid>0,表示进行了分组,该权限会以独立的功能点展示在前台界面中。
        nametitle是权限的名称和标题,name属性对应具体程序的模块名、控制器名。如,34号结点是xfadmin模块下的AdminUser控制器下的password方法。title字段主要是前台展示时的标记名。
        系统权限管理功能主要有:权限添加、权限删除、权限编辑、权限禁用与恢复等几个核心操作;权限节点分为一级模块节点,如后台管理,二级控制器节点,如节点管理,三级方法节点,如php订单管理系统源码添加
        下面重点看看添加权限功能,其实现代码是AdminNodeadd方法,下面重点看看添加权限功能,其实现代码是AdminNo deadd方法,对应源码片段为:
        public function add() {
        $controller - $this->request->controller();
        if $this->request->isAjax() {
        $data - $this->request->except['id'];
        if
        class exists$validateClass = Loader parseClassConfig getapp.validate_path'), 'validate'. $controller))) {
        $validate - new $validateClass();
        if (!$validate->check$data)) {return ajax_return_adv_error$validate->getError));}
        }
        if
        classexists$mo deIClass - Loader parseClassConfig get' del_path'), 'model'. $this->parseCameICase$controller)))
        ||classexists$modeIClass=Loader::parseClassConfig::getdel_path'), 'model' $controller))) {
        $model=new $modeIClass();
        $ret=$model->isUpdatefalse->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->fetchisset$this->template $this->template'edit';
        }
        }
        代码分析:由以上代码分析可知,该add方法实际上一个通用添加方法,控制器名称对应数据库表名和验证器名称,用户在访问控制器时,程序会自动调用对应的验证器和数据库表进行数据处理。另外,可以针对不同的控制器在模型库中定义不同的模型,充分体现了程序设计扩展性的优越性。
        2. RBAC权限的分配
        权限设置完之后,就需要基于用户表(user)、用户角表(roleuser)、角表(role)、角权限表(access)将权限分配给用户。其逻辑是先基于角权限表将权限分配给角,然后再基于用户角表将角分配给用户,进而完成用户权限的授权。
        1)角授权
        角表包括的核心字段有idname,角权限表包括核心字段有role idnode id,其中 role id对应角表idnode id对应nodeid;一个角分配了一个权限就会生成一条角权限表记录,一个角可以分配若干个权限,同一个权限可以被分配给多个角。
        角的授权功能在角管理模块中实现,通过过添加功能创建角后,可以立即通过授
权功能对其进行权限分配,系统权限会以树型的方式提供给用户进行选择分配,操作界面如图4所示。
        以上所有功能都是通过AdminRole控制器来实现的,其中角授权是通过AdminRoleaccess方法实现的,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小时内删除。