今天晚上把ThinkPHP的权限分配弄明白了,心里的包袱立刻放下了,感觉那个爽啊!稍微记录一下。

背景:CMS系统开发(17do)。

项目分组:Admin(后台管理)、Home(前台显示)。
Admin组中包含ManagerAction、UserActin、ArticleAction三个控制器

第一部分:表关系对应(箭头是指数据来源)


其中表结构式根据RBAC规定的结构创建的。

定义结果:站长1能访问项目用户和文章的所有操作,管理员3只能对文章模块操作不能访问用户模块。

第二部分:项目配置
项目的config.php文件中添加

//权限分配设置
    
'USER_AUTH_ON'=>true, //是否需要认证
   
'USER_AUTH_TYPE'=>1, //认证类型
   
'USER_AUTH_KEY'=>'userId',  // 认证识别号
   
'USER_AUTH_MODEL'=>'user',//模型实例(用户表名)
   
'REQUIRE_AUTH_MODULE'=>'User',  //需要认证模块
   
'NOT_AUTH_MODULE'=>'',  
//无需认证模块
   
'USER_AUTH_GATEWAY'=>'/Public/login', //认证网关
   
//RBAC_DB_DSN  数据库连接DSN
   
'RBAC_ROLE_TABLE'=>'do_role', //角色表名称
   
'RBAC_USER_TABLE'=>'do_role_user', //用户和角色对应关系表名称
   
'RBAC_ACCESS_TABLE'=>'do_access', //权限分配表名称
   
'RBAC_NODE_TABLE'=>'do_node',  // 权限表名称

第三部分:权限信息写入控制器

