L'exemple de cet article décrit l'utilisation du plug-in Srbac de Yii. Je le partage avec vous pour votre référence. Les détails sont les suivants :
Le rbac de Yii, depuis le début de l'installation de l'extension du module arbc jusqu'au débogage et à l'analyse de ses principes, cela a pris beaucoup de temps par intermittence. Bien sûr, après l'avoir compris, vous constaterez que l'abrc de Yii est très pratique et vous permet d'implémenter facilement le contrôle d'accès aux ressources, ce qui est très puissant. Je vais maintenant trier mes notes d'étude et les partager. Bien que le composant authMangner implémente rbac, il n'implémente pas la gestion de l'édition visuelle. Actuellement, il existe deux modules d'extension officiels, Srbac et Right. Nous les utilisons pour gérer visuellement les rôles, les tâches et les opérations de manière très pratique.
Le contrôle d'accès basé sur les rôles est un contrôle d'accès centralisé simple mais puissant. Le composant authManager basé sur Yii Framework implémente un RBAC hiérarchique, ce qui peut nous aider à résoudre certains problèmes d'accès au contrôle des ressources rencontrés lors du développement.
Pour ces deux modules d'extension, les fonctions sont en réalité similaires, mais l'interface est différente. En fonction du style que vous aimez, choisissez simplement le module à tester. Quant à l'installation et au débogage, il vous suffit de les télécharger, et il y a des introductions détaillées à l'intérieur. Analysons le principe d'implémentation du composant authManager.
Le projet d'autorisation consiste à déterminer si un utilisateur est autorisé à exploiter une ressource spécifique en vérifiant si l'utilisateur appartient à un rôle autorisé à accéder à la ressource. Ici, nous devons comprendre la relation entre les projets, les rôles, les tâches et les opérations autorisés.
1. Les projets d'autorisation peuvent être divisés en rôles, tâches et opérations
2. Un rôle peut être composé de plusieurs tâches
3. 🎜>4 .L'opération est une autorisation et ne peut être divisée.
userid varchar ( 64) L'ID utilisateur est l'identifiant de la table utilisateur dans votre propre projet
texte bizrule Règle métier, un morceau de code php
texte de données Tableau sérialisé utilisé pour fournir des paramètres à bizrule
|
|-------- 0 signifie Opération
| -- ------ 1 signifie Tâche
|-------- 2 signifie Rôle
texte bizrule Règle métier, un morceau de code php
texte de données Tableau sérialisé, utilisé pour fournir des paramètres à bizrule
enfants varchar(64) nom de l'objet enfant . [Nom de la tâche, peut également être une opération] ;
if(Yii::app()->user->checkAccess(what,$params)) { //what --- role,或者task,也可以是operation, //params --- 是传进业务规则的参数key-value; }
<🎜. >
Ce qui suit démontrera le fonctionnement spécifique d'un utilisateur supprimant des articles :
$params=array('uid'=>$id); if(Yii::app()->user->checkAccess('delArticle',$params)) { //检查当前用户是否有删除文章权限 //并且使用业务规则,检查用户id等于文章里面的作者id //通过验证,就执行删除操作 }
public function init() { //操作权限表,必须存在以下字段: //itemname角色名/ID, //type授权项目类型/1(任务)或者2(角色), //bizrule权限/逻辑运算表达式为false是有权限操作, //data数据/YII暂无利用 Yii::app()->authManager->itemTable = 'AuthItem'; //会员组-权限对应表,必须存在以下字段: //child子角色/ID, //parent父角色/ID,此表可循环执行,可多级继承 Yii::app()->authManager->itemChildTable = 'uthItemChild'; //会员-会员组对应表,会员组可直接为操作名称,必须存在以下字段: //itemname角色名/ID, //userid用户名/ID, //bizrule权限/逻辑运算表达式为false是有权限操作, //data数据/YII暂无利用 Yii::app()->authManager->assignmentTable = 'zd_mem_glog'; }
class ProductController extends SBaseController { ........ } class SBaseController extends Controller { ........ }
protected function beforeAction($action) { //载入模块分隔符 $del = Helper::findModule('srbac')->delimeter; //取得前模块名称 $mod = $this->module !== null ? $this->module->id . $del : ""; $contrArr = explode("/", $this->id); $contrArr[sizeof($contrArr) - 1] = ucfirst($contrArr[sizeof($contrArr) - 1]); $controller = implode(".", $contrArr); $controller = str_replace("/", ".", $this->id); // 生成静态页面 模块+分隔符+控制器(首字母大写)+方法(首字母大写)例: model-ControllerAction if(sizeof($contrArr)==1){ $controller = ucfirst($controller); } $access = $mod . $controller . ucfirst($this->action->id); //验证访问页面地址是否在总是允许列表里面,是返回有权限 if (in_array($access, $this->allowedAccess())) { return true; } //验证SRBAC有无安装,没在安装,返回的权限访问 if (!Yii::app()->getModule('srbac')->isInstalled()) { return true; } //验证SRBAC有无开启,没在开启,返回的权限访问 if (Yii::app()->getModule('srbac')->debug) { return true; } // 权限验证 if (!Yii::app()->user->checkAccess($access) || Yii::app()->user->isGuest) { $this->onUnauthorizedAccess(); } else { return true; } }
public function getAuthAssignments($userId) { $rows=$this->db->createCommand() ->select() ->from($this->assignmentTable) ->where('userid=:userid', array(':userid'=>$userId)) ->queryAll(); $assignments=array(); foreach($rows as $row) { if(($data=@unserialize($row['data']))===false) $data=null; $assignments[$row['itemname']]=new CAuthAssignment($this,$row['itemname'],$row['userid'],$row['bizrule'],$data); } return $assignments; }
public function getAuthItem($name) { $row=$this->db->createCommand() ->select() ->from($this->itemTable) ->where('name=:name', array(':name'=>$name)) ->queryRow(); if($row!==false) { if(($data=@unserialize($row['data']))===false) $data=null; return new CAuthItem($this,$row['name'],$row['type'],$row['description'],$row['bizrule'],$data); } else return null; }
protected function checkAccessRecursive($itemName,$userId,$params,$assignments) { if(($item=$this->getAuthItem($itemName))===null) return false; Yii::trace('Checking permission "'.$item->getName().'"','system.web.auth.CDbAuthManager'); if(!isset($params['userId'])) $params['userId'] = $userId; if($this->executeBizRule($item->getBizRule(),$params,$item->getData())) { if(in_array($itemName,$this->defaultRoles)) return true; if(isset($assignments[$itemName])) { $assignment=$assignments[$itemName]; if($this->executeBizRule($assignment->getBizRule(),$params,$assignment->getData())) return true; } $parents=$this->db->createCommand() ->select('parent') ->from($this->itemChildTable) ->where('child=:name', array(':name'=>$itemName)) ->queryColumn(); foreach($parents as $parent) { if($this->checkAccessRecursive($parent,$userId,$params,$assignments)) return true; } } return false; }
La construction de l'environnement du thème SRBAC et comment l'intégrer dans notre projet spécifique (vous pouvez le mettre dans le répertoire des modules puis effectuer quelques configurations dans le fichier de configuration) comme mentionné ci-dessus
public function executeBizRule($bizRule,$params,$data) { return $bizRule==='' || $bizRule===null || ($this->showErrors ? eval_r($bizRule)!=0 : @eval_r($bizRule)!=0); }
rôles correspond aux noms de tous les rôles dont notre système a besoin
opérations correspond aux noms de toutes les opérations spécifiques dont nous avons besoin pour gérer les autorisations (Par exemple, pour une action spécifique, nous n'autorisons qu'un certain rôle à y accéder)
在SRBAC的主界面我们可以看到三个icon,分别对应于不同的操作。
我们就先来新建一些我们需要的数据信息(对应于第一个icon):
新建具体的operation:这里的operation的命名需要注意,必须是ControllernameActionname的格式。controller、action的名字组合,且二者的首字母都必须要大写。
新建具体的task:一个task可以对应于多个operation,我们可以按照相应的功能来命名task。例如:可以使用News Management 来表示新闻管理的task。这里的命名没有严格的格式要求,只要做到见名知意即可。
新建具体的roles:这个很简单,就是输入我们需要的角色而已。
ok,数据新建完毕。接下来我们就来到assign页面(对应于第二个icon),对具体的数据来进行映射设置了。
根据前面所说的,将operations分配给各个task,然后我们再将tasks分配给具体的role。
最后再给user指定roles。
到这一步,我们的权限配置基本就结束了。
这时,我们可以通过点击第三个icon来查看我们具体的用户的权限信息时候正确。
确认无误以后,我们就可以来进行我们的权限验证了。
不过,在此之前还有最后一步,我们要确认已经关闭了SRBAC的debug模式。
因为查看源代码我们会发现,如果debug模式是开启状态的话,我们的权限管理是不会起作用的。
可以到config/main.php来进行查看:
'modules' => array( 'srbac' => array( 'userclass' => 'User', 'userid' => 'id', 'username' => 'username', 'debug' => false,//confirm this field
到这一步,我们的权限模块就可以work了。去检查一下我们的配置是否正常吧,呵呵
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。