2016-03-10 149 views
1

我有我的身份驗證登錄時這樣做。Auth不堅持在Laravel 5.2

if (Auth::attempt($userdata)) { 
    dd(Auth::user()); //this shows the user just fine, 
         //which proves that the auth driver is working. 
    return redirect()->intended('dashboard'); 
} 

但是,在重定向到儀表板之後。看起來auth不是持久的。如果我做dd(Auth::user())甚至只是Auth::check()它會返回null。

,路線如下:

Route::group(['middleware' => ['web']], function() { 
    Route::get('test',function(){ 
     dd(Auth::user()); //returns null 
     echo Auth::user()->name; // returns Trying to get property of non-object 
    }); 
}); 

我在做什麼錯?

關於這個奇怪的事情是,昨晚它工作。它有點神奇地停止工作。

+0

如果您在'attempt'之後'dd',則會話不一定會持續。如果你只是返回一個空字符串作爲響應而不是你的重定向,並且手動進入測試路由,那麼會發生什麼? – Dencker

+0

另外,不是'attempt',你可以通過調用'login'來進一步調試,並強制登錄一個用戶。這至少會繞開實際授權的潛在問題。這很可能是cookie或會話問題:) – Dencker

回答

0

只需將「auth」中間件添加到「測試」路由中,並在登錄時嘗試訪問它。它不應該以這種方式給您提供任何錯誤。如果您嘗試在未登錄的情況下訪問它,它應該將您重定向到「auth」中間件中定義的任何路由。

通過使用「auth」中間件,您基本上確保Auth :: user()將始終返回適當的User實例。

現在,如果這種方法有效,那麼您可以確定Laravel Auth確實是堅持用戶,而問題在您的代碼中的其他位置。

我沒有注意到Laravel的Auth類有任何問題。

+0

Laravel 5.2使用網絡中間件。不需要auth中間件。但是,如果我添加了Auth中間件,就像你說的那樣。它只是將我重定向回登錄頁面。我覺得奇怪的是,Auth嘗試似乎返回一個有效的登錄名。它只是'忘記它'的重定向。因此,使用「網絡」中間件,我只是在重定向上獲得空白頁面。通過auth中間件,我可以重定向到登錄頁面。 – KyleK

+0

Web中間件具有CSRF和XSS保護功能,它不會檢查用戶是否已登錄。 只是想指出,您可以實際檢查Auth是否正在執行將用戶登錄到通過保護通過「網絡」中間件保護您的組內的一條路線,以確保Auth運行正常。如果是(不允許你訪問,如果沒有登錄),那麼你的問題是在你的代碼中的其他地方:) –

+0

好的,但即使添加auth中間件後,我只是在登錄時重定向,回到登錄頁面。即使Auth控制器中的dd(Auth :: user())顯示登錄用戶?所以我說的是,登錄似乎在爲一個請求工作,但在重定向時,它不會持續,因此重定向回登錄頁面。試過會話驅動程序,數據庫驅動程序,文件驅動程序的一切似乎沒有什麼工作 – KyleK

0

對此的解決方案不是一個明顯的解決方案,特別來自老版本的laravel。
感謝這個鏈接。 Auth Session killed in Laravel 5.2
我能解決它,所以我會發布答案,以幫助其他人遇到同樣的問題。

本來我只是在我的路線中有這個。

Route::post('app/login', 'Auth\[email protected]'); 

Route::group(['middleware' => ['web','auth']], function() { 
    Route::get('test',function(){ 
     dd(Auth::user());// was always returning null 
    }); 
}); 

但是,要獲得登錄堅持,我不得不這樣做

Route::group(['middleware' =>[ 'web']], function() { 
    Route::post('app/login', 'Auth\[email protected]'); 
}); 

Route::group(['middleware' => ['web','auth']], function() { 
    Route::get('test',function(){ 
     echo Auth::user()->name; 
    }); 
}); 

顯然任何途徑多數民衆贊成要打電話或註冊一個會話需要採用「網絡」的中間件。