Maison >développement back-end >tutoriel php >Utilisez thinkphp5 pour implémenter un contrôle d'accès basé sur les rôles (autorisations rbac)
Cet article parle principalement de l'utilisation de thinkphp5 pour implémenter un contrôle d'accès basé sur les rôles (autorisations rbac) et le partage avec tout le monde pour faciliter la référence des amis dans le besoin.
Un
Créez d'abord une base de données
Par exemple : créez une base de données de test puis créez-en 3 ; Les tables sont : test_admin (table de l'administrateur), test_role, test_auth.
Il s'agit de la bibliothèque de tests nouvellement créée
Table administrateur
Il s'agit de la table admin nouvellement créée. Cette table est la table utilisateur, qui est l'utilisateur en arrière-plan de gestion.
Le champ issuper de ce tableau indique s'il s'agit d'un super administrateur. Ce super administrateur peut gérer tous les rôles et exécuter toutes les autorisations.
admin_role_id Ce champ décrit principalement l'identifiant de la table des rôles correspondant aux administrateurs autres que les super administrateurs.
Table des rôles
Cette table est la table des rôles. Son identifiant principal et l'admin_role_id de l'administrateur peuvent indiquer dans quelle gestion de rôle se trouve l'administrateur. Table des autorisationsCette table est une table d'autorisations, et son identifiant principal correspond au role_auth_id de la table des rôles. On peut en conclure que différents rôles ont des autorisations d'exécution différentes.二.
Connectez-vous à la page de gestion backend du site Web pour afficher les rôles et les autorisations de rôle des différents administrateurs.
Créer un administrateur .php, Role.php et Auth.php dans la couche modèle du fichier admin de l'application tinkphp pour le traitement métier
. Créez ensuite index.php dans la couche contrôleur
<?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']); } }Maintenant, laissez-moi vous expliquer la fonction de la méthode d'authentification ci-dessus est de rediriger si le gestionnaire connecté Si l'adresse URL saisit une adresse qui n'appartient pas à ses autorisations, nous le redirigerons vers sa propre page de gestion et le contenu du CommonController hérité
<?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>'); } } } }
Three
Contrôle des autorisations
L'administrateur se connecte en arrière-plan pour accéder à l'activité d'exploitation qui appartient à sa propre autorité Si l'administrateur le souhaite. pour sauter le niveau pour le visualiser, il ne le fera pas. Pour les entreprises qui ont leurs propres autorisations, le contrôleur redirigera l'administrateur vers leur propre page d'opération
Le CommonModel ci-dessus est. appelé dans CommonController pour ajuster le niveau d'autorisation de l'administrateur Jugement.<?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; } } }
Tutoriels associés :
Tutoriel vidéo PHPCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!