thinkphp5를 사용하여 역할 기반 액세스 제어(rbac 권한) 구현

little bottle
풀어 주다: 2023-04-06 08:44:01
앞으로
4987명이 탐색했습니다.

이 글은 주로 thinkphp5를 사용하여 역할 기반 접근 제어(rbac 권한)를 구현하는 방법에 대해 설명합니다. 도움이 필요한 친구들이 참고할 수 있도록 공유하고 싶습니다.

 먼저 데이터베이스를 만듭니다.

예: 테스트 데이터베이스를 만든 다음 test_admin(관리자 테이블), test_role, test_auth라는 3개의 테이블을 만듭니다.

이것은 새로 생성된 테스트 라이브러리

admin 테이블

새로 생성된 admin 테이블입니다. 이 테이블은 관리 배경의 사용자인 user 테이블입니다.

이 테이블의 issuper 필드는 최고 관리자인지 여부를 나타냅니다. 이 최고 관리자는 모든 역할을 관리하고 모든 권한을 실행할 수 있습니다.

admin_role_id 이 필드는 주로 최고 관리자를 제외한 관리자에 해당하는 역할 테이블 ID를 설명합니다. 아래에서는 역할 테이블을 제공합니다.

Role 테이블

이 테이블은 역할 테이블입니다. 관리자의 admin_role_id는 관리자가 어떤 역할 관리에 있는지 알 수 있습니다.

권한 테이블

이 테이블은 권한 테이블이며, 그의 기본 ID는 역할 테이블의 role_auth_id에 해당하며, 다른 역할을 결정할 수 있습니다. 다른 권한이 있습니다.

  웹사이트 백엔드 관리 페이지에 로그인하면 다양한 관리자의 역할과 역할 권한이 표시됩니다.

tinkphp 관리자 파일의 모델 레이어에서 application 비즈니스 처리를 위한 Admin.php, Role.php, Auth.php를 생성합니다.

그런 다음 컨트롤러 레이어에 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;]);
}

    
}
로그인 후 복사

이제 인증 메소드의 기능을 설명하겠습니다. 위의 리디렉션의 경우 로그인한 관리자가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:cnblogs.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!