tp3.2.2中的RBAC

2024-04-14 16:08
文章标签 rbac tp3.2

本文主要是介绍tp3.2.2中的RBAC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.在tp文件夹下/Library/Org/Util/Rbac.class.php文件有几个建表的sql语句,复制到数据库执行,表的前缀改成自己的表前缀
[sql] view plain copy
  1. CREATE TABLE IF NOT EXISTS `think_access` (  
  2.   `role_id` smallint(6) unsigned NOT NULL,  
  3.   `node_id` smallint(6) unsigned NOT NULL,  
  4.   `level` tinyint(1) NOT NULL,  
  5.   `module` varchar(50) DEFAULT NULL,  
  6.   KEY `groupId` (`role_id`),  
  7.   KEY `nodeId` (`node_id`)  
  8. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;  
  9.   
  10. CREATE TABLE IF NOT EXISTS `think_node` (  
  11.   `id` smallint(6) unsigned NOT NULLAUTO_INCREMENT,  
  12.   `namevarchar(20) NOT NULL,  
  13.   `title` varchar(50) DEFAULT NULL,  
  14.   `status` tinyint(1) DEFAULT '0',  
  15.   `remark` varchar(255) DEFAULT NULL,  
  16.   `sort` smallint(6) unsigned DEFAULT NULL,  
  17.   `pid` smallint(6) unsigned NOT NULL,  
  18.   `level` tinyint(1) unsigned NOT NULL,  
  19.   PRIMARY KEY (`id`),  
  20.   KEY `level` (`level`),  
  21.   KEY `pid` (`pid`),  
  22.   KEY `status` (`status`),  
  23.   KEY `name` (`name`)  
  24. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;  
  25.   
  26. CREATE TABLE IF NOT EXISTS `think_role` (  
  27.   `id` smallint(6) unsigned NOT NULLAUTO_INCREMENT,  
  28.   `namevarchar(20) NOT NULL,  
  29.   `pid` smallint(6) DEFAULT NULL,  
  30.   `status` tinyint(1) unsigned DEFAULT NULL,  
  31.   `remark` varchar(255) DEFAULT NULL,  
  32.   PRIMARY KEY (`id`),  
  33.   KEY `pid` (`pid`),  
  34.   KEY `status` (`status`)  
  35. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;  
  36.   
  37. CREATE TABLE IF NOT EXISTS `think_role_user` (  
  38.   `role_id` mediumint(9) unsigned DEFAULTNULL,  
  39.   `user_id` char(32) DEFAULT NULL,  
  40.   KEY `group_id` (`role_id`),  
  41.   KEY `user_id` (`user_id`)  
  42. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;  



2.建立节点处理方法(我这里建立了一个独立的控制器RbacController.class.php)add_node和添加节点表单处理方法add_node_hanlde
[php] view plain copy
  1. //添加节点  
  2.     publicfunction add_node(){  
  3.       $this->assign('pid',I('get.pid',0,'intval'));  
  4.       $this->assign('level',I('get.pid',1,'intval'));  
  5.       $this->display();  
  6.     }  
  7.    //添加节点表单处理  
  8.     publicfunction add_node_hanlde(){  
  9.       $data=array(  
  10.            //名称(Home模块就是Home,Rbac控制器就Rbac,index方法就是index)  
  11.            'name'=>I('post.name'),  
  12.            //描述方法的具体作用(Home模块是前台模块,就写前台模块)  
  13.          'title'=>I('post.title'),  
  14.            //状态  
  15.          'status'=>I('post.status'),  
  16.            //排序  
  17.          'sort'=>I('post.sort'),  
  18.            //上级节点id  
  19.          'pid'=>I('post.pid'),  
  20.            //级别(1就是模块,2就是控制器,3就是方法)  
  21.          'level'=>I('post.level'),  
  22.        );  
  23.       if(M('node')->add($data)){  
  24.          header('Location:'.U('add_node'));  
  25.        }else{  
  26.          $this->error('操作失败');  
  27.        };  
  28.     }  



3.建立显示节点方法node
[php] view plain copy
  1. //显示节点列表  
  2.     publicfunction node(){  
  3.       //node_list函数递归把节点列表变成“模块->控制器->方法”层次的数组  
  4.       $this->assign('node_list',node_list(M('node')->select()));  
  5.       $this->display();  
  6.     }  
  7.   
  8. node_list函数  
  9. //递归把节点列表变成“模块->控制器->方法”层次的数组  
  10. function node_list($arr,$pid=0){  
  11.    $node_list=array();  
  12.     foreach($arr as $key => $value) {  
  13.        if($value['pid']==$pid) {  
  14.          $value['child']=node_list($arr,$value['id']);  
  15.          $node_list[]=$value;  
  16.        }  
  17.     }  
  18.     return$node_list;  
  19. }  




4.建立角色处理方法
[php] view plain copy
  1. //添加角色  
  2.     publicfunction add_role(){  
  3.       $this->display();  
  4.     }  
  5.   
  6.    //添加角色表单处理  
  7.     publicfunction add_role_hanlde(){  
  8.       $data=array('name'=>I('post.name'),  
  9.          'remark'=>I('post.remark'),  
  10.          'status'=>I('post.status'),  
  11.        );  
  12.       if(M('role')->add($data)){  
  13.          header('Location:'.U('role'));  
  14.        }else{  
  15.          $this->error('操作失败');  
  16.        };  
  17.   
  18.     }  
  19.    //显示角色列表  
  20.     publicfunction role(){  
  21.       $this->assign('role',M('role')->select());  
  22.       $this->display();  
  23.     }  




5.建立配置权限方法
 
[php] view plain copy
  1. //配置权限  
  2.   publicfunction access(){  
  3.     $access=M('node')->select();  
  4.     $select_access=M('access')->field('node_id')->where(array('role_id'=>$_GET['role_id']))->select();  
  5.      foreach($access as $key => $value) {  
  6.         foreach($select_access as $key_1 => $value_1) {  
  7.            if($value['id']==$value_1['node_id']) {  
  8.              $access[$key]['access']=1;  
  9.               break;  
  10.            }else{  
  11.              $access[$key]['access']=0;  
  12.            }  
  13.         }  
  14.          
  15.      }  
  16.     $this->assign('rid',$_GET['role_id']);  
  17.     $this->assign('access',node_list($access));  
  18.     $this->display();  
  19.   }  
  20.   
  21.  //配置权限表单处理  
  22.   publicfunction access_hanlde(){  
  23.      foreach($_POST['access'as $key => $value) {  
  24.        $temp=explode('_'$value);  
  25.        $data[]=array('role_id'=>$_POST['rid'],'node_id'=>$temp[0],'level'=>$temp[1]);  
  26.      }  
  27.     if(!(M('access')->where(array('role_id'=>$_POST['rid']))->delete())){  
  28.        $this->error('操作失败');  
  29.      }  
  30.     if(M('access')->addAll($data)){  
  31.        header('Location:'.U('role'));  
  32.      }else{  
  33.        $this->error('操作失败');  
  34.      }  
  35.   }  


6.用户相关方法

[php] view plain copy
  1. //添加用户  
  2.     public function add_user(){  
  3.         $this->assign('role',M('role')->select());  
  4.         $this->display();  
  5.     }  
  6.   
  7.     //添加用户  
  8.     public function add_user_hanlde(){  
  9.         $data=array('user_name'=>I('post.name'),  
  10.             'user_pwd'=>I('post.pwd'),  
  11.             'user_group'=>I('post.group')  
  12.         );  
  13.         $user_id=M('user')->add($data);  
  14.         if($user_id){  
  15.             $data=array('role_id'=>I('post.group'),  
  16.                 'user_id'=>$user_id  
  17.             );  
  18.             if (M('role_user')->add($data)) {  
  19.                 header('Location:'.U('user'));  
  20.             }else{  
  21.                 $this->error('操作失败');  
  22.             }  
  23.         }else{  
  24.             $this->error('操作失败');  
  25.         }  
  26.     }  
  27.   
  28.     //用户列表  
  29.     public function user(){  
  30.         $this->assign('user',D('UserView')->select());  
  31.         $this->display();  
  32.     }  

7.增加配置项
[php] view plain copy
  1. //rbac  
  2.     // 配置文件增加设置  
  3.     //是否需要认证,设置为true时$rbac::AccessDecision()函数才会根据当前的操作检查权限并返回true或false,,设为false只返回true  
  4.     'USER_AUTH_ON'     =>    true,  
  5.     //认证类型,2代表每次进行操作的时候都会数据库取出权限(权限更改即时生效),1代表只在登录的时候取出权限(权限更改下次登录时生效)  
  6.     'USER_AUTH_TYPE'     =>    1,  
  7.     //认证识别号,执行$rbac::saveAccessList();的时候回用以这个为键值的session去数据库取权限  
  8.     'USER_AUTH_KEY' =>    'user_id',  
  9.     //认证网关,执行$rbac::checkLogin()函数(检查是否登录),如果没有登录,去到这个设置的网址(当前url直接加上这个设置的值)  
  10.     'USER_AUTH_GATEWAY' =>'/Login',  
  11.     //数据库连接DSN???  
  12.     //'RBAC_DB_DSN'  =>,  
  13.     //角色表名称  
  14.     'RBAC_ROLE_TABLE' =>'bg_role',  
  15.     //用户表名称(rbac类说的是用户表,其实是用户角色关联表)  
  16.     'RBAC_USER_TABLE' =>'bg_role_user',  
  17.     //权限表名称  
  18.     'RBAC_ACCESS_TABLE' =>'bg_access',  
  19.     //节点表名称  
  20.     'RBAC_NODE_TABLE' =>'bg_node',  
  21.     //定义rbac超级管理员,登录成功之后把用户名和这个值进行比对,一样就是超级管理员  
  22.     'RBAC_SUPERADMIN'   =>  'admin',  
  23.     //超级管理员识别,当当前用户是超级管理员时,把键值为这个值的session这个设置为true,当前用户就能进行一切操作  
  24.     'ADMIN_AUTH_KEY'    =>  'superadmin',  


8.在登录时取出权限

[php] view plain copy
  1. session(C('USER_AUTH_KEY'),$arr['id']);  
  2. session('name',$arr['name']);  
  3. session('last_login_time',date('Y-m-d H:i:s',$arr['last_login_time']));  
  4. session('ip',$arr['last_login_ip']);  
  5. //如果用户是超级管理员,则可以进行一切操作  
  6. if (session('name')==C('RBAC_SUPERADMIN')) {  
  7.     session(C('ADMIN_AUTH_KEY'),true);  
  8. }  
  9. $rbac=new \Org\Util\Rbac();  
  10. //取出用户权限信息  
  11. $rbac::saveAccessList();  


9,建立一个公共控制器,需要验证的模块都继承这个控制器,写一个前置函数,验证当前操作是否有权限

[php] view plain copy
  1.        $rbac=new \Org\Util\Rbac();  
  2.     //检测是否登录,没有登录就打回设置的网关  
  3.        $rbac::checkLogin();  
  4.        //检测是否有权限没有权限就做相应的处理  
  5. if(!$rbac::AccessDecision()){  
  6.     echo '<script type="text/javascript">alert("没有权限");</script>';  
  7.     die();  

这篇关于tp3.2.2中的RBAC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903428

相关文章

什么是Kubernetes RBAC?

什么是Kubernetes RBAC? 1、什么是RBAC?2、核心组件3、优势 💖The Begin💖点点关注,收藏不迷路💖 在Kubernetes集群中,RBAC(基于角色的访问控制)是保障系统安全的关键。它通过角色和绑定管理不同实体对资源的访问权限,具有显著优势: 1、什么是RBAC? RBAC是Kubernetes中用于控制访问权限的机制,通过定义

Elastic Stack--ES集群加密及Kibana的RBAC实战

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 学习B站博主教程笔记:  最新版适合自学的ElasticStack全套视频(Elk零基础入门到精通教程)Linux运维必备—ElasticSearch+Logstash+Kibana精讲_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1VMW3e6Ezk/?sp

自己写一个RBAC实现基于spring security

终于看完慕课网的一个实战视频http://coding.imooc.com/class/134.html 下面来做一个简单的使用springsecurity +JWT的rbac实现 首先创建pom项目 <dependencyManagement><dependencies><!--管理版本--><dependency><groupId>io.spring.platform</groupI

【权限管理】RBAC 和 ABAC的对比

RBAC 和 ABAC的对比 RBAC三个组成部分使用优缺点 ABAC属性访问策略示例优缺点 RBAC 和 ABAC的对比 RBAC 基于角色的访问控制(role-based access control RBAC) 三个组成部分 用户角色权限 使用 当用户访问系统时,根据用户具备什么角色,允许用户访问哪些菜单、允许访问那些资源。需要创建拥有不同权限组合的不同角色,比如

Java研学-RBAC权限控制(八)

九 登录登出 1 登录作用   判断员工是否有权限访问,首先得知道现在操作的人是谁,所以必须先实现登录功能 2 登录流程   ① 提供登录页面,可输入用户名与密码信息,并添加执行登录的按钮。(登录页面不能被拦截)   ② 给按钮绑定点击事件(异步操作,POST请求)   ③ 事件中发送登录请求,使用 AJAX 方式提交。(使用 AJAX 原因:用户体验更好,既可保留用户刚输入的用户名和密码

权限系统RBAC模型概述

转自https://blog.csdn.net/yangwenxue_admin/article/details/73936803 一、概念 RBAC(Role-Based Access Control )基于角色的访问控制。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任

2024/6/18(RBAC,查询用户权限,细粒度授权,选课,支付宝生成二维码支付,支付结果查询需要内网穿透)

黑马程序员【学成在线项目】,P141 测试沙箱支付宝_黑马学成在线支付宝沙箱-CSDN博客 需要内网穿透

RBAC新解 - 基于资源的权限管理

1、什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念。角色是代表一系列可执行的操作或责任的实体,用于限定你在软件系统中能做什么、不能做什么。用户帐号往往与角色相关联,因此,一个用户在软件系统中能做什么取决于与之关联的各个角色。 例如,一个用户以关联了”项目管理员”角色的帐号登录系统,那这个用户就可以做项目管理员能做的所有事情――如列出项目中的应用、管理项目组成员、产生项

RBAC权限实战

一、项目结构说明、搭建以及初步验证 引入SSM框架依赖: <dependencies>                                                                   <dependency>                                                                     <grou

【运维知识大神篇】运维界的超神器Kubernetes教程14(RBAC三种认证方式详解:基于用户+基于用户组+基于服务账号)

本篇文章继续给大家介绍Kubernetes,内容依旧烧脑,不过内容也已经过了一大半了,如果你把我Kubernetes前面的教程都看懂了的话,那么你已经很厉害了,坚持下去!本篇文章主要介绍RBAC的三种认证方式,分别是基于用户、基于用户组、基于服务账号的三种认证。 目录 RBAC 一、RBAC之基于用户授权案例 二、RBAC之基于用户组授权 1、创建用户组案例展示 2、创建用户加入用户组