THINKPHP RBAC

来源:互联网 发布:stm8单片机视频教程 编辑:程序博客网 时间:2024/06/07 06:06

RBAC一般情况下会有五张表,如果很难记的话就可以这样记,首先有一个我们平时的用户表user,然后就是角色表,系统中有哪些角色role表,然后就是角色-用户表,也即用户ID拥有的角色ID对应的数据表。然后就是NODE表用来记录系统中有哪些模块,哪些操作的表,然后及时角色-节点表用来记录系统中角色ID对应的NODEID表。

分别对应pre_user,pre_role,pre_role_user,pre_node,pre_access

其中,我们在pre_node表中会加入pid跟level,字段level 表示该节点的层级 换句话就是说 level=1 为项目,level=2为模块 ,level=3就是操作了,比如说 admin项目,他的PID 就是 0 (项目的PID都是0)level就是1,nane就是admin了,admin项目下面有的user模块,它的level就应该是2,pid就是admin的id,admin下面user模块的add操作,level就该是3了,pid就应该是前面的user对应的ID.

如何使用:

在登录按钮提交之后写如下代码:详细代码可以看yourphpcms的LoginAciton.classs.php

$condition = array();
$condition['username'] =array('eq',$username);

import ( '@.ORG.RBAC' );
$authInfo = RBAC::authenticate($condition);

解读:RBAC::authenticate方法返回用户表中查询条件的信息,然后接下来可以进行密码对比

完成密码对比后接下来就会跳到session记录跟RBAC权限的记录了

$_SESSION['username'] = $authInfo['username'];
$_SESSION['adminid'] = $_SESSION['userid'] = $authInfo['id'];
$_SESSION['groupid'] = $authInfo['groupid'];
$_SESSION['adminaccess'] = C('ADMIN_ACCESS');
$_SESSION[C('USER_AUTH_KEY')] $authInfo['id'];
$_SESSION['email'] $authInfo['email'];
$_SESSION['lastLoginTime']  $authInfo['last_logintime'];
$_SESSION['login_count'] $authInfo['login_count']+1;

if($authInfo['groupid']==1) {
$_SESSION[C('ADMIN_AUTH_KEY')]=true;
}

//保存登录信息
$data = array();
$data['id'] $authInfo['id'];
$data['last_logintime'] $time;
$data['last_ip'] get_client_ip();
$data['login_count'] array('exp','login_count+1');
$dao->save($data);

// 缓存访问权限
RBAC::saveAccessList();

接下来就是权限验证了,我们会所有的类都继承AdminBaseAction.Class.php,然后在_initialize方法中加入如下代码

// 用户权限检查
  if (C ( 'USER_AUTH_ON') &&!in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))) {
   import ('@.ORG.RBAC' );
   if (!RBAC::AccessDecision ('Admin')) {
    //检查认证识别号

    if(! $_SESSION [C ( 'USER_AUTH_KEY' )]) {
     //跳转到认证网关
     redirect( PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
    }
    //没有权限 抛出错误
    if(C ( 'RBAC_ERROR_PAGE' )) {
     //定义权限错误页面
     redirect( C ( 'RBAC_ERROR_PAGE' ) );
    }else {
     if(C ( 'GUEST_AUTH_ON' )) {
      $this->assign( 'jumpUrl', PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
     }
     //提示错误信息
     $this->error( L ( '_VALID_ACCESS_' ) );
    }
   }
  }

 

AccessDecision($appName=APP_NAME)方法,就是检测当前项目模块操作是否在$_SESSION['_ACCESS_LIST']数组中,如果没有权限,则判断$_SESSION[C ( 'USER_AUTH_KEY')]是否存在,既判断用户是否登录未登录则跳转到登录界面,登录了则跳出没有权限操作的界面。

注意,RBAC的五张数据表以及跳转页面的地址都是在config.php中设置的咯