2015-12-27 15 views
12

Buduję bardzo prostą aplikację w Laravel 5.2, ale kiedy używamy akcji AuthController do wylogowania, po prostu nie działa. Mam pasek nawigacji, który sprawdza Auth::check() i nie zmienia się po wywołaniu akcji wylogowania.Laravel 5.2: Auth :: logout() nie działa

mam tę drogę wewnątrz pliku routes.php:

Route::get('users/logout', 'Auth\[email protected]');

i to poza stwierdzeniem

Route::group(['middleware' => ['web']], function().

Próbowałem również dodać następującą akcję na końcu pliku AuthController.php.

public function getLogout() 
{ 
    $this->auth->logout(); 
    Session::flush(); 
    return redirect('/'); 
} 

Czy masz jakieś pomysły?

EDIT 1

Gdybym wyczyścić pamięć podręczną Google Chrome, to działa.

+0

Co to znaczy "nie działa"? Czy mógłbyś szczegółowo wyjaśnić, jakie działania wykonujesz i co dokładnie nie działa? –

+0

Witam @ MarcinNabiałek. Zmontowałem to pytanie. Mam nadzieję, że lepiej to wyjaśnimy. –

+0

Twoja trasa wylogowania nie może znajdować się poza grupą "middle" oprogramowania pośredniczącego. Powinno być w środku. –

Odpowiedz

6

zastosowanie poniżej kod

Auth::logout(); 

lub

auth()->logout(); 
36

miałem podobne problem laravel 5.2. Należy zmienić trasę tak, aby

Route::get('auth/logout', 'Auth\[email protected]'); 

lub konstruktora AuthController dodać

public function __construct() 
{ 
    $this->middleware('guest', ['except' => ['logout', 'getLogout']]); 
} 

który pracował dla mnie.

+0

Dzięki. Sprawdzę to później i jeśli to zadziała, zaakceptuję to jako odpowiedź. –

+0

@Aztecnologic Ten poprawiony * mój * problem. Nie wiem, dlaczego musimy napisać niestandardową metodę wylogowania w Laravel 5.2 - nie musiałem w 5.1. No cóż. – tenub

+0

Dzięki. Rozwiązałem też mój problem. Jakieś wyjaśnienie, dlaczego? Wygląda na to, że jest powiązany z aktualizowaniem z wersji 5.1 do 5.2 podczas korzystania ze starego repozytorium standardowego laravel/laravel. – lorey

1

Powinno to być treść konstruktora w AuthController

$this->middleware('web'); 
$this->middleware('guest', ['except' => 'logout']); 
2

W Http->Middleware->Authenticate.php zmiany login w else do /

return redirect()->guest('/'); 

i zdefiniować następującą trasę w routes.php

Route::get('/', function() { 
    return view('login'); 
}); 

do wylogowania się Poniższa funkcja:

public function getlogout(){ 
    \Auth::logout(); 
    return redirect('/home'); 
} 

Ważne: przekierować do /home zamiast / że najpierw wywołuje $this->middleware('auth'); a następnie w middleware przekierować do /

4

problem jest z 'guest' middleware w konstruktorze AuthController .Powinien on być zmieniony z $this->middleware('guest', ['except' => 'logout']); do $this->middleware('guest', ['except' => 'getLogout']);

Jeśli zaznaczysz plik jądra, można zobaczyć, że middleware gość wskaż \App\Http\Middleware\RedirectIfAuthenticated::class

tej warstwy pośredniej kontroli, jeśli użytkownik jest uwierzytelniony i przekierowuje użytkownika na stronę root, jeśli uwierzytelniony, ale pozwala użytkownikowi wykonać akcję, jeśli nie zostanie uwierzytelniona. Używając $this->middleware('guest', ['except' => 'getLogout']);, oprogramowanie pośrednie nie zostanie zastosowane po wywołaniu funkcji getLogout, co umożliwi uwierzytelnionym użytkownikom korzystanie z niego.

N/B: Tak jak w oryginalnej odpowiedzi, można zmienić getLogout na logout, ponieważ metoda getLogout po prostu zwraca metodę wylogowania w implementacji laravel.

0

dodać tę linię do pliku routes.php Route :: get ('auth/logout', 'Auth \ AuthController @ getLogout'); i dodać w widoku a href = „{{url («/ auth/wylogowania»)}}”> Wyloguj to działa dobrze dla mnie

0

Wystarczy dodać poniżej szlaku i nie dodawać tego wewnątrz każdej trasie grupa (middleware):

Route::get('your-route', 'Auth\[email protected]'); 

teraz wylogowania powinien działać tak jak powinien w L 5,2, bez zmiany czegokolwiek w AuthController.

0
/** 
* Log the user out of the application. 
* 
* @param \Illuminate\Http\Request $request 
* @return \Illuminate\Http\Response 
*/ 
public function logout(Request $request) 
{ 
    $this->guard()->logout(); 

    $request->session()->flush(); 

    $request->session()->regenerate(); 

    return redirect('/'); 
} 

/** 
* Get the guard to be used during authentication. 
* 
* @return \Illuminate\Contracts\Auth\StatefulGuard 
*/ 
protected function guard() 
{ 
    return Auth::guard(); 
}