首先,先建立Rbac那五张表(用户表,角色表,节点表,权限表,角色-用户表),后面四张可以在thinkphp中Rbac类里直接复制。

第二步,根据需求往那五张表里插入数据,注意:节点表里的节点名称一定要跟当前的应用,控制器和方法名称一致,还有应用的level值等于1,不是等于0的,以下为PHP代码:

<?php
namespace Home\Controller;
use Think\Controller;
use Org\Util\Rbac;
class RbacController extends CommonController{
public function index(){
$this->user=D('UserRelation')->relation(true)->select();
$this->display();
} public function addUser(){
$this->role=M('role')->select();
$this->display();
} public function addUserHandle(){
$arr=I('post.');
$data=array(
'userName'=>I('post.username'),
'password'=>I('post.password','','md5'),
'logintime' =>date('Y-m-d:H:i:s',time()),
'loginip' => get_client_ip()
);
if ($uid=M('user')->add($data)) {
foreach ($arr['rid'] as $v) {
$id[]=array(
'role_id'=>$v,
'user_id'=>$uid
);
}
M('role_user')->addAll($id);
$this->success('添加成功',U('Rbac/index'));
}else{
$this->error('添加失败');
}
} public function deleteUser(){
if (M('user')->where(array('id'=>I('get.id')))->delete()) {
M('role_user')->where(array('user_id'=>I('get.id')))->delete();
$this->success('删除成功',U('Rbac/index'));
}else{
$this->error('删除失败');
}
} public function addRole(){
$this->display();
} public function addRoleHandle(){
if (M('role')->add(I('post.'))) {
$this->success('添加成功',U('Rbac/roleList'));
}else{
$this->error('添加失败');
}
} public function roleList(){
$this->role=M('role')->select();
$this->display();
} public function deleteRole(){
if (M('role')->where(array('id'=>I('get.id')))->delete()) {
M('access')->where(array('role_id'=>I('get.id')))->delete();
$this->success('删除成功',U('Rbac/roleList'));
}else{
$this->error('删除失败');
}
} public function addNode(){
$this->pid=I('get.pid',0);
$this->level=I('get.level',1);
switch ($this->level) {
case '1':
$this->string='应用';
break;
case '2':
$this->string='控制器';
break;
case '3':
$this->string='方法';
break;
}
$this->display();
} public function addNodeHandle(){
if (M('node')->add(I('post.'))) {
$this->success('添加成功',U('Rbac/nodeList'));
}else{
$this->error('添加失败');
}
} public function nodeList(){
$node=M('node')->select();
$this->node=order($node);
$this->display();
} public function deleteNode(){
$node=M('node')->select();
$pid=I('get.id');
$node=getChildrenId($node,$pid);
M('node')->where(array('id'=>$pid))->delete();
foreach ($node as $v) {
M('node')->where(array('id'=>$v))->delete();
}
$this->success('删除成功',U('Rbac/nodeList'));
} public function access(){
$node=M('node')->select();
$this->role_id=I('get.id');
$access=M('access')->where(array('role_id'=>$this->role_id))->getField('node_id',true);
$this->node=order($node,$access);
$this->display();
} public function accessHandle(){
$data=I('post.');
foreach ($data['access'] as $v) {
$access=explode('_', $v);
$arr[]=array(
'role_id'=>I('post.role_id'),
'node_id'=>$access['0'],
'level'=>$access['1']
);
}
M('access')->where(array('role_id'=>I('post.role_id')))->delete();
if (M('access')->addAll($arr)) {
$this->success('配置成功',U('Rbac/roleList'));
}else{
$this->error('配置失败');
}
}
}
?>

第三步,编写配置项,以下代码:

<?php
return array(
'USER_AUTH_ON'=>true,
'USER_AUTH_TYPE'=>'1',
'USER_AUTH_KEY'=>'uid',
'ADMIN_AUTH_KEY'=>'superadmin',
'RBAC_SUPERADMIN'=>'admin',
'RBAC_ROLE_TABLE'=>'fsxb_role',
'RBAC_USER_TABLE'=>'fsxb_role_user',
'RBAC_ACCESS_TABLE'=>'fsxb_access',
'RBAC_NODE_TABLE'=>'fsxb_node',
'NOT_AUTH_CONTROLLER'=>'Public',
'NOT_AUTH_ACTION'=>'index,tree,consumerList,addUserHandle,addRoleHandle,addNodeHandle,accessHandle,agentList,modelList,download,addConsumerHandle,updateConsumerHandle,addAgentHandle,updateAgentHandle,addModelHandle,updateModelHandle'
);

第四步,调用thinkphp中Rbac类,在登陆方法存储session的时候,把权限也存储进去,添加以下代码:

if($username== C('RBAC_SUPERADMIN')) {
session(C('ADMIN_AUTH_KEY'), true);
}
Rbac::saveAccessList();

第五步,在CommonController公共控制器的自动运行函数中调用Rbac权限认证方法,代码如下:

<?php
namespace Home\Controller;
use Think\Controller;
use Org\Util\Rbac;
class CommonController extends Controller{
public function _initialize(){
if(!session('uid')){
$this->redirect('Public/index');
} $notAuth = in_array(CONTROLLER_NAME , explode(',', C('NOT_AUTH_CONTROLLER'))) || in_array(ACTION_NAME, C('NOT_AUTH_ACTION'));
//权限验证
if(C('USER_AUTH_ON') && !$notAuth) {
//使用了项目分组,则必须引入GROUP_NAME
RBAC::AccessDecision() || $this->error("你没有权限");
}
}
}
?>

