2014-12-10 4 views
16

Gibt es eine Möglichkeit, auf eine andere Seite als Login in Verhalten Methode in Yii 2 umleiten?Umleiten zu einer anderen Seite als Login in Yii 2 Verhalten

Mein Verhalten Methode Inhalt:

public function behaviors() 
{ 
    return [ 
     'verbs' => [ 
      'class' => VerbFilter::className(), 
      'actions' => [ 
       'delete' => ['post'], 
      ], 
     ], 
     'access' => [ 
      'class' => AccessControl::className(), 
      'only' => [ 'create','update' ], 
      'rules' => [ 
       [ 
        'allow' => true, 
        'actions' => [ 'create'], 
        'roles' => ['@'], 
       ], 
       [ 
        'allow' => true, 
        'actions' => ['logout'], 
        'roles' => ['?'], 
       ], 
      ], 
     ], 
    ]; 
} 

Aber es Umleitungen anmelden zu. Ich brauche eine andere Umleitungsseite angeben oder anrufen:

throw new \yii\web\HttpException(403, 'The requested Item could not be found.'); 

Antwort

16

Sie benötigen loginUrl Eigenschaft yii\web\User Klasse zu ändern.

Wenn Sie es ändern global wollen, bearbeiten Sie Ihre config:

'components' => [ 
    'user' => [ 
     'loginUrl' => ['site/sign-in'], 
    ], 
], 

Wenn Sie es in dem bestimmten Controller oder Aktion ändern müssen, können Sie es auch wie folgt festgelegt:

Yii::$app->user->loginUrl = ['site/sign-in']; 

Sie müssen die beforeAction() Methode im Controller überschreiben, wo Sie dies tun müssen. Alle Zugangsprüfungen werden in diesem Fall ausgeführt.

/** 
* @inheritdoc 
*/ 
public function beforeAction($action) 
{ 
    if (parent::beforeAction($action)) { 
     // If you want to change it only in one or few actions, add additional check 

     Yii::$app->user->loginUrl = ['site/sign-in']; 

     return true; 
    } else { 
     return false; 
    } 
} 

Weitere Details überprüfen offizielle Dokumentation über property und event.

+0

Gibt es eine Möglichkeit, dies in der Zugriffskontrolle in der Funktion Verhalten zu implementieren? – user7282

+0

Haben den Quellcode überprüft und ich denke, dass es nicht möglich ist. Siehe aktualisierte Antwort. – arogachev

+0

Also kann ich keine 403 oder 404 Ausnahme aufrufen, wenn der Zugriff verweigert wird? – user7282

7

Sie können von profitieren denyCallback(), als Yii2 ‚s offizielles Dokument definiert es:

Einen Rückruf, wenn der Zugriff aufgerufen wird, soll nicht auf den aktuellen als beste Spieler verweigert werden, DenyAccess() wird aufgerufen.

Die Unterschrift des Callback sollte wie folgt lauten:

function ($rule, $action) 

wo $rule ist die Regel, die den Benutzer verweigert, und $action ist das aktuelle Aktionsobjekt. $rule kann null sein, wenn der Zugriff verweigert wird, weil keine der Regeln übereinstimmt.

Als Beispiel:

'denyCallback' => function($rule, $action) { 
     if ($something) { 
      //set flash for example 
      Yii::$app->session->setFlash('key', 'Value'); 
      //Redirect 
      return $action->controller->redirect('action'); 
     } 
     //as a default behavior, it throws an exception 
     throw new ForbiddenHttpException("Forbidden access"); 
}, 
+0

Kannst du es eine Verhaltensfunktion zeigen? – user7282

+0

Ich habe die Frage als loginUrl geändert. Wenn Sie Invert-Logik zum Auslösen von Ausnahmen und Weiterleiten benötigen, kann diese Schließung verwendet werden. – arogachev

+0

es nicht 403-Fehler nicht zeigt, verwendete ich wie diese 'denyCallback' => function ($ Regel $ action) { \t \t \t if (Yii :: app $> user-> isGuest) { throw new \ yii \ web \ HttpException (403, 'Das angeforderte Objekt wurde nicht gefunden.'); \t \t \t} \t \t \t \t \t \t \t \t \t \t \t} – user7282

1

Ich bin für die Benutzerverwaltung yii2-Benutzer verwenden, und die Umleitung würde/user/login anmelden anstelle des yii2-Benutzer definiert/user/Sicherheit/Anmeldung. also war meine Lösung, die urlManager-Regeln zu aktualisieren mit: '' => 'user/security /'

Ich denke, dies könnte auch verwendet werden, um zu einem anderen Controller/Aktion anders als Login umleiten.

Siehe here.

+1

Der obige Link löst nicht auf, benutze [http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html](http: //www.yiiframework.com/doc-2.0/guide-runtime-routing.html) statt. –

Verwandte Themen