搜索
首页后端开发php教程用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(&#39;admin_id&#39;);
  $admin_name = session(&#39;admin_name&#39;);

  $resAdmin = $this->admin->where([&#39;admin_id&#39;=>$admin_id])->select();
  if($resAdmin[0]->issuper == 1){
//超级管理员拥有全部权限;
//一级权限;
  $authA = $this->auth->where([&#39;auth_level&#39;]=>0)->select();
//二级权限
  $authB = $this->auth->where([&#39;auth_level&#39;=>1])->select();
} else {
  //权限ids;
  $role_auth_ids = $this->role->where([&#39;role_id&#39;=>$admin_role_id])->select();
  $authA = $this->auth->where(&#39;auth_level&#39; , 0)->where(&#39;auth_id&#39; , &#39;in&#39; , $role_auth_ids)->select();
  $authB  = $this->auth->where(&#39;auth_level&#39; , 1])->where(&#39;auth_id&#39; , &#39;in&#39; , $role_auth_ids)->select();
}

  $auth = array(&#39;authA&#39;=>$authA , &#39;authB&#39;=>$authB);
  $this->redirect(&#39;admin/&#39;.$auth[&#39;authA&#39;][0]->auth_c.&#39;/&#39;.$auth[&#39;authA&#39;][0]->auth_a);

}

public function leftnav()
{
  $admin_id = session(&#39;admin_id&#39;);
  $amin_name = session(&#39;admin_name&#39;);
  //角色id;
  $resAdmin = $this->admin->where([&#39;admin_id&#39;]=>$admin_id)->select();
  $admin_role_id = $resAdmin[0]->$admin_role_id;
  if($resAdmin[0]->issuper == 1){
  //超级管理员super拥有全部权限;
 //一级权限;
  $authA = $this->auth->where([&#39;auth_level&#39;=>0])->select();
 //二级权限;
  $authB = $this->auth->where([&#39;auth_level&#39;=>1])->select();
}  else {
  //权限ids
  $role_auth_ids = $this->role->where([&#39;role_id&#39;=>$admin_role_id])->select();
  $role_auth_ids = $role_auth_ids[0]->role_auth_ids;

  $authA = $this->auth->where(&#39;auth_level&#39; , 0)->where(&#39;auth_id&#39; , &#39;in&#39; , $role_auth_ids)->select();
  $authB = $this->auth->where(&#39;auth_level&#39; , 1)->where(&#39;auth_id&#39; , &#39;in&#39; , $role_aut_ids)->select();
}

  $auth = array(&#39;authA&#39;=>$authA , &#39;authB&#39;=>$authB);
  $this->view->assign(&#39;authA&#39; , $auth[&#39;authA&#39;]);
  $this->view->assign(&#39;authB&#39; , $auth[&#39;authB&#39;]);
}

    
}

 现在我来解释一下上面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(&#39;admin_id&#39;) == null){
  if(strtolower($resquest->controller()) == &#39;index&#39; && strtolower($resquest->action()) == &#39;login&#39;){
  return true;
} else {
 $this->error(&#39;没有登陆!<br /><span style="color:gray;">...</span> &#39;);
}

 $resCommon = $res->auth();
 if(Request::instance()->isAjax()){
  $this->ajaxReturn([&#39;msg&#39;=>&#39;没有操作权限!&#39; , &#39;code&#39;=>&#39;201&#39;] , &#39;json&#39;);
} else {
 $this->error(&#39;没有操作权限!<br><span style="color:gray;">...</span>&#39;);
}
}
}
}

   权限控制

    管理员登陆后台 访问属于自己权限的操作业务 , 如果管理员想要越级查看不属于自己权限的业务 , 控制器 会让管理员重定向到自己的操作页面.

<?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())).&#39;/&#39;.strtolower(trim($request->action()));
        //var_dump($auth_ac);
        $auth = array();
        $res = new AdminModel();
        $resRole = new RoleModel();
        $resAuth = new AuthModel();
        
        $resAdmin = $res->where([&#39;admin_id&#39;=>session(&#39;admin_id&#39;)])->select();
        //非超级管理员控制权限;
        if($resAdmin[0]->issuper != 1){
            $admin_role_id = $resAdmin[0]->admin_role_id;
            //$admin_role_id = $info[&#39;admin_role_id&#39;];
            //$info = $this->info(&#39;Role&#39; , [&#39;role_id&#39;=>$admin_role_id] , &#39;role_auth_ids&#39;);
            $info = $resRole->where(&#39;role_id&#39; , $admin_role_id)->select();
            $role_auth_ids = $info[0]->role_auth_ids;
            $infos = $resAuth->where(&#39;auth_id&#39; , &#39;in&#39; , $role_auth_ids)->select();
            //$infos = $this->infos(&#39;Auth&#39; , [&#39;auth_id&#39;=>[&#39;in&#39; , $role_auth_ids] , &#39;auth_level&#39;=>1] ,&#39;auth_c , auth_a&#39; );
            foreach($infos as $key=>$val){
                $auth[] = $val[&#39;auth_c&#39;].&#39;/&#39;.$val[&#39;auth_a&#39;];
            } 

            $result = array_merge($auth , [&#39;index/auth&#39;] , [&#39;index/login&#39;]);
            //var_dump($result);
            if(in_array($auth_ac , $result)){
                return true;
            } else {
                return false;
            } 

        } else {
            return true;
        }

    }

}

上面的CommonModel 在CommonController 中被调用 , 来进行管理员权限等级的判断.

相关教程:PHP视频教程

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

声明
本文转载于:博客园。如有侵权,请联系admin@php.cn删除
可以在PHP会话中存储哪些数据?可以在PHP会话中存储哪些数据?May 02, 2025 am 12:17 AM

phpsessionscanStorestrings,数字,数组和原始物。

您如何开始PHP会话?您如何开始PHP会话?May 02, 2025 am 12:16 AM

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考虑使用AttActAcks.s.s.4)

什么是会话再生,如何提高安全性?什么是会话再生,如何提高安全性?May 02, 2025 am 12:15 AM

会话再生是指在用户进行敏感操作时生成新会话ID并使旧ID失效,以防会话固定攻击。实现步骤包括:1.检测敏感操作,2.生成新会话ID,3.销毁旧会话ID,4.更新用户端会话信息。

使用PHP会话时有哪些性能考虑?使用PHP会话时有哪些性能考虑?May 02, 2025 am 12:11 AM

PHP会话对应用性能有显着影响。优化方法包括:1.使用数据库存储会话数据,提升响应速度;2.减少会话数据使用,只存储必要信息;3.采用非阻塞会话处理器,提高并发能力;4.调整会话过期时间,平衡用户体验和服务器负担;5.使用持久会话,减少数据读写次数。

PHP会话与Cookie有何不同?PHP会话与Cookie有何不同?May 02, 2025 am 12:03 AM

PHPsessionsareserver-side,whilecookiesareclient-side.1)Sessionsstoredataontheserver,aremoresecure,andhandlelargerdata.2)Cookiesstoredataontheclient,arelesssecure,andlimitedinsize.Usesessionsforsensitivedataandcookiesfornon-sensitive,client-sidedata.

PHP如何识别用户的会话?PHP如何识别用户的会话?May 01, 2025 am 12:23 AM

phpientifiesauser'ssessionusessessionSessionCookiesAndSessionIds.1)whiwSession_start()被称为,phpgeneratesainiquesesesessionIdStoredInacookInAcookInamedInAcienamedphpsessidontheuser'sbrowser'sbrowser.2)thisIdAllowSphptptpptpptpptpptortoreTessessionDataAfromtheserverMtheserver。

确保PHP会议的一些最佳实践是什么?确保PHP会议的一些最佳实践是什么?May 01, 2025 am 12:22 AM

PHP会话的安全可以通过以下措施实现:1.使用session_regenerate_id()在用户登录或重要操作时重新生成会话ID。2.通过HTTPS协议加密传输会话ID。3.使用session_save_path()指定安全目录存储会话数据,并正确设置权限。

PHP会话文件默认存储在哪里?PHP会话文件默认存储在哪里?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器