2015-05-06 7 views
10

In meinem sitecontroller anmelden schreibe ich wie dieseYii2 erfordert alle Regler und Aktion

'access' => [ 
     'class' => AccessControl::className(), 
     'rules' => [ 
      [ 
       'actions' => ['login', 'error'], 
       'allow' => true, 
      ], 
      [ 
       'actions' => ['logout', 'index' ,'call-back'], // add all actions to take guest to login page 
       'allow' => true, 
       'roles' => ['@'], 
      ], 
     ], 
    ], 

Wenn ich also zum Index oder Call-Back-Aktion, werde ich umgeleitet zur Login-Seite. aber ich muss es für alle Aktionen zu jedem Controller tun. Können Sie mir den besten Weg sagen, es zu tun?

Antwort

22

Platz diese Regel am Anfang des rules Abschnitt:

[ 
    'allow' => true, 
    'roles' => ['@'], 
], 

die actions Weglassen alle Maßnahmen.

So Ihre AccessControl Config wird so aussehen:

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

       // ... 
      ], 
     ], 
    ]; 
} 

Beachten Sie, dass Regeln angewandt, um sie deklariert sind.

es ohne Vererbung global zu tun, fügen Sie die as beforeRequest Array unter der components Deklaration in Ihrer Anwendung config (nicht nach innen!):

'components' => [ ... ], 
'as beforeRequest' => [ 
    'class' => 'yii\filters\AccessControl', 
    'rules' => [ 
     [ 
      'allow' => true, 
      'actions' => ['login'], 
     ], 
     [ 
      'allow' => true, 
      'roles' => ['@'], 
     ], 
    ], 
    'denyCallback' => function() { 
     return Yii::$app->response->redirect(['site/login']); 
    }, 
], 

Dieser Code vor jeder Anforderung ausgeführt wird und blockieren alle Aktionen außer login für Gäste.

Stellen Sie sicher, dass es in anderen Controllern als SiteController keine Aktion login gibt. Wenn es sie gibt (und zum Beispiel für unterschiedliche Zwecke), blockieren Sie sie explizit in entsprechenden Controllern. Aber es ist ein ziemlich seltener Fall.

+2

danke für deine antwort. Es funktioniert gut. –

+1

danke, funktioniert wie ein Charme :) – Shqear

+0

@arogachev Es gibt mir Fehler: Benutzer :: identityClass muss eingestellt werden :( – pooria

4

Wenn Sie den „actions“ -Teil aus dem Array vollständig weglassen, wird es für alle Aktionen des Controllers gültig.

Wenn Sie möchten, für jeden Controller, es zu tun, fügen Sie einfach eine Schicht dazwischen:

class MyAccessController extends \yii\web\Controller 
{ 
    public function behaviors() 
    { 
     return [ 
      'access' => [ 
      'class' => AccessControl::className(), 
      'rules' => [ 
       [ 
        'actions' => ['login', 'error'], 
        'allow' => true, 
       ], 
       [ 
        'allow' => true, 
        'roles' => ['@'], 
       ], 
      ], 
     ]; 
    }  
} 

Und dann controller von dieser Klasse ableiten. Oder Sie können es in eine trait setzen und verwenden Sie es mit einem use in jedem Controller hinzufügen.

+0

danke für deine antwort –

5

Wenn Sie die Zugriffskontrolle für alle Ihre Controller-Aktionen hinzufügen möchten. Bitte fügen Sie den folgenden Code in der Hauptkonfigurationsdatei unter dem Abschnitt Komponenten hinzu.

'as access' => [ 
     'class' => \yii\filters\AccessControl::className(),//AccessControl::className(), 
     'rules' => [ 
      [ 
       'actions' => ['login', 'error'], 
       'allow' => true, 
      ], 
      [ 
       'actions' => ['logout', 'index'], // add all actions to take guest to login page 
       'allow' => true, 
       'roles' => ['@'], 
      ], 
     ], 
    ], 
+0

Das ist falsch. ** 1) ** Dieser Code muss nicht im 'components'-Bereich, sondern direkt in' $ config' (auf der darüber liegenden Ebene) hinzugefügt werden, sonst wird er überhaupt nicht funktionieren. ** 2) ** Dieser Teil ''actions' => ['logout', 'index']' erlaubt zusätzlich nur 'logout' und' index' Aktionen für authentifizierte Benutzer, Sie müssen sie entfernen, um den Zugriff für die ganze Seite. Dann können Sie den Zugriff in AccessControl oder Aktionen bestimmter Controller weiter anpassen. Ich erklärte es auch in diesem [Antwort] (http://stackoverflow.com/a/41583420/4323648). – arogachev

+0

Dank arogachev. Vielleicht verwirrt mich meine Aussage. Ich meine unter Komponentenabschnitt bedeutet, wo Komponentenabschnitt endet. Ich wollte diesen Teil des Codes nicht innerhalb des Komponentenbereichs hinzufügen. –

0

versuchen, diese Datei in den folgenden.

frontend/config/main.php 


components =>[ your stuff ], 
'as beforeRequest' => 
      [ 
       'class' => 'yii\filters\AccessControl', 
       'rules' => [ 
           [ 
            'actions' => ['login', 'error'], 
            'allow' => true, 
           ], 
           [ 
            'allow' => true, 
            'roles' => ['@'], 
           ], 
          ], 
      ], 
Verwandte Themen