2017-02-15 6 views
0

После игры с yii2 фильтрами контроля доступа я подошел к этому Answer, что мне очень помогает. Я попытался ограничить доступ, выполнив следующие действия:Yii2 Restricted AccessControlFilter Logic

На основе this учебника я создал AccessRule. Я добавил следующую логику.

... 
// Check if the user is logged in, and the roles match 
} elseif (!$user->getIsGuest() && $role === '#' && $user->can("admin")) { 
    return true; 
} elseif (!$user->getIsGuest() && $role === '~' && $user->can("admin")) { 
    return true; 
} 
... 

В то время как метод $user->can("admin") происходит от this простого модуля аутентификации пользователя yii2.

Итак, я хочу ограничить все по умолчанию и открывать действия/стороны, если это необходимо.

Я добавил следующее к моей конфигурации (web.php)

... 
'as beforeRequest' => [ 
    'class' => 'yii\filters\AccessControl', 
    'ruleConfig' => [ 
       'class' => 'app\components\AccessRule' 
      ], 
    'rules' => [ 
     [ 
      'allow' => true, 
      'roles' => ['#'], 
     ], 
     ... 

Это означает, что пользователь, который имеет роль администратора разрешено делать все. Все остальные роли/пользователи (гости, @ или ~ (вход в систему, но не роль администратора)) до сих пор не могут ничего сделать.

Конечно, пользователю с ролью ~ должно быть разрешено делать некоторые вещи. Так я открыл разрешение на один контроллер и добавил следующее поведение

public function behaviors() 
{ 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'ruleConfig' => [ 
       'class' => AccessRule::className() 
      ], 
      'only' => ['index'], 
      'rules' => [ 
       [ 
        'actions' => ['index'], 
        'allow' => true, 
        'roles' => ['~'], 
       ], 
      ], 
     ], 
... 

Unfortanatly пользователь с ролью ~ еще не может доступа индекс действия для этого spezified контроллера.

Как моя логика/мышление неуместны?

Является ли проблема последовательностью, вызывающей фильтры контроля доступа?

+0

попробуйте @ вместо ~ – bxN5

+0

@Roman изменено поведение контроллера на «@»; пользователь все еще не может получить доступ к сайту – Luc

ответ

0

я так:

$GLOBALS['role'] = json_decode(Yii::$app->session->get('ROLES'), TRUE); // my roles 

и это мое поведение функции():

public function behaviors() { 
     return [ 
      'access' => [ 
       'class' => \yii\filters\AccessControl::className(), 
       'only' => ['create', 'update', 'delete', 'index', 'profile', 'timeline', 'upload'], 
       'rules' => [ 
        [ 
         'actions' => ['index', 'view', 'create', 'update', 'delete', 'profile', 'timeline', 'upload'], 
         'allow' => true, 
         'roles' => ['@'], 
         'matchCallback' => function() { 
          return ($this->CheckPermission()) ? TRUE : $this->redirect(['site/errorpage']); 
         }, 
        ], 
       ], 
      ], 
     ]; 
    } 

И после того, как функции, чем я создаю CheckPermission():

protected function CheckPermission() { 
     $action = $this->action->id; 

     switch ($action) { 
      case 'create': 
       if ($GLOBALS['role'][90]) 
        return TRUE; 
       break; 
      case 'update': 
       if ($GLOBALS['role'][91]) 
        return TRUE; 
       break; 
      case 'delete': 
       if ($GLOBALS['role'][92]) 
        return TRUE; 
       break; 
      case 'index': 
       if ($GLOBALS['role'][93]) 
        return TRUE; 
       break; 

      default: return TRUE; 
     } 
     return FALSE; 
    } 

Если проверить разрешение, вернуть true, тогда пользователь авторизуется, иначе пользователь не авторизован.

+0

, насколько я могу читать из вашего кода, с вашим решением я должен добавить/изменить функцию поведения для каждого контроллера. Моя идея состоит в том, чтобы сказать, позволяет отказывать в разрешении для всех и просто добавлять специальные разрешения для специфицированного контроллера. – Luc