public
function checkUser(){
       
//表单数据不能为空
       
if($this->_post('username')&&$this->_post('password')&&$this->_post('verifycode')){

$pwd=  $this->_post('password');
           
$username=  $this->_post('username');
           
//验证码是否正确
           
$verify=  $this->_post('verifycode');
           
if($this->_session('verify')!= 
md5($verify)){
               
$this->error("验证码错误");
           
}else{
               
//创建数据库对象
               
$user=M('user');
               
//根据用户名查询

$cond['username']=$username;
               
$cond['active']=array('gt',0);
               
//加载RBAC类
               
import('ORG.Util.RBAC');
               
//通过authenticate读取用户信息
               
$result=RBAC::authenticate($cond);
               
//dump($result);
               
if($result){
                   
if($result['password']==md5($pwd)){
                       
$_SESSION[C('USER_AUTH_KEY')]=$result['id'];
                       
$_SESSION["name"]=$result['name'];
                       
//使用saveAccessList缓存访问权限
                       
RBAC::saveAccessList();
                       
$this->display('Manager:index');
                   
}else{
                       
$this->error("用户密码错误");
                   
}
               
}else{
                   
$this->error("用户名不存在或已经被禁用");
               
}

}

第四部分:创建验证权限控制器

class CommonAction extends Action{

//_initialize()方法是ThinkPHP提供的入口方法,类似于原PHP中__condition()构造函数。可以存放所有公用信息。

function
_initialize(){
       
//判断是否开启认证,并且当前模块需要验证
       
if(C('USER_AUTH_ON')&&!in_array(MODULE_NAME, explode(',',
C('NOT_AUTH_MODULE')))){
           
//导入RBAC类,开始验证
           
import('ORG.Util.RBAC');
           
//通过accessDecision获取权限信息
           
if(!RBAC::AccessDecision()){
               
//没有获取到权限信息时需要执行的代码
               
//1、用户没有登录
               
if(!$_SESSION[C('USER_AUTH_KEY')]){
                   
$url= U('Public/login');
                   
$this->error("您还没有登录不能访问",$url);
               
}
               
$this->error("您没有操作权限");
           
}
       
}
    }
}

第五部分:验证控制器调用

只要需要权限验证的控制器继承CommonAction就可以啦!

使用admin账号登陆能正常访问


使用xiaoxiao账号登陆后不能访问用户列表页面

thinkphp rabc权限总结的更多相关文章

  1. ThinkPHP RBAC权限管理机制

    RBAC是ThinkPHP很好用的后台权限管理的,话不多说,实现方法如下,也方便以后自己查询使用: 1.新建4个数据库表 self_role权限表 CREATE TABLE `self_role` ( ...

  2. RABC权限控制(页面操作角色,权限和进行分配)

    上一节主要说的是如何通过url进行权限控制,这一节就说一下如何开发一个权限控制的界面,这样我们就能很方便的创建角色,并分配给用户不同角色和不同权限. 1.编写角色管理页面 这个编写较为简单,主要是通过 ...

  3. 使用 Casbin 作为 ThinkPHP 的权限控制中间件

    PHP-Casbin 是一个强大的.高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理. Think-Casbin 是一个专为 ThinkPHP5.1 定制的 Casbin 的扩展包,使开发 ...

  4. thinkphp 后台权限列表

    核心代码: // 检测用户权限权限 public function admin_priv($action){ $action_list = session('user.action_list'); i ...

  5. thinkphp自定义权限管理之名称判断

    权限管理,就是给不同的用户分配不同的权限.当用户登录或者操作时候进行判断,来阻止用户进行权限以外的操作.本次讲的是当用户登录一刻,只显示权限开启的内容. 一.建立数据库. 1.权限表funcla.来存 ...

  6. RABC --权限控制解读

    一.基于RBAC的概念介绍 1.RBAC(Role-Based Access Control )基于角色的访问控制. 2.RBAC认为权限的过程可以抽象概括为:判断[Who是否可以对What进行How ...

  7. RABC权限控制(二级菜单实现)

    目前大部分系统由于用户体验,基本上菜单不会做的很深,以二级菜单为例,做了一个简单的权限控制实现,可精确到按钮级别(基于django),下面具体看看实现 1.表结构的设计 无论开发什么都需要先梳理清楚需 ...

  8. ThinkPHP中RBAC权限带菜单栏显示和详细权限操作

    RBAC是什么,能解决什么难题? RBAC是Role-Based Access Control的首字母,译成中文即基于角色的权限访问控制,说白了也就是用户通过角色与权限进行关联[其架构灵感来源于操作系 ...

  9. spring security实现动态配置url权限的两种方法

    缘起 标准的RABC, 权限需要支持动态配置,spring security默认是在代码里约定好权限,真实的业务场景通常需要可以支持动态配置角色访问权限,即在运行时去配置url对应的访问角色. 基于s ...

随机推荐

  1. 【小知识】神经网络中的SGD优化器和MSE损失函数

    今天来讲下之前发的一篇极其简单的搭建网络的博客里的一些细节 (前文传送门) 之前的那个文章中,用Pytorch搭建优化器的代码如下: # 设置优化器 optimzer = torch.optim.SG ...

  2. 49-Ubuntu-其他命令-1-文件软链接

    序号 命令 作用 01 ln -s 被链接的原文件 链接文件 建立文件的软链接,用通俗的方式讲类似于Windows下的快捷方式 注意: 没有-s选项建立的是一个硬链接文件--->>两个文件 ...

  3. vue on emit 父子之间传值应用详细代码

    大概很多人都知道用这个,网上教程也一大堆,但我想说的是一定要手动敲一遍,敲一遍,敲一遍,重要的事情说三遍. 大概有些人也不知道它该何时用on,或者emit 的吧? 先说两个我项目中用到的场景吧: 项目 ...

  4. python中while与else的联姻

    循环使用 else 语句在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断 ...

  5. rest framework之APIView

    一.rest framework配置 1.安装rest framework 在django环境中安装rest-framework框架: (automatic) C:\Users\Administrat ...

  6. 每天进步一点点-深度学习入门-基于Python的理论与实现 (2)

    今天要补上两天的 不补了,新手,看的比较慢-- 手写识别例子跳过先 思考如何实现数字5的识别 三种方法: 训练数据:学习,寻找最优解 测试数据:评价模型能力. 损失函数:以损失函数为线索寻找自由权重参 ...

  7. python系统模块

    Python中大多数系统接口都集中在两个模块:sys和os.这么说有点过于简单化 还有一些其他的表转模块也属于这个领域他们包括: glob 用于文件名的扩展 socket 用于网络连接和进程间通信(I ...

  8. bzoj1026题解

    [解题思路] 数位DP.f[i][j]表示以j结尾的i位数中windy数的个数,转移方程f[i][j]=Σf[i-1][k](|j-k|>1). 基于f数组,我们可以统计出1~n内的windy数 ...

  9. NTT数论变换

    数论变换NTT 前置知识 FFT:NTT的思想和FFT一样(FFT介绍) 概述 数论变换,即NTT(Number Theory Transformation?),是基于数论域的FFT,一般我们默认FF ...

  10. NX二次开发-UFUN创建球UF_MODL_create_sphere1

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建球 UF_FEATURE_SIGN ...