[英]Laravel automatically logged out after few seconds?
我正在使用 Laravel 5 和帶有 RESTFUL api 的 angularJs 開發 Web 應用程序。
使用middleware
進行身份驗證。 我的問題是在同時發送幾個請求后,系統自動注銷並從 laravel 端發送 401 異常。
API 基礎控制器:
class ApiController extends BaseController {
use DispatchesCommands, ValidatesRequests;
function __construct() {
$this->middleware('api.auth');
}
}
中間件:
class APIMiddleware {
/**
* Handle an incoming request.
*
* @param Request $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next) {
if (!Auth::check()) {
abort(401, "Unauthorized");
}
return $next($request);
}
}
登錄控制器
public function login(LoginRequest $request) {
if (Auth::check()) {
Auth::logout();
}
if (Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password')], $request->input('is_remember'))) {
return array(true);
} else {
abort(401, "Invalid email & password");
}
}
幾個請求消失后,服務器注銷並發送 401 異常。 我被這個問題困住了。
現在我不是 100% 確定(並且根據您的設置,我什至不能說我是 90% 確定)但是在將我的session_driver
從file
更改為database
我似乎已經解決了這個問題 - 如果它是同樣的問題。
我想和你一樣用我的應用程序做同樣的事情 - 那是在一個頁面的啟動時,我提出 6 個請求(這是開發,我將把它改成一個,所以請不要哭)。 如果我加載此頁面,它可以處理大約 3 或 4 個請求,然后其他 2-3 個請求返回unauthorised
響應。 它也僅在需要middleware => auth
請求時發生。
所以這是我為什么會發生這種情況的理論:因為默認情況下,會話保存在一個文件中- 一次發出多個請求意味着該文件一次被打開 6 次 - 可能會搞砸(取決於你的機器)。 因此,將會話更改為旨在同時處理數千個請求的數據庫是有效的!
解決方案:
.env
文件並將SESSION_DRIVER=file
更改為SESSION_DRIVER=database
。php artisan session:table
。composer dump-autoload
良好的實踐。php artisan migrate
)。注意:如果是這種情況,我不是 100% 確定,但對我來說,這個解決方案有效。 我也知道這個問題真的很老,但是我合作的開發人員和我自己都遇到了這個問題,而且似乎沒有解決方案,所以盡管我會發布這個。
非法訪問用戶變量可能是一個問題。 請在訪問Auth::user()
Auth::check()
之前使用Auth::check()
這似乎適用於我的項目。 或者,您可以嘗試從 .env 文件更改會話驅動程序。
設法弄明白了.. 因為我幾乎所有的項目都使用 laravel,所以我忘記更改會話名稱,結果,一個會話覆蓋了另一個會話,導致自動注銷.. 所以如果你有多個 laravel正在運行的項目,請確保它們都有不同的會話名稱。 希望這對將來的人有所幫助! 這是有關此問題的 Laracast 線程。
對我來說,這是解決問題的過程:
app/session.php
中cookie
鍵的值。php artisan config:clear
。可能對某人有用:有同樣的問題。 我在會話設置中更改了 cookie 名稱。 默認情況下它是 laravel_session,因此嘗試將其設置為其他內容
我通過使用 php artisan cache:clear 清除緩存並運行 composer dump-autoload 解決了同樣的問題。 希望這對你有用。
這周我遇到了類似的問題。 我有一個帶有多個 Laravel 應用程序的服務器。 一個應用程序正在注銷另一個。
問題與會話管理有關。 所有應用程序的會話名稱都相同。 改變它就足以避免不同的應用程序沖突。 但是,我可以在服務器中擁有相同應用程序的不同實例(例如,出於測試目的)。 因此,僅更改會話名稱是不夠的。
為了正確解決我的問題,我使用會話路徑使每個實例的配置唯一。 在config/session.php
,我定義了如下內容:
'cookie' => 'systemx_session',
'path' => parse_url(env('APP_URL', 'http://localhost'), PHP_URL_PATH),
我將parse_url
函數與環境變量APP_URL
一起使用,因為我的服務器在諸如http://example.com/systemx
東西下部署了實例。
我希望這可以幫助那些可能最終遇到同樣問題的人。
我認為您為新應用程序復制了一個舊項目,因此您需要更改config/session.php
'cookie' => 'new_session',
我有一個類似的問題,用戶根本沒有登錄 & 我發現它是因為我的config/auth.php
雄辯模型,在我的config/auth.php
auth guard 中指定(在我的例子中是用戶)。
我正在應用全局范圍(在我的情況下已驗證),以便用戶被特定列過濾,而身份驗證保護找不到用戶,因此每次都注銷......
我通過這篇文章解決了我的問題https://laracasts.com/discuss/channels/laravel/ignore-global-scopes-for-auth
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.