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中设置的咯
分别对应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中设置的咯
相关文章推荐
- ThinkPHP去除url中的index.php
- PHP正则表达式
- IIS6切换PHP版本
- THINKPHP日常用到的基础知识
- PHPCMS一些常用调用方法
- phpcms推荐位分组
- PHPCMS URL规则(频道页(栏目页列表页)二级域名,内容页主域名)
- PHPCMS整合UCENTER后登陆问题
- thinkphp主从分离分布式处理
- PHPCMS修改目录
- PHP基本功
- zendstudio破解
- THINKPHP日常注意
- php中类型数组(typed array)
- PHP开发如何实现多线程?
- Atitit.跨平台预定义函数 魔术方法 魔术函数 钩子函数 api兼容性草案 v2 q216 java c# php js.docx
- 深入php面向对象、模式与实践
- php笔记
- _splitpath 或_wsplitpath函数的使用
- PHP邮件群发机实现代码