一直想学习RBAC,又看了官网的例子,又百度,没找到合适的教程。因此就只能本身研究了,就拿官网的例子来讲吧php
think_access表node
做用是看某个组是否有权限访问某个模块下的方法或者访问某个模块,这个表少一个pid字段,本身添加就能够了ide
think_node表,节点表学习
做用是把全部须要的模块,模块下的方法都添加进来管理,用这个也能够直接读取成后台的导航this
name字段是模块,方法的名称,好比Index模块,index方法等,
加密
pid,这个模块或者方法的父id,spa
level,级别,通常项目名是1,模块是2,方法是3继承
正常先添加项目名,pid为0,level为1,status确定是1了
教程
通常都有个默认的Index模块,Index模块下有默认的index方法,md5
因此,插入Index,pid为项目名的id,level为2,再插入index,pid为模块的id,level为3。
think_role为组的表
think_user(本身建的,能够用别的名称,记得在配置文件里改掉),用户表
think_role_user是用户表和组表的关联。
接下来,在Lib下新建IndexAction,PublicAction,CommonAction
而后复制官网RBAC例子里的Conf下的config.php中的内容到本身的项目里,
关于RBAC全部的配置
'USER_AUTH_ON' => true,
'USER_AUTH_TYPE'=> 2,// 默认认证类型 1 登陆认证 2 实时认证
'USER_AUTH_KEY' => 'authId',// 用户认证SESSION标记
'ADMIN_AUTH_KEY'=> 'administrator',
'USER_AUTH_MODEL' => 'User',// 默认验证数据表模型,若是用户表名称不是User的话本身改
'AUTH_PWD_ENCODER' => 'md5',// 用户认证密码加密方式
'USER_AUTH_GATEWAY' => '/Public/login',// 默认认证网关
'NOT_AUTH_MODULE' => 'Public',// 默认无需认证模块
'REQUIRE_AUTH_MODULE' => '',// 默认须要认证模块
'NOT_AUTH_ACTION' => '',// 默认无需认证操做
'REQUIRE_AUTH_ACTION' => '',// 默认须要认证操做
'GUEST_AUTH_ON' => false, // 是否开启游客受权访问
'GUEST_AUTH_ID' => 0, // 游客的用户ID
'DB_LIKE_FIELDS' => 'title|remark',
'RBAC_ROLE_TABLE' => 'think_role',
'RBAC_USER_TABLE' => 'think_role_user',
'RBAC_ACCESS_TABLE' => 'think_access',
'RBAC_NODE_TABLE' => 'think_node',
而后在CommonAction中添加
function _initialize() {
import('@.ORG.Util.Cookie');
// 用户权限检查
if (C('USER_AUTH_ON') && !in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))) {
import('@.ORG.Util.RBAC');
if (!RBAC::AccessDecision()) {
//检查认证识别号
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_'));
}
}
}
这个的做用说白了就 检查是否有权限登陆和是否有权限访问而已。
而后IndexAction继承CommonAction
默认没有登陆或者没有权限会调转到Public/login,Public直接看官网的例子把~应该没问题。
最重要的是access表和node表,role表中的关系要弄清楚了,还有role,role_user,user表之间的关系