Laravel在用户级定制了session.lifetime

时间:2017-07-21 21:56:02

标签: php session laravel-5 laravel-5.2

我正在覆盖其中一个中间件(对于Laravel Web应用程序)中的session.timeout值,但它似乎并没有影响会话的超时时间。虽然如果我调试它显示我已覆盖的值。

Config::set('session.lifetime', 1440);

默认值如下:

'lifetime' => 15,

我正在处理的网站对大多数用户的会话有效期非常短,但对于选定的用户,我希望提供延长的会话生命周期。

3 个答案:

答案 0 :(得分:3)

看来,完成动态lifetime值的唯一方法是在启动会话之前在中间件中设置该值。否则为时已​​晚,因为应用程序SessionHandler已使用默认配置值实例化。

namespace App\Http\Middleware;

class ExtendSession
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, $next)
    {
        $lifetime = 2;
        config(['session.lifetime' => $lifetime]);
        return $next($request);
    }
}

然后在kernel.php文件中,在StartSession之前添加此类。

\App\Http\Middleware\ExtendSession::class,
\Illuminate\Session\Middleware\StartSession::class,

答案 1 :(得分:3)

这是对我有用的工具(使用Laravel 5.6或5.5),让用户在登录时选择会话时长。

在Auth控制器中编辑会话的生存期无效,因为此时该会话已经启动。您需要添加在Laravel运行自己的“ StartSession”中间件之前执行的中间件。

一种方法是创建一个cookie,以存储用户的生命周期长度首选项,并在为每个请求设置会话到期时使用该值。

  1. 新文件:app / Http / Middleware / SetSessionLength.php
namespace App\Http\Middleware;

use Illuminate\Support\Facades\Cookie;

class SetSessionLength {

    const SESSION_LIFETIME_PARAM = 'sessionLifetime';
    const SESSION_LIFETIME_DEFAULT_MINS = 5;

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, $next) {
        $lifetimeMins = Cookie::get(self::SESSION_LIFETIME_PARAM, $request->input(self::SESSION_LIFETIME_PARAM)); //https://laravel.com/api/6.x/Illuminate/Support/Facades/Cookie.html#method_get
        if ($lifetimeMins) {
            Cookie::queue(self::SESSION_LIFETIME_PARAM, $lifetimeMins, $lifetimeMins); //https://laravel.com/docs/6.x/requests#cookies
            config(['session.lifetime' => $lifetimeMins]);
        }
        return $next($request);
    }

}
  1. 修改内核:app / Http / Kernel.php

在{em> \App\Http\Middleware\SetSessionLength::class,之前添加\Illuminate\Session\Middleware\StartSession::class,

  1. 修改配置:config / session.php

'lifetime' => env('SESSION_LIFETIME', \App\Http\Middleware\SetSessionLength::SESSION_LIFETIME_DEFAULT_MINS),

  1. 修改:resources / views / auth / login.blade.php

要让用户选择自己喜欢的分钟数,请添加一个分钟数下拉列表,例如以<select name="{{\App\Http\Middleware\SetSessionLength::SESSION_LIFETIME_PARAM}}">开头。否则,将上面的SetSessionLength.php更改为不从$request->input提取,而是从其他地方检索,例如该用户的数据库记录。

答案 2 :(得分:1)

出现问题导致您的用户登录,之后您正在更改会话生存期配置变量。变量已针对当前请求进行了更改,但用户在登录时指定了的会话

您必须更改登录方式。并执行以下步骤:

  1. 尝试用户是否存在于数据库中
  2. 如果是,并且他是需要更长会话生命周期的用户,请运行config(['session.lifetime' => 1440]);
  3. 登录用户
  4. 为当前用户享受更长的会话生命周期
  5. 我建议使用帮助器动态更改配置

    config(['session.lifetime' => 1440]);