第1页共1页tp3・2・3RBAC权限控制一、首先需明确TP3・2・3的权限控制是怎么实现的RBAC(Role-BasedAccessControl,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有多个角色,每一个角色拥有多个权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般是多对多的关系。二、基本步骤1、用户登录,此时获取用户的id,以及所属的权限组2、查询用户此时权限组对应的控制器以及方法。并且把查询结果拿出来。3、用户登录之后,我们根据用户对应的权限组中的方法,只显示用户拥有权限的列表部分。无权限的模块不显示。4、在用户每访问一个方法的时候,我们就判断此时,用户对应的权限组有没有该方法,没有的话就提示用户无权限。(需要用公用控制器,类似于Base这种)5、由以上可知。做权限控制,也需要做权限管理,用户管理等模块。三、准备工作1、首先是找到TP给出的权限方法在ThinkPHP/Library/Think/Auth.class.php,打开即可第1页共2页.JimJadrmintimiivw_|阿3耐_g网p1■MnjLfli^hjnnvpjKrrw_JsmJ_diJih_ajlf*=-aaLvlZ.""i-CBbL-TfM这个地方是需要我们自己配置的。首先是开启权限控制。其次是选择实时验证的方式,用户每点击一个方法,我们都验证一下。然后根据注释再配置对应的表。2、数据库新建四个表1)如图2)admin也就是我们的用户表,即管理员表3)用户组表这里对应的就是后台的人员分类。具体的参考自己的逻辑来进仃分类。status=l代表是可用的状态。rules里面的数字代表这个用户组对应的权限id,也就是控制器方法的id>C'lassAuth{这部孙足卅竖找们cnnstruhttp://bLog.c5dr.net/LJFFHPGROUP.ACCESS'RULE'USER1默认剋置protected■AUTH"AUTH■AUTH'AUTH-AUTH.'AUTH$_config=ON-TYPE'GROUP'array(>true,打认:il>1,H认:il.厅式-1沟实时认证;幼登录认眦.>'sn)_autfi_group'r/7用户爼数霭表容>^Nj.auth.grQup.access',//用户-用户俎关系眾>'SttnjJUt^rulr?',//H:J!规Hiiipublicfunctionjprefix=CCDB-PREFIX');$this->_conflg['AUTH_GROUP-J=$pr&fixig[-AUTH_GROUP'];ithiS->_COnflg[AUTH_RULE-]=$pr6f1)(.ithis->_COIlf1£['AUTH_RULE']iithis->_canfig['AUTH_USER']=$preflj(.$thIs->_confU['AUTH_U5ER'];ithi5->_c0nfig[-AirH_GR0UF_ACCESS']=tprefix4this->_config['AUTH.GROUP.ACCESS']jif(C('AUTH_CONFIG-)}{"可设置和.项AUTH_CONFIG,此配豐项沟耿亂・$this->_Eonfig=array_merge[3this->_confi.g,C('AUTH_C!ONFIG'});第1页共3页4)用户组合用户的映射表择该管理员对应的用户组,相当于给他分配一个权限范围smlautr^氏鯛阿112囲1”,鸭席家页越寸如琮2Authi-^ddRde脚U用宜E112ia1□#晦尹91副QJH堆3Airlih-dellRoh?112凶1[口丿年2童淀刮4Auth-cbangtRoh111901□声晦事0崩堆5Airth-eclitiRolePowr111001[口川存2手貢刮6Index-indMC舌页11価1■毕由.牝谡7Admm-addAdmin痢off理吕1.11«.I.s.第1页共4页5)权限规则表这个表就需要我们把每个控制,以及控制器上面对应的方法写出来。name字段对应的格式就是“控制器-方法名称”。title代表方法名称。status代表该方法是否可用direct_jump代表该方法是否可跳转sort代表该方法对应的优先度。排序时候用的。condition,这个字段不为0就代表该方法可验证yrnjadmi洌」authqro第1页共5页四、具体代码1、用户登录,登录之后记得存储一个用户idsession('adminId',$arr['id']);•12、BaseController是每个控制器都要继承的一个方法,目的是判断用户是否登录,没登录的就跳到登录页,登陆成功的就开始进行权限验证R('Public/auth',array($adminId));classBase匚QirtrciJJEr1extendsController{2public-funcTiori_initialize()session_start();5Jadminld=session(1adminld");//管理员用户id6i-F(!issez($adminld))7{8$thiz->5ucce55("您还没有■登录—APP_.'/Login/login1);exiz;IS}else{R('Public/auth',array(Jadminld));12}13}14}这里使用了tp自带...