이 글은 주로 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('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']); } }
이제 인증 메소드의 기능을 설명하겠습니다. 위의 리디렉션의 경우 로그인한 관리자가 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 권한) 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!