2014-12-10 18 views
16

Czy istnieje sposób przekierowania na stronę inną niż logowanie w metodzie zachowań w Yii 2?Przekierowanie do strony innej niż logowanie w Yii 2 Zachowania

Moi zachowania treści metoda:

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' => ['?'], 
       ], 
      ], 
     ], 
    ]; 
} 

Ale przekierowuje się zalogować. Trzeba określić inną stronę przekierowania lub zadzwoń:

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

Odpowiedz

16

Musisz zmienić loginUrl własność yii\web\User klasie.

Jeśli chcesz zmienić globalnie, edytować config:

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

Jeśli trzeba zmienić go w konkretnym sterownikiem lub działania, można również ustawić go tak:

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

Musisz zastąpić metodę beforeAction() w kontrolerze, gdzie musisz to zrobić. Wszystkie zdarzenia dostępu są wykonywane w tym wydarzeniu.

/** 
* @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; 
    } 
} 

Więcej szczegółów sprawdzić oficjalnej dokumentacji o property i event.

+0

Czy istnieje sposób na wdrożenie tego w kontroli dostępu w funkcji zachowań? – user7282

+0

Sprawdziłem kod źródłowy i myślę, że nie jest to możliwe. Zobacz zaktualizowaną odpowiedź. – arogachev

+0

Więc nie mogę wywołać wyjątku 403 lub 404, jeśli dostęp jest zabroniony? – user7282

7

Można korzystać z denyCallback(), jak Yii2 „s oficjalny dokument określa go:

wywołania zwrotnego, która będzie wywoływana, gdy dostęp powinien być zabroniony do bieżącego user.If nie jest ustawiona, denyAccess() zostanie wywołany.

Podpis zwrotnego powinna być następująca:

function ($rule, $action) 

gdzie $rule jest regułą, że zaprzecza użytkownika, a $action jest obecny przedmiot działania. $rule może mieć wartość null, jeśli dostęp jest zabroniony, ponieważ żadna z reguł nie jest zgodna.

Jako przykład:

'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

Czy możesz pokazać mu funkcję behawioralną? – user7282

+0

Zrozumiałem, że pytanie to zmienia loginUrl. Jeśli potrzebujesz odwrotnej logiki do rzucania wyjątków i przekierowania, tak, to zamknięcie może być użyte. – arogachev

+0

nie pokazuje błąd 403, kiedyś jak to 'denyCallback' => function ($ zasada, $ action) { \t \t \t if (Yii :: $ app-> user-> isGuest) {throw new \ yii \ web \ HttpException (403, "Żądany element nie został znaleziony."); \t \t \t} \t \t \t \t \t \t \t \t \t \t \t} – user7282

1

używam yii2 użytkownikowi na zarządzanie użytkownikami oraz przekierowanie do logowania jechał/user/login zamiast zdefiniował yii2-user/user/security/Zaloguj Się. więc moja poprawka polegała na aktualizacji reguł adresu urlManager za pomocą: '' => 'user/security /'

Domyślam się, że można to wykorzystać do przekierowania do innego kontrolera/działania innego niż logowanie.

Zobacz here.

+1

Powyższy link nie rozwiązuje się, użyj [http://www.yiiframework.com/doc-2.0/guide-runtime-routing.html](http: //www.yiiframework.com/doc-2.0/guide-runt-routing.html). –

Powiązane problemy