【问题标题】:Laravel automatically logged out after few seconds?Laravel 几秒钟后自动注销?
【发布时间】:2015-06-03 17:24:44
【问题描述】:

我正在使用 Laravel 5 和带有 RESTFUL apis 的 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 异常。我被这个问题困住了。

【问题讨论】:

  • 对我来说这个错误是因为在 php.ini 文件中将 always_populate_raw_post_data = -1 更改为 always_populate_raw_post_data = 1 ......最后我改变了它到 always_populate_raw_post_data = 0 一切正常

标签: php angularjs session laravel laravel-5


【解决方案1】:

现在我不是 100% 确定(根据您的设置,我什至不能说我 90% 确定)但是在将我的 session_driverfile 更改为 database 之后,我似乎已经解决了这个问题 - 也就是说,如果它是同一个问题。

我想对我的应用做同样的事情 - 在页面启动时,我提出 6 个请求(这是开发,我会将其更改为 一个所以请不要哭)。如果我加载此页面,它可以处理大约 3 或 4 个请求,然后其他 2-3 个返回 unauthorised 响应。它也只在需要middleware => auth 的请求时发生。

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

解决方案:

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

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

【讨论】:

  • 感谢您的评论。当我将会话从文件更改为数据库时。它现在工作正常..
【解决方案2】:

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

【讨论】:

  • 我认为你是对的。我不知道究竟是什么原因造成的,但我在使用user 实例时对代码进行了更改,它解决了。也许我正试图访问user,当时它是null 或类似的东西。
【解决方案3】:

可能对某人有用:遇到同样的问题。我在会话设置中更改了 cookie 名称。默认情况下是 laravel_session,所以尝试将其设置为其他内容

【讨论】:

    【解决方案4】:

    设法弄清楚了.. 由于我几乎所有项目都使用 laravel,我忘记更改会话名称,结果,一个会话覆盖了另一个会话,导致自动注销.. 所以如果你运行多个 laravel 项目,确保它们都有不同的会话名称。希望这对将来的人有所帮助! Here is a Laracast thread on this issue.

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

    1. 已清除浏览器的 localhost cookie。
    2. app/session.php 中更改了cookie 键的值。
    3. php artisan config:clear

    【讨论】:

      【解决方案5】:

      我通过使用 php artisan cache:clear 清除缓存并运行 composer dump-autoload 解决了同样的问题。希望这对你有用。

      【讨论】:

        【解决方案6】:

        这周我遇到了类似的问题。我有一个带有多个 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 之类的东西下。

        我希望这对可能最终遇到同样问题的人有所帮助。

        【讨论】:

          【解决方案7】:

          我认为您为新应用程序复制了一个旧项目,因此您需要更改config/session.php

          'cookie' => 'new_session',
          

          【讨论】:

            【解决方案8】:

            我有一个类似的问题,用户根本没有登录,我发现它是因为我的可验证的 eloquent 模型,在 config/auth.php 的身份验证守卫中指定(在我的情况下是用户) .

            我正在应用一个全局范围(在我的情况下已验证),以便用户被特定列过滤& auth guard 找不到用户所以它每次都注销...

            我通过这篇帖子https://laracasts.com/discuss/channels/laravel/ignore-global-scopes-for-auth解决了我的问题

            【讨论】:

              猜你喜欢
              • 2018-02-05
              • 2011-12-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-11
              相关资源
              最近更新 更多