2015-06-19 3 views
2

У меня возникли проблемы с частью входа. Я читаю эту тему: http://www.yiiframework.com/wiki/771/rbac-super-simple-with-admin-and-user/. Затем я следую его шагам, но на шаге 6. он конфигурируется только для одного контроллера. У меня есть модуль под названием Admin с множеством контроллеров, и я не знаю, как применить этот контроль доступа ко всему модулю. Может кто-нибудь мне помочь ? Извините за мой плохой английский.Контроль доступа модуля в Yii2

ответ

2

Вы можете создать AdminController класс, который будет проходит yii\web\Controller где вы определяете правила доступа в behaviors способом и сделать другие контроллеры модуля расширить метод AdminController и переопределить behaviors так:

public function behaviors() 
{ 
    return \yii\helpers\ArrayHelper::merge(parent::behaviors(), [ 
     'verbs' => [ 
      'class' => VerbFilter::className(), 
      'actions' => [ 
       'delete' => ['post'], 
      ], 
     ], 
    ]); 
} 

Здесь parent::behaviors() являются поведение от AdminController, которые определяют правила доступа по умолчанию, и вы объединяете их с определенным поведением в вашем дочернем контроллере. Это дает вам возможность переопределить некоторые правила доступа, если вам нужно.

+0

Так Yii2 Модуль не имеет метод поведения, не так ли? – user1571234

+1

@ user1571234 он имеет, и если вы хотите иметь правила доступа для всего модуля, и ни один из его контроллеров не будет иметь разные правила доступа, вы можете определить их в методе 'behaviors' модуля. Определение правил доступа в родительском контроллере и их наследование дает вам большую гибкость, если вам нужно различное поведение для некоторых ваших контроллеров. – Tony

+0

Большое спасибо – user1571234

0

сделать пользовательскую модель AccessRules.php, как показано ниже:

<?php 
namespace app\models; 


class AccessRules extends \yii\filters\AccessRule 
{ 

    /** 
    * @inheritdoc 
    */ 
    protected function matchRole($user) 
    { 
     if (empty($this->roles)) { 
      return true; 
     } 
     foreach ($this->roles as $role) { 
      if ($role === '?') { 

       if ($user->getIsGuest()) { 
        return true; 
       } 
      } elseif ($role === '@') { 
       if (!$user->getIsGuest()) { 
        return true; 
       } 
      // Check if the user is logged in, and the roles match 
      } elseif (!$user->getIsGuest() && (int)$role === $user->identity->user_role) { 
       return true; 
      } 
     } 

     return false; 
    } 
} 
?> 

Теперь откройте ваш контроллер сайта и добавьте следующий код в поведении фикции части:

use app\models\AccessRules; 
public function behaviors() 
    { 
     return [ 
      'access' => [ 
        'class' => AccessControl::className(), 
    // We will override the default rule config with the new AccessRule class 
    'ruleConfig' => [ 
     'class' => AccessRules::className(), 
    ], 
    'only' => ['create', 'update', 'delete','index'], 
    'rules' => [ 
     [ 
      'actions' => ['create', 'update', 'delete','index'], 
      'allow' => true, 
      // Allow admin to create 
      'roles' => [ 
       '1' 
      ], 
     ] 
    ], 
      ], 
      'verbs' => [ 
       'class' => VerbFilter::className(), 
       'actions' => [ 
        'logout' => ['post'], 
       ], 
      ], 
     ]; 
    } 
+0

для большей ясности, вы использовали 'user_role'. Роль 'column' создается со значением по умолчанию' 10', при использовании передовых и текущих миграций Yii2. Не то, чтобы вы не могли его изменить :) На всякий случай кто-то спотыкается здесь, я хотел, чтобы эта разница была отмечена. –

2

Я могу предложить вариант метода из статьи, о которой вы упомянули. сделать первые 2 шага, как это было описано, и затем выполните следующие действия:

1. Добавить поле role в модели пользователя и оценивать его с thevalue одной из констант из примера статьи (User :: ROLE_ADMIN или Пользователь :: ROLE_USER)

2. Override юй \ Web \ User-> может()

public function can($permissionName, $params = [], $allowCaching = true) 
{ 
    /** @var \app\models\User $user */ 
    $user = $this->identity; 
    $access = false; 
    do { 
     if (\Yii::$app->user->isGuest) { 
      break; 
     } 

     if ($user->role === \common\models\User::ROLE_ADMIN) { 
      $access = true; 
      break; 
     } 

     if (is_array($permissionName)) { 
      $access = in_array($user->role, $permissionName); 
     } else { 
      $access = $permissionName === $user->role; 
     } 
    } while (false); 

    return $access; 
} 

Итак, теперь вы можете проверить роль пользователя, как это:

\Yii::$app->user->can(User::ROLE_USER) 

3. Вы говорите:

я не знаю, как применить этот контроль доступа ко всему модулю.

Затем откройте класс модуля и добавьте следующие строки в поведения() метод:

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'rules' => [ 
       [ 
        'allow' => true, 
        'roles' => [User::ROLE_ADMIN] 
       ] 
      ] 
     ] 
    ]; 
} 

В этом примере мы предоставить доступ к ROLE_ADMIN ко всем действиям всех контроллеров модуля. Вот и все.

0

В соответствии с «Yii2 Guide « ACF - это фильтр действий, который может использоваться в контроллере или модуле »таким же образом.

0

Просто добавьте ниже код в контроллер, который вы хотите, чтобы ограничить функциональность

 'access' => [ 
      'class' => AccessControl::className(), 

      'rules' => 
      [ 
       [ 
        'actions' => ['index','view'], 
        'allow' => true, 
        'roles' => ['@'] 
       ], 

       [ 
        'actions' => ['create','update','delete'],        
        'allow' => true, 
        'roles' => ['@'], 

        'matchCallback' => function ($rule, $action) 
        { 
          return Admin::isUserAdmin(Yii::$app->user->identity->username); 
        } 
       ], 
      ], 

     ], 
Смежные вопросы