THINKPHP RBAC

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中设置的咯

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值