簡體   English   中英

Laravel 幾秒后自動退出?

[英]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_driverfile更改為database我似乎已經解決了這個問題 - 如果它是同樣的問題。

我想和你一樣用我的應用程序做同樣的事情 - 那是在一個頁面的啟動時,我提出 6 個請求(這是開發,我將把它改成一個,所以請不要哭)。 如果我加載此頁面,它可以處理大約 3 或 4 個請求,然后其他 2-3 個請求返回unauthorised響應。 它也僅在需要middleware => auth請求時發生。

所以這是我為什么會發生這種情況的理論:因為默認情況下,會話保存在一個文件中- 一次發出多個請求意味着該文件一次被打開 6 次 - 可能會搞砸(取決於你的機器)。 因此,將會話更改為旨在同時處理數千個請求的數據庫是有效的!

解決方案:

  1. 轉到您的.env文件並將SESSION_DRIVER=file更改為SESSION_DRIVER=database
  2. 接下來您需要創建一個會話遷移: php artisan session:table
  3. 現在composer dump-autoload良好的實踐。
  4. 最后遷移( php artisan migrate )。

注意:如果是這種情況,我不是 100% 確定,但對我來說,這個解決方案有效。 我也知道這個問題真的很老,但是我合作的開發人員和我自己都遇到了這個問題,而且似乎沒有解決方案,所以盡管我會發布這個。

非法訪問用戶變量可能是一個問題。 請在訪問Auth::user() Auth::check()之前使用Auth::check()這似乎適用於我的項目。 或者,您可以嘗試從 .env 文件更改會話驅動程序。

設法弄明白了.. 因為我幾乎所有的項目都使用 laravel,所以我忘記更改會話名稱,結果,一個會話覆蓋了另一個會話,導致自動注銷.. 所以如果你有多個 laravel正在運行的項目,請確保它們都有不同的會話名稱。 希望這對將來的人有所幫助! 這是有關此問題的 Laracast 線程。

對我來說,這是解決問題的過程:

  1. 清除了我的瀏覽器 localhost 的 cookie。
  2. 更改了app/session.phpcookie鍵的值。
  3. 運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM