2014-09-23 10 views
23

W mojej aplikacji Yii2 próbuję zmusić wszystkich użytkowników do uwierzytelnienia. Jeśli nie są jeszcze uwierzytelnione, powinny zostać przekierowane na stronę logowania.Globalny filtr/zachowanie Yii2 zmuszające użytkownika do uwierzytelnienia najpierw

W Yii1 zrobiłem to, tworząc klasę, która sprawdzi, czy użytkownik był zalogowany i dołączając tę ​​klasę do zachowania onBeginRequest w moim głównym pliku konfiguracyjnym.

// Yii 1 
'behaviors' => array(
    'onBeginRequest' => array(
     'class' => 'application.components.RequireLogin', 
    ) 
), 

Jak mogę uzyskać takie samo zachowanie w Yii2? Wiem, że mogę użyć tego zachowania, ale nie chcę dodawać tego zachowania do mojego głównego pliku konfiguracyjnego, więc wszystkie żądania są najpierw sprawdzane pod kątem uwierzytelniania.

Sposób zachowania pracy wygląda następująco:

// Yii2 
public function behaviors() { 
    return [ 
     'access' => [ 
      'class' => AccessControl::className(), 
      'rules' => [ 
       [ 
        'actions' => ['login', 'error'], 
        'allow' => true, 
       ], 
       [ 
        'allow' => true, 
        'roles' => ['@'], 
       ], 
      ], 
     ], 
    ]; 
} 
+0

Czy próbowałeś dodać kontrolę dostępu do kontrolera base? – karlingen

Odpowiedz

28

Ok, więc musiałem dodać następujący kod poniżej 'components' => [...]

'as beforeRequest' => [ 
    'class' => 'yii\filters\AccessControl', 
    'rules' => [ 
     [ 
      'actions' => ['login', 'error'], 
      'allow' => true, 
     ], 
     [ 

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

Czytaj więcej o formacie: http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html#configuration-format

+10

Wskazówka: ten kod dodaje zachowanie do aplikacji. Nie musi być częścią komponentów - musi być częścią samej konfiguracji. Dlatego właśnie jagsler napisał ** poniżej ** komponentów, a nie _wszystkich składników. A '' jak someNameHere '=> ... 'jest składnią dodawania zachowań. Zajrzyj tutaj [doc] (http://www.yiiframework.com/doc-2.0/guide-concept-configurations.html#configuration-format). Po prostu to piszę, ponieważ spędziłem kilka godzin na odkrywaniu tego. – robsch

+0

Bardzo ładne. Oszczędza mój czas. – israr

+0

Kolejna uwaga: musisz mieć kontroler i akcję 'site/login', ponieważ zostanie ona wywołana, jeśli użytkownik nie jest zalogowany i żadna reguła nie ma zastosowania. Można to zmienić w konfiguracji (zobacz [tutaj] (http://www.yiiframework.com/doc-2.0/yii-web-user.html), aby uzyskać więcej informacji), jeśli akcja logowania ma inną nazwę lub jest innym kontrolerem . – robsch

-1

I w rzeczywistości nie jestem zorientowany w Yii2 (ale bardzo mocno w Yii1).

Jednym z rozwiązań, które można zastosować w Yii1 i jak sądzę również w Yii2 jest posiadanie metody filtrowania w klasie kontrolera nadrzędnego. Zazwyczaj pojedynczy kontroler służy jako kontroler nadrzędny. Jeśli go nie masz, utwórz go i wszyscy powinni go rozszerzyć. Możesz to zaimplementować nie jako filtr, ale w innych metodach tego "kontrolera głównego" (init()?) Jeśli cała aktywność przechodzi przez klasę kontrolera, to jesteś ustawiony.

Powiązane problemy