yii2 RBAC使用DbManager实现后台权限判断的方法_php实例
本文实例讲述了yii2 RBAC使用DbManager实现后台权限判断的方法。分享给大家供大家参考,具体如下:
首先根据文档生成yii2 框架中的表
yii migrate --migrationPath=@yii/rbac/migrations/
生成如下4表:
auth_assignment
auth_item_child
auth_item
auth_rule
使用yii的gii快速生成对应的model,但是由于auth_item表同时存储角色跟权限,由于后面我们要分角色跟权限来做curd操作,所以我这里新建了一个RoleForm和PermissionForm两个model来区分开角色与权限。由于角色跟权限紧紧相连,又在auth_item生成的model中多加一个属性$child,后面会用到现在先不管。
下面是角色model的相关代码
<?php namespace app\models; use Yii; use app\models\AuthItem; use yii\rbac\Item; /* * 角色model * 指尖上的艺术家 */ class RoleForm extends AuthItem { public function init() { parent::init(); $this->type = Item::TYPE_ROLE;//yii-rbac-Role隐藏继承常量这里的值是1 } }
下面是权限model的相关代码
<?php namespace app\models; use Yii; use app\models\AuthItem; use yii\rbac\Item; /* * 权限model * 指尖上的艺术家 */ class PermissionForm extends AuthItem { public function init() { parent::init(); $this->type = Item::TYPE_PERMISSION;//常量值 2 } }
另外在AuthItem模型中增加一个属性
<?php class AuthItem..... public $child;//用于角色权限添加 ......
现在到我们对应的控制器了
首先我们说权限控制器写控制器的时候要用到系统自带的扩展
。。。
use yii\rbac\Permission;
。。。
/* * 权限添加 */ public function actionCreate() { $model = new PermissionForm(); if( $model->load( Yii::$app->request->post() ) && $model->validate() ) { //rbac中permission对象 $permission = new Permission(); $permission->name = trim( $model->name ); $permission->type = $model->type; //权限添加 Yii::$app->authManager->add( $permission ); } }
修改的时候 其他的不变就是换了个方法
/* * param string $name 修改的权限名 * param Object $permission 跟添加一样提交上来的数据 */ Yii::$app->authManager->update( $name, $permission );
这里是删除
//Returns the named permission. $permission = Yii::$app->authManager->getPermission( $name ); //Removes a permission or rule from the RBAC system. Yii::$app->authManager->remove( $permission );
权限的cud都搞定了,查看就不写了
下面是角色控制器
带上这个
use yii\rbac\Role; /* * 角色添加 */ public function actionCreate() { $model = new RoleForm(); if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) { //实例化角色对象 $role = new Role(); $role->name = $model->name; $role->type = $model->type; //添加角色 Yii::$app->authManager->add( $role ); } //权限列表( 添加角色的时候我们就可看到当前有没有权限来添加 ) $permissions = $this->loadPermission(); //将$model跟$permissions....渲染到视图就好了 }
/* * 修改 * param string $name 修改的角色名 * param Object $role 跟添加一样提交上来的数据 */ $bool = Yii::$app->authManager->update( $name, $role );
删除的时候就比较麻烦了
/* * param string $name 角色名 */ $role = Yii::$app->authManager->getRole( $name );//获取当前角色对象 //Returns the child roles. $childAll = Yii::$app->authManager->getChildren( $role ); if ( isset($childAll) ) {//逐一删除权限 foreach ($childAll as $value) { //Returns the named permission. $perObj = Yii::$app->authManager->getPermission($value); //Removes a child from its parent. Yii::$app->authManager->removeChild( $role, $perObj ); } } Yii::$app->authManager->remove( $role );//最后删除我们的角色了
最最关键的就是我们要给角色赋予权限对吧,如下代码
//当前角色所拥有的权限 $childArray = $this->loadRolePermission( $model->name );//这个就是返回权限数组 if ( !empty( $childArray ) ) { $model->child = $childArray; } else { $model->child = array(); } //Returns all permissions in the system. $permissions = Yii::$app->authManager->getPermissions(); $perArr = array(); foreach ($permissions as $key => $value) { $perArr[$value->name] = $value->name; } if ( $model->load( Yii::$app->request->post() ) && $model->validate() ) { //角色对象 $child = isset( $_POST['AuthItem']['child'] ) ? $_POST['AuthItem']['child'] : NULL; //表单无法验证child所以当为空的时候跳回原页面 if ( empty( $child ) ) { return $this->redirect(..你们要跳的页面..); } //判断角色是否分配权限,已分配则删除,反之增加新的 if ( !empty( $childArray ) ) { //Removed all children form their parent. $bool = Yii::$app->authManager->removeChildren( $model ); if ( !$bool ) { throw new HttpException(404, '别想糊弄我!凑你一脸~~~'); } } //当前角色对象 $role = Yii::$app->authManager->getRole( $model->name ); //child权限添加 if( isset( $child ) ) { foreach ( $child as $val) { //获取权限 $childObj = Yii::$app->authManager->getPermission($val); //给item_child表写入数据(权限表) Yii::$app->authManager->addChild( $role, $childObj ); } return $this->redirect(..你们要跳的页面..); } }
最后就是我们最后一个控制器了角色与用户关联
/* * 创建角色跟用户之间关联的关键部分代码 */ //Returns the named role. $role =Yii::$app->authManager->getRole( $roleName ); // Assigns a role to a user. Yii::$app->authManager->assign( $role, $userId );<pre name="code" class="php">/* * 权限检测 * param int| string $userId 用户id * param string $permission 权限名 */ Yii::$app->authManager->checkAccess( $userId , $permission ) )
下面是判断权限的
/* * 权限检测 * param int| string $userId 用户id * param string $permission 权限名 */ Yii::$app->authManager->checkAccess( $userId , $permission ) )
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

La solution au problème de connexion en arrière-plan de Discuz est révélée. Des exemples de code spécifiques sont nécessaires Avec le développement rapide d'Internet, la construction de sites Web est devenue de plus en plus courante, et Discuz, en tant que système de création de sites Web de forum couramment utilisé, a été favorisé par. de nombreux webmasters. Cependant, précisément en raison de ses fonctions puissantes, nous rencontrons parfois des problèmes lors de l'utilisation de Discuz, comme des problèmes de connexion en arrière-plan. Aujourd'hui, nous allons révéler la solution au problème de connexion en arrière-plan de Discuz et fournir des exemples de code spécifiques. Nous espérons aider ceux qui en ont besoin.

Êtes-vous inquiet du code tronqué du backend WordPress ? Essayez ces solutions, des exemples de code spécifiques sont nécessaires. Avec l’application généralisée de WordPress dans la construction de sites Web, de nombreux utilisateurs peuvent rencontrer le problème d’un code tronqué dans le backend WordPress. Ce type de problème entraînera l'affichage de caractères tronqués dans l'interface de gestion en arrière-plan, causant de gros problèmes aux utilisateurs. Cet article présentera quelques solutions courantes pour aider les utilisateurs à résoudre le problème des caractères tronqués dans le backend WordPress. Modifiez le fichier wp-config.php et ouvrez wp-config.

Titre : Exception de connexion au compte en arrière-plan Discuz, comment y faire face ? Lorsque vous utilisez la gestion backend du système de forum Discuz, vous pouvez parfois rencontrer une connexion anormale au compte. Cela peut être dû à diverses raisons, notamment un mot de passe erroné, un compte bloqué, des problèmes de connexion réseau, etc. Lorsque nous sommes confrontés à cette situation, nous devons résoudre le problème par un dépannage et un traitement simples. Vérifiez si le numéro de compte et le mot de passe sont corrects : Tout d'abord, confirmez si le numéro de compte et le mot de passe que vous avez saisis sont corrects. Lors de la connexion, assurez-vous que la majuscule est correcte et que le mot de passe est

Comment supprimer jquery de yii2 : 1. Modifiez le fichier AppAsset.php et commentez la valeur "yii\web\YiiAsset" dans la variable $depends ; 2. Modifiez le fichier main.php et ajoutez la configuration comme "'yii" sous le champ "components" \web\JqueryAsset' => ['js' => [],'sourcePath' => null,]," pour supprimer le script jquery.

Comment désactiver l’exécution d’un logiciel en arrière-plan dans Win11 ? Nous utilisons certains logiciels. Lorsque nous ne les utilisons pas, nous fermerons le logiciel. Certains logiciels fonctionneront toujours en arrière-plan après leur fermeture. Pendant le processus d'exécution en arrière-plan, l'ordinateur provoquera un certain décalage. . Certains amis veulent savoir ce qu'il faut faire. Comment désactiver l'exécution d'un logiciel en arrière-plan dans Win11. L'éditeur ci-dessous a compilé les étapes pour désactiver l'exécution du logiciel en arrière-plan dans Win11. Si vous êtes intéressé, suivez l'éditeur et jetez un œil ci-dessous ! Étapes pour désactiver le logiciel exécuté en arrière-plan dans win11 : 1. Appuyez sur la touche de raccourci "win+X" et sélectionnez "Paramètres" parmi les options indiquées ci-dessus. 2. Après avoir accédé à la nouvelle interface, cliquez sur « Applications », puis recherchez « Applications et fonctionnalités » sur la droite. 3. Dans celui-ci, recherchez « Informations Microsoft » et cliquez sur

La connexion en arrière-plan à Discuz a échoué ? Apprenez-vous à le résoudre facilement ! Comme Discuz, en tant que plate-forme de forum populaire, est largement utilisé dans la construction et la gestion de sites Web, vous rencontrerez parfois des échecs de connexion au backend, ce qui est troublant. Aujourd'hui, nous allons discuter des problèmes pouvant entraîner l'échec de la connexion au backend de Discuz, fournir des solutions et joindre des exemples de code spécifiques. J'espère que cet article pourra aider les webmasters et les développeurs qui rencontrent des problèmes similaires. 1. Le dépannage consiste à résoudre le problème de l'échec de la connexion en arrière-plan de Discuz.

Avec la popularité des applications Internet, nous espérons protéger les données contenues dans l'application afin de garantir que les données sensibles ne soient pas utilisées à mauvais escient ou volées. L'une des solutions consiste à utiliser le contrôle d'accès basé sur les rôles (RBAC). Le contrôle d'accès basé sur les rôles (RBAC) est un modèle de contrôle d'accès basé sur la relation entre les utilisateurs et les rôles. L'idée centrale de ce modèle est de lier le rôle de l'utilisateur à l'opération de contrôle d'accès, plutôt que de lier l'opération de contrôle d'accès directement à l'utilisateur. Cette approche améliore la flexibilité du contrôle d'accès,

La commutation entre différentes applications est réalisée grâce à la commutation avant et arrière des processus. Contexte : une fois que Linux a démarré un programme, il passe en arrière-plan pour son exécution et souhaite continuer à fonctionner sous Linux. Sous Linux, vous pouvez utiliser les méthodes suivantes pour démarrer un programme et le quitter en arrière-plan, tout en gardant son processus en cours d'exécution : 1. Linux démarre un programme à exécuter en arrière-plan 1. Utilisez nohup et & : $nohupyour_program& Utilisez la commande nohup faire Le programme ignore le signal de raccrochage (SIGHUP) afin que le programme continue de s'exécuter même si vous quittez le terminal. Le symbole & entraîne l'exécution du programme en arrière-plan. 2. Utilisez ctrl+Z : Si vous avez démarré le programme au premier plan, vous pouvez utiliser ct
