thinkphp5 rbac权限
thinkphp 5 rbac权限
一
先创建一个数据库;
例如:创建一个test数据库;然后创建3个 表分别为:test_admin (管理员表), test_role,test_auth.

这个是新创建的test库

管理员表
这个是新创建的admin表, 这个表是用户表是管理后台的用户。
这个表的issuper这个字段代表是否是超级管理员 , 这个超级管理员可以管理全部的角色和执行所有的权限。
admin_role_id 这个字段主要描述的是除了超级管理员之外的管理员所对应的角色表id 下面我们会给出角色表.

角色表
这个表是角色表,他的主id 和管理员的admin_role_id可以分出管理员都处于什么角色管理.

权限表
这个表是权限表,他的主id 所对应的是角色表的role_auth_id 可以得出不同的角色有着不同的权限可以执行.
二
网站后台管理页面登陆不同的管理员对角色和角色权限的显示.
在tinkphp的application的admin文件的model层创建Admin.php,Role.php,Auth.php进行业务处理.
然后在controller层创建index.php
<?php
namespace app\admin\controller;
use think\Controller;
use think\Url;
use think\Request;
use think\Session;
use app\admin\model\Auth as AuthModel
use app\admin\model\Role as RoleModel class Index extends CommonController
{
public $role;
public $auth;
public $view;
public funtion __construct()
{
$this->role = new RoleModel()
$this->auth = new AuthModel()
$this->view = new View();
} publci function auth()
{
//角色id;
$admin_id = sesison('admin_id');
$admin_name = session('admin_name'); $resAdmin = $this->admin->where(['admin_id'=>$admin_id])->select();
if($resAdmin[]->issuper == ){
//超级管理员拥有全部权限;
//一级权限;
$authA = $this->auth->where(['auth_level']=>)->select();
//二级权限
$authB = $this->auth->where(['auth_level'=>])->select();
} else {
//权限ids;
$role_auth_ids = $this->role->where(['role_id'=>$admin_role_id])->select();
$authA = $this->auth->where('auth_level' , )->where('auth_id' , 'in' , $role_auth_ids)->select();
$authB = $this->auth->where('auth_level' , ])->where('auth_id' , 'in' , $role_auth_ids)->select();
} $auth = array('authA'=>$authA , 'authB'=>$authB);
$this->redirect('admin/'.$auth['authA'][]->auth_c.'/'.$auth['authA'][]->auth_a); } public function leftnav()
{
$admin_id = session('admin_id');
$amin_name = session('admin_name');
//角色id;
$resAdmin = $this->admin->where(['admin_id']=>$admin_id)->select();
$admin_role_id = $resAdmin[]->$admin_role_id;
if($resAdmin[]->issuper == ){
//超级管理员super拥有全部权限;
//一级权限;
$authA = $this->auth->where(['auth_level'=>])->select();
//二级权限;
$authB = $this->auth->where(['auth_level'=>])->select();
} else {
//权限ids
$role_auth_ids = $this->role->where(['role_id'=>$admin_role_id])->select();
$role_auth_ids = $role_auth_ids[]->role_auth_ids; $authA = $this->auth->where('auth_level' , )->where('auth_id' , 'in' , $role_auth_ids)->select();
$authB = $this->auth->where('auth_level' , )->where('auth_id' , 'in' , $role_aut_ids)->select();
} $auth = array('authA'=>$authA , 'authB'=>$authB);
$this->view->assign('authA' , $auth['authA']);
$this->view->assign('authB' , $auth['authB']);
} }
现在我来解释一下上面auth方法的作用是用来重定向的如果登陆的管理者向url地址输入了不属于他的权限的地址我们会让他重定向到他自己的管理页面.
还有继承的CommonController 的内容;
<?php
namspace app\admin\controller;
use think\Controller;
use think\Request;
use app\admin\model\Common as Controller
{
public function __construct()
{
parent::__construct();
$res = new CommonModel();
$resquest = Request::instance(); if(session('admin_id') == null){
if(strtolower($resquest->controller()) == 'index' && strtolower($resquest->action()) == 'login'){
return true;
} else {
$this->error('没有登陆!<br /><span style="color:gray;">...</span> ');
} $resCommon = $res->auth();
if(Request::instance()->isAjax()){
$this->ajaxReturn(['msg'=>'没有操作权限!' , 'code'=>'201'] , 'json');
} else {
$this->error('没有操作权限!<br><span style="color:gray;">...</span>');
}
}
}
}
三
权限控制
管理员登陆后台 访问属于自己权限的操作业务 , 如果管理员想要越级查看不属于自己权限的业务 , 控制器 会让管理员重定向到自己的操作页面.
<?php
namespace app\admin\model;
use think\Model;
use think\Db;
use think\Session;
use think\Request;
use app\admin\model\Admin as AdminModel;
use app\admin\model\Role as RoleModel;
use app\admin\model\Auth as AuthModel; class Common extends Model
{ public function auth()
{
//当前控制器和操作方法;
$request= Request::instance();
$auth_ac = strtolower(trim($request->controller())).'/'.strtolower(trim($request->action()));
//var_dump($auth_ac);
$auth = array();
$res = new AdminModel();
$resRole = new RoleModel();
$resAuth = new AuthModel(); $resAdmin = $res->where(['admin_id'=>session('admin_id')])->select();
//非超级管理员控制权限;
if($resAdmin[0]->issuper != 1){
$admin_role_id = $resAdmin[0]->admin_role_id;
//$admin_role_id = $info['admin_role_id'];
//$info = $this->info('Role' , ['role_id'=>$admin_role_id] , 'role_auth_ids');
$info = $resRole->where('role_id' , $admin_role_id)->select();
$role_auth_ids = $info[0]->role_auth_ids;
$infos = $resAuth->where('auth_id' , 'in' , $role_auth_ids)->select();
//$infos = $this->infos('Auth' , ['auth_id'=>['in' , $role_auth_ids] , 'auth_level'=>1] ,'auth_c , auth_a' );
foreach($infos as $key=>$val){
$auth[] = $val['auth_c'].'/'.$val['auth_a'];
} $result = array_merge($auth , ['index/auth'] , ['index/login']);
//var_dump($result);
if(in_array($auth_ac , $result)){
return true;
} else {
return false;
} } else {
return true;
} } }
上面的CommonModel 在CommonController 中被调用 , 来进行管理员权限等级的判断.
thinkphp5 rbac权限的更多相关文章
- RBAC权限管理
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联. 简单地说,一个用户拥有若干角色,每一个角色拥有若干权限. 这样,就构造成“用户-角 ...
- phpcms中的RBAC权限系统
PHPCMS中的RBAC权限系统主要用到了4张数据表:管理员表,角色表,菜单表,菜单权限表.先来看看数据库的数据表结构: admin 管理员表 ID 字段 类型 Null 默认 索引 额外 注释 1 ...
- yii2 rbac权限控制详细操作步骤
作者:白狼 出处:http://www.manks.top/article/yii2_rbac_description本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出 ...
- yii2 rbac权限控制之菜单menu详细教程
作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- yii2搭建完美后台并实现rbac权限控制实例教程
1.安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 或者参考yii2实战教程之详细安装步骤 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/con ...
- Yii2-admin RBAC权限管理的实现
原文地址:http://www.open-open.com/lib/view/open1434638805348.html http://wlzyan.blog.163.com/blog/stat ...
- 【转】RBAC权限管理
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- ASP.NET 系列:RBAC权限设计
权限系统的组成通常包括RBAC模型.权限验证.权限管理以及界面访问控制.现有的一些权限系统分析通常存在以下问题: (1)没有权限的设计思路 认为所有系统都可以使用一套基于Table设计的权限系统.事实 ...
- ThinkPHP中:RBAC权限控制的实习步骤
使用版本ThinkPHP3.1.3 第一步,建表及数据 第二步,建关联模型 第三步,控制器使用关联模型.配置文件 第四步,模板显示数据 第一步,建表及数据 在数据库中,建立一个companysvn数据 ...
随机推荐
- java线程方法join的总结
虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...
- Yii2用Gii自动生成Module+Model+CRUD
1. 开启gii模块 common/config/main-local.php加入下面代码 return [ 'modules' => [ 'gii' => [ 'class' => ...
- 洗牌算法shuffle
对这个问题的研究始于一次在群里看到朋友发的洗牌面试题.当时也不知道具体的解法如何,于是随口回了一句:每次从剩下的数字中随机一个.过后找相关资料了解了下,洗牌算法大致有3种,按发明时间先后顺序如下: 一 ...
- 智能指针之auto_ptr和scoped_ptr
部分参考地址https://blog.csdn.net/yanglingwell/article/details/56011576 auto_ptr是c++标准库里的智能指针,但是具有以下几个明显的缺 ...
- Ubuntu16.04更换NVIDIA驱动导致无法进入图形界面的解决方案
一.进入recovery模式 由于无法进入图形界面,所以需要在开机时进入恢复模式.我的机器上时在开机时通过引导选项中的recovery mode选项进入,进入之后可以看到许多选项卡,选择root,回车 ...
- JavaScript的DOM_获取和操作层次节点
一.层次节点的概述 节点的层次结构可以划分为:父节点与子节点.兄弟节点这两种.当我们获取其中一个元素节点的时候,就可以使用层次节点属性来获取它相关层次的节点. 二.childNodes 属性 chil ...
- Java连接MQ的实例, 测试类
package cjf.mq.mqclient; import com.ibm.mq.MQC; import com.ibm.mq.MQEnvironment; import com.ibm.mq.M ...
- PHP不定维数组去除空值
最近遇到一个问题,是将不定维数组的空值去除,回来研究了一下,写出来了,不知道是否还能优化 写的不好的,如果有好的想法或者好的实现方法,欢迎提出来,如果哪里写错了,也欢迎大牛可以讲解一下 代码如下,欢迎 ...
- Mac OS系统下配置hosts的方法
首先,介绍下什么是hosts Hosts是一个没有扩展名的系统文件,可以用系统自带的记事本等工具打开,作用就是将一些常用的网址域名与其对应的IP地址建立一个关联,当用户在浏览器输入一个需要登录的网址时 ...
- ASP.NET Web API编程——接口安全与角色控制
1 API接口验证与授权 JWT JWT定义,它包含三部分:header,payload,signature:每一部分都是使用Base64编码的JSON字符串.之间以句号分隔.signature是”h ...