Laravel 几秒后自动注销?

Laravel automatically logged out after few seconds?

我正在使用 Laravel 5 和 angularJs 以及 RESTFUL api 开发 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 个请求(这是 开发 ,我会将其更改为 one 所以请不要哭泣)。如果我加载此页面,它会处理大约 3 或 4 个请求,然后其他 2-3 个返回 unauthorised 响应。它也只在需要 middleware => auth 的请求时发生。

所以这是我对为什么会发生这种情况的理论: 因为默认情况下,会话 保存在 file - 一次发出多个请求意味着 file 一次被打开 6 次 - 可能搞砸了(取决于你的机器)。因此,将会话更改为旨在一次处理数千个请求的数据库是可行的!

解决方案:

  1. 转到您的 .env 文件并将 SESSION_DRIVER=file 更改为 SESSION_DRIVER=database
  2. 接下来您需要创建会话迁移:php artisan session:table
  3. 现在 composer dump-autoload 好练习。
  4. 最终迁移(php artisan migrate)。

注意: 我不是 100% 确定是否是这种情况,但对我来说这个解决方案有效。我也知道这个问题真的很老,但是我和我一起工作的开发人员都遇到过这个问题而且似乎没有解决方案,所以尽管我 post 这个。

可能是你非法访问用户变量的问题。请在访问 Auth::user() 之前使用 Auth::check() 这似乎适用于我的项目。您可以选择尝试从 .env 文件更改会话驱动程序。

可能对某人有用:有同样的问题。我已经在会话设置中更改了 cookie 名称。默认情况下它是 laravel_session,因此请尝试将其设置为其他值

Managed to figure it out.. Since i use laravel for pretty much all my projects, I forgot to change the session name, as a result, one session was overwriting the other, causing the auto-loggout.. So if you have multiple laravel projects running, make sure they all have different session names. Hope this helps someone in future ! Here is a Laracast thread on this issue.

对我来说,这是解决问题的过程:

  1. 清除了本地主机的浏览器 cookie。
  2. 已更改 app/session.phpcookie 键的值。
  3. 运行php artisan config:clear

我通过使用 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',

我有一个类似的问题,用户根本没有登录,我发现这是因为我的可验证 eloquent 模型,在我的 auth guard 中指定config/auth.php(在我的例子中是用户)。

我正在应用全局范围(在我的情况下已验证),以便按特定列过滤用户,并且 auth guard 找不到用户,因此每次都会注销 ...

我用这个 post https://laracasts.com/discuss/channels/laravel/ignore-global-scopes-for-auth

解决了我的问题