Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  php  >  正文 用thinkphp5 实现基于角色的访问控制(rbac权限)

用thinkphp5 实现基于角色的访问控制(rbac权限)

发布时间:2020-12-29   编辑:www.jquerycn.cn
jquery中文网为您提供用thinkphp5 实现基于角色的访问控制(rbac权限)等资源,欢迎您收藏本站,我们将为您提供最新的用thinkphp5 实现基于角色的访问控制(rbac权限)资源
本篇文章主要讲述了用thinkphp5 实现基于角色的访问控制(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[0]->issuper == 1){ //超级管理员拥有全部权限; //一级权限;   $authA = $this->auth->where(['auth_level']=>0)->select(); //二级权限   $authB = $this->auth->where(['auth_level'=>1])->select(); } else {   //权限ids;   $role_auth_ids = $this->role->where(['role_id'=>$admin_role_id])->select();   $authA = $this->auth->where('auth_level' , 0)->where('auth_id' , 'in' , $role_auth_ids)->select();   $authB  = $this->auth->where('auth_level' , 1])->where('auth_id' , 'in' , $role_auth_ids)->select(); }    $auth = array('authA'=>$authA , 'authB'=>$authB);   $this->redirect('admin/'.$auth['authA'][0]->auth_c.'/'.$auth['authA'][0]->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[0]->$admin_role_id;   if($resAdmin[0]->issuper == 1){   //超级管理员super拥有全部权限;  //一级权限;   $authA = $this->auth->where(['auth_level'=>0])->select();  //二级权限;   $authB = $this->auth->where(['auth_level'=>1])->select(); }  else {   //权限ids   $role_auth_ids = $this->role->where(['role_id'=>$admin_role_id])->select();   $role_auth_ids = $role_auth_ids[0]->role_auth_ids;    $authA = $this->auth->where('auth_level' , 0)->where('auth_id' , 'in' , $role_auth_ids)->select();   $authB = $this->auth->where('auth_level' , 1)->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 中被调用 , 来进行管理员权限等级的判断.

相关教程:PHP视频教程

以上就是用thinkphp5 实现基于角色的访问控制(rbac权限)的详细内容,更多请关注jquery中文网其它相关文章!

  • 本文转载于:博客园,如有侵犯,请联系jquerycn@qq.com删除
  • 您可能感兴趣的文章:
    Yii授权之基于角色的存取控制 (RBAC)
    用thinkphp5 实现基于角色的访问控制(rbac权限)
    ThinkPHP中RBAC权限带菜单栏显示和详细权限操作
    ASP.NET系统用户权限设计与实现
    浅谈RBAC中几种常见的控制权限模型
    基于 PHP-Casbin 的 ABAC 权限控制
    .NET框架中基于角色的安全性(3)
    《2019年小米春季上海 PHP 实习生招聘面试题》部分答案解析
    浅谈在ASP.NET的权限控制机制
    PHP——thinkphp5的详解介绍与使用

    [关闭]