Heim  >  Artikel  >  php教程  >  Detaillierte Erläuterung der Verwendung des Srbac-Plug-Ins von Yii

Detaillierte Erläuterung der Verwendung des Srbac-Plug-Ins von Yii

高洛峰
高洛峰Original
2016-12-30 16:05:431478Durchsuche

Das Beispiel in diesem Artikel beschreibt die Verwendung des Srbac-Plug-Ins von Yii. Ich teile es Ihnen als Referenz mit:

Yiis rbac, vom Beginn der Installation der arbc-Modulerweiterung bis zum Debuggen und Analysieren seiner Prinzipien hat es zeitweise viel Zeit gedauert. Nachdem Sie es verstanden haben, werden Sie natürlich feststellen, dass Yiis abrc sehr praktisch ist und Ihnen die einfache Implementierung des Ressourcenkontrollzugriffs ermöglicht, was sehr leistungsstark ist. Jetzt werde ich meine Studiennotizen sortieren und sie teilen. Obwohl die authMangner-Komponente rbac implementiert, implementiert sie keine visuelle Bearbeitungsverwaltung. Derzeit gibt es zwei offizielle Erweiterungsmodule, Srbac und Right. Wir nutzen sie, um Rollen, Aufgaben und Vorgänge sehr komfortabel visuell zu verwalten.

Rollenbasierte Zugriffskontrolle ist eine einfache, aber leistungsstarke zentralisierte Zugriffskontrolle. Die auf Yii Framework basierende authManager-Komponente implementiert hierarchisches RBAC, was uns helfen kann, einige während der Entwicklung aufgetretene Zugriffsprobleme bei der Ressourcensteuerung zu lösen.

Bei diesen beiden Erweiterungsmodulen sind die Funktionen eigentlich ähnlich, die Schnittstelle ist jedoch unterschiedlich. Je nachdem, welcher Stil Ihnen gefällt, wählen Sie das Modul zum Testen aus. Was die Installation und das Debuggen angeht, müssen Sie sie nur herunterladen, und im Inneren finden Sie detaillierte Einführungen. Lassen Sie uns das Prinzip der Implementierung der authManager-Komponente analysieren.

Beim Autorisierungsprojekt geht es darum, zu bestimmen, ob ein Benutzer eine bestimmte Ressource bedienen darf, indem überprüft wird, ob der Benutzer einer Rolle angehört, die die Berechtigung zum Zugriff auf die Ressource hat. Hier müssen wir die Beziehung zwischen autorisierten Projekten, Rollen, Aufgaben und Vorgängen verstehen.

1. Autorisierungsprojekte können in Rollen, Aufgaben und Vorgänge unterteilt werden.
Eine Aufgabe kann aus mehreren Vorgängen bestehen 🎜>4 .Der Vorgang ist eine Erlaubnis und kann nicht geteilt werden.

Wir sollten hier auch erwähnen, dass es sich bei der Ausgabe von Geschäftsregeln tatsächlich um einen Teil des PHP-Codes handelt, der bei der Überprüfung von Berechtigungen ausgeführt wird.

Nachfolgend analysieren wir die Rbac-Implementierung, die drei Tabellen erfordert: die Struktur von Authhassignment, Authitem und Authitemchild:

itemname varchar(64) Rollenname, Groß-/Kleinschreibung beachten

userid varchar ( 64) Benutzer-ID ist die ID der Benutzertabelle in Ihrem eigenen Projekt

bizrule-Text Geschäftsregel, ein Stück PHP-Code
Datentext Serialisiertes Array, das zur Bereitstellung von Parametern für bizrule verwendet wird

Name varchar ( 64) Die Elementnamen in der Authentifizierung sind gleich

Typ Ganzzahl Typidentifikation (0,1,2)

|

|-------- 0 bedeutet Operation
| -- ------ 1 bedeutet Aufgabe
|-------- 2 bedeutet Rolle

Beschreibungstext Zugehörige Beschreibung

Bizrule-Text Geschäftsregel, ein Stück PHP-Code

Datentext Serialisiertes Array, das zur Bereitstellung von Parametern für Bizrule verwendet wird

parent varchar(64) parent name, [role name, can also a task];

children varchar(64) child object name . [Aufgabenname, kann auch eine Operation sein];


Verwenden Sie die Überprüfungsmethode CWebUser::checkAccess(). Das Folgende ist eine Democode-Beschreibung:

if(Yii::app()->user->checkAccess(what,$params)) {
  //what  --- role,或者task,也可以是operation,
  //params --- 是传进业务规则的参数key-value;
}

Im Folgenden wird der spezifische Vorgang eines Benutzers beim Löschen von Artikeln veranschaulicht:

$params=array('uid'=>$id);
if(Yii::app()->user->checkAccess('delArticle',$params)) {
  //检查当前用户是否有删除文章权限
  //并且使用业务规则,检查用户id等于文章里面的作者id
  //通过验证,就执行删除操作
}
1. Berechtigungsregeltabelle festlegen: kann in der Modulmodulkonfigurationsdatei platziert werden

2. Implementieren Sie die Regeln, und der Controller erbt die Basisklasse SBaseController, ursprünglich Controller

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';
}

3. SBaseController erbt die Basisklasse Controller und fügt beforeAction voran, um die Berechtigungsüberprüfung zu realisieren.

class ProductController extends SBaseController
{
    ........
}
class SBaseController extends Controller
{
    ........
}

4. CDbAuthManager liest die aktuelle Benutzerrolle

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;
  }
}

5. CDbAuthManager liest die entsprechenden Berechtigungen der Rolle

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;
}

6. CDbAuthManager liest die entsprechenden Operationen der Berechtigungen

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;
}

7. CAuthManager-Verifizierungsautorität

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;
}

3. SRBAC-Test

Einige Dinge Zu beachten in den SRBAC-Konfigurationsinformationen

Der Aufbau der SRBAC-Themenumgebung und wie man sie in unser spezifisches Projekt integriert (Sie können sie im Modulverzeichnis ablegen und dann einige Konfigurationen in der Konfigurationsdatei vornehmen), wie oben erwähnt

public function executeBizRule($bizRule,$params,$data)
{
  return $bizRule==='' || $bizRule===null || ($this->showErrors ? eval_r($bizRule)!=0 : @eval_r($bizRule)!=0);
}
Bei der Installation können wir wählen, ob einige Testdaten generiert werden sollen. Natürlich spielt es keine Rolle, ob sie nicht generiert werden. Wir können einige Daten manuell gemäß den Regeln konfigurieren.

Bevor wir die Datenkonfiguration einführen, müssen wir ein wenig Verständnis für das Funktionsprinzip des SRBAC-Moduls haben:

Das SRBAC-Modul ist die Zuordnung zwischen Rollen--Aufgaben--Operations-Beziehungen werden zur Implementierung der Berechtigungskontrolle verwendet.

Benutzer entspricht unseren Benutzern


Rollen entspricht den Namen aller Rollen, die unser System benötigt

Operationen entspricht den Namen aller spezifischen Vorgänge, die wir zum Verwalten von Berechtigungen benötigen (Für eine bestimmte Aktion erlauben wir beispielsweise nur einer bestimmten Rolle den Zugriff)

在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程序设计有所帮助。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn