>  기사  >  백엔드 개발  >  thinkphp5를 사용하여 역할 기반 액세스 제어(rbac 권한) 구현

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

little bottle
little bottle앞으로
2019-04-22 16:13:384984검색

이 글은 주로 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으로 문의하시기 바랍니다. 삭제