您的位置:首页 > 编程语言 > PHP开发

THINKPHP RBAC

2016-02-17 00:00 639 查看
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中设置的咯
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: