2017-02-15 4 views
0

Nachdem ich mit yii2 Access Control Filter herumgespielt habe, kam ich um diese Answer herum, was mir sehr hilft. Ich habe versucht, den Zugriff zu beschränken, indem Sie folgendermaßen vorgehen:Yii2 Eingeschränkter ZugriffControlFilter Logic

Basierend auf this Tutorial habe ich eine AccessRule erstellt. Ich habe die folgende Logik hinzugefügt.

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

Während die $user->can("admin") Methode aus this einfachen Authentifizierungsmodul yii2 Benutzer kommt.

Also meine Idee ist es, alles standardmäßig zu beschränken und Aktionen/Seiten zu öffnen, falls nötig.

ich folgendes meiner config (web.php)

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

Das heißt, der Benutzer, der die Rolle Admin hat hinzugefügt wird erlaubt, alles zu tun. Alle anderen Rollen/Benutzer (Gäste, @ oder ~ (angemeldet, aber keine Admin-Rolle)) dürfen jetzt nichts mehr tun.

Natürlich sollte ein Benutzer mit der Rolle ~ etwas tun dürfen. So öffnete ich die Erlaubnis für einen Controller und hinzugefügt, um das folgende Verhalten

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

Unfortanatly den Benutzer mit der Rolle ~ noch kann nicht Zugang der Aktion Index für diese spezified Controller.

So ist meine Logik/Denken unpassend?

Ist das Problem, dass die Sequenz die Zugriffskontrollfilter aufruft?

+0

versuchen @ statt ~ – bxN5

+0

@Roman Controller-Verhalten zu '@' geändert; Benutzer kann immer noch nicht auf die Seite – Luc

Antwort

0

ich wie folgt aus:

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

und das ist mein Verhalten() Funktion:

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']); 
         }, 
        ], 
       ], 
      ], 
     ]; 
    } 

Und nach, als ich check() Funktion zu erstellen:

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

Wenn check permission return true, dann ist der Benutzer berechtigt, ansonsten ist der Benutzer nicht berechtigt.

+0

zugreifen, soweit ich aus Ihrem Code lesen kann, mit Ihrer Lösung muss ich die Verhaltensfunktion für jeden Controller hinzufügen/ändern. Meine Idee ist es, zu sagen, lass die Erlaubnis für alle zu verweigern und nur spezielle Genehmigungen zu den spezifischen Controller hinzufügen. – Luc