到此为止,thinkphp权限认证编写完成

thinkphp权限管理Rbac实例的更多相关文章

  1. devops-jenkins基于角色的权限管理RBAC

    一. devops-jenkins基于角色的权限管理RBAC 1 安装角色的rbac角色管理  1.1) 点击系统管理 1.2) 选择插件管理 1.3) 选择可选插件,输入role搜索 1.4) 选择 ...

  2. php人员权限管理(RBAC)

    在说权限管理前,应该先知道权限管理要有哪些功能: (1).用户只能访问,指定的控制器,指定的方法 (2).用户可以存在于多个用户组里 (3).用户组可以选择,指定的控制器,指定的方法  (4).可以添 ...

  3. TP thinkphp 权限管理 权限认证 功能

    (如有打扰,请忽略)阿里云ECS大羊群,2U4G低至1.4折,限实名新用户,需要的点吧https://promotion.aliyun.com/ntms/act/vm/aliyun-group/tea ...

  4. 详解权限管理(RBAC)的实现方法

    在说权限管理前,应该先知道权限管理要有哪些功能: ().用户只能访问,指定的控制器,指定的方法 ().用户可以存在于多个用户组里 ().用户组可以选择,指定的控制器,指定的方法 ().可以添加控制器和 ...

  5. 权限管理RBAC模型概述

    一.什么是RBAC模型 RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是比较早期提出的权限实现模型,在多用户计算机时期该思想即被提出,其中以美国George ...

  6. Django_用户权限管理rbac

    组成部分 1.初始化权限:login视图initial_permission,把权限信息放入session.initial_permission函数生成权限列表.菜单列表 2.中间件验证权限:在第一次 ...

  7. 权限管理-RBAC

    (一)RBAC 通过用户与角色关联,角色与操作的关联实现用户与操作的关联 (二)权限细分 (三)数据库设计 (四)程序设计 (五)权限与应用程序 (1)应用URL实现程序权限控制 (2)应用code实 ...

  8. Yii的权限管理rbac

    1.首先我们要在配置文件的组件(component)里面配置一下 Rbac 在对应项目下的config/main.php或者config/main-local.php下添加 'authManager' ...

  9. php 人员权限管理(RBAC)

    一.想好这个权限是什么? 就做一个就像是vip的功能,普通用户和vip用户的功能是不一样的,先来考虑一下数据库怎么设计 肯定要有用户表.还有用户所用的角色.然后就是权限功能表:可是在这里面有关联也就 ...

随机推荐

  1. 现象: shell脚本中source aaa.sh时提示 source: not found

    原因: ls -l `which sh` 提示/bin/sh -> dash 这说明是用dash来进行解析的. 改回方法: 命令行执行:sudo dpkg-reconfigure dash 在界 ...

  2. 记录vim经常使用的几个命令

    vi/vim 基本使用方法 vi编辑器是所有Unix及Linux系统下标准的编辑器. $ vim 1.txt 以vi打开一个文件就直接进入一般模式了(这是默认的模式).在这个模式中, 你可以使用上下左 ...

  3. fork()函数的执行过程、孤儿进程和僵尸进程

    说起fork就不得不提COW(Copy On Write),就是“写时拷贝”.也就是当fork发生时,子进程根本不会去拷贝父进程的内存页面,而是与父进程共享.当子进程或父进程需要修改一个内存页面时,L ...

  4. JDK1.8中的Lambda表达式和Stream

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

  5. 第四期coding_group笔记_用CRF实现分词-词性标注

    一.背景知识 1.1 什么是分词? NLP的基础任务分为三个部分,词法分析.句法分析和语义分析,其中词法分析中有一种方法叫Tokenization,对汉字以字为单位进行处理叫做分词. Example ...

  6. P2P技术简介(包括BT软件的分析)(转)

    这是一篇别人发表的论文,里面很全面的解释了P2P技术的实现,以及BT网络中应用P2P技术所设计的原理,并列举BT软件的一些专业名词的定义.由于论文发表的比较早,2005年时还没有DHT技术. (链接: ...

  7. NSThread学习

    使用多线程可以防止主线程阻塞.同时也可以将一个大的任务分成若干个小的任务去做. 常用方法一: 1, 首先使用  detachNewThreadSelector:toTarget:withObject: ...

  8. 纯CSS3美化radio和checkbox

    如题,主要通过CSS3来实现将radio和checkbox美化的效果.可是兼容性并非非常好,PC端仅仅支持chrome浏览器(IE和Firefox測试不行,其它没有很多其它測试).然后微信端和QQ端訪 ...

  9. poj 2528(区间改动+离散化)

    题意:有一个黑板上贴海报.给出每一个海报在黑板上的覆盖区间为l r,问最后多少个海报是可见的. 题解:由于l r取值到1e7,肯定是要离散化的,但普通的离散化会出问题.比方[1,10],[1,4],[ ...

  10. Windows下编程2----- C语言常用函数举例

    几个小函数 1.    //MessageBoxA(0,"网络故障,重新登录","qq error",3); //弹出对话框 2.    //ShellExec ...