Laravel在用户级别自定义session.lifetime

dee*_*eej 5 php session laravel-5 laravel-5.2

我正在session.timeout使用一种中间件(适用于Laravel Web应用程序)覆盖价值,但就超时会话而言,这似乎并没有影响。虽然如果我调试它显示出价值,我已经覆盖了。

Config::set('session.lifetime', 1440);
Run Code Online (Sandbox Code Playgroud)

默认值如下:

'lifetime' => 15,
Run Code Online (Sandbox Code Playgroud)

我正在工作的网站对大多数用户来说会话寿命很短,但是对于某些用户,我想提供更长的会话寿命。

lev*_*evi 6

似乎实现动态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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在 kernel.php 文件中,在StartSession.

\App\Http\Middleware\ExtendSession::class,
\Illuminate\Session\Middleware\StartSession::class,
Run Code Online (Sandbox Code Playgroud)


Rya*_*yan 5

这是对我有用的方法(使用 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);
    }

}
Run Code Online (Sandbox Code Playgroud)
  1. 修改内核:app/Http/Kernel.php

\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,而是从其他地方检索,例如该用户的数据库记录。


pio*_*otr 2

出现此问题的原因是会话已经启动,之后您正在更改会话生存期配置变量。

需要针对当前请求更改该变量,但用户已经具有指定生命周期的会话。

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

  1. 查看数据库中是否存在用户
  2. 如果是,并且他是需要更长会话生存期的用户,请运行config(['session.lifetime' => 1440]);
  3. 登录用户

我建议使用助手来动态更改配置。

config(['session.lifetime' => 1440]);
Run Code Online (Sandbox Code Playgroud)