php Laravel -每个用户的单独会话生存期

wbgh16ku  于 2023-03-11  发布在  PHP
关注(0)|答案(1)|浏览(112)

在我的PHP Laravel应用程序中,每个用户(User模型)都属于一个组织(Organization模型)。我需要能够根据组织为每个用户单独配置会话生存期(session.lifetime配置值)。
该值存储在数据库-〉organizations表-〉session_lifetime列(整数)中。组织的管理员用户可以在管理页面中更改该值。
我创建了一个CustomSessionLifetime中间件:

public function handle(Request $request, Closure $next)
{
    $user = auth()->user();

    if ($user !== null)
    {
        $lifetime = $user->organization->session_lifetime;
        config()->set('session.lifetime', $lifetime);
    }
    
    return $next($request);
}

现在我有一个循环问题

**1)**如果我将CustomSessionLifetime中间件设置为运行 BEFOREStartSession中间件,如下所示:

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        //...
        \App\Http\Middleware\CustomSessionLifetime::class,
        \Illuminate\Session\Middleware\StartSession::class,
        //...
    ],

则无法使用auth()->user()函数获取用户(以及组织或session_lifetime属性值),因为会话尚未启动。

**2)**如果我将CustomSessionLifetime中间件设置为运行 AFTERStartSession中间件,如下所示:

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        //...
        \Illuminate\Session\Middleware\StartSession::class,
        \App\Http\Middleware\CustomSessionLifetime::class,
        //...
    ],

那么我无法配置session.lifetime配置值,因为会话已经启动,并且那里已经使用了旧值。
我有点惊讶,Laravel没有一个本地的方式来实现这样的东西,因为我认为这似乎是相当标准的希望定制会话生存期的基础上,以某种方式。
我该怎么做呢?

cnwbcb6i

cnwbcb6i1#

没有接触过Laravel那么多,也不建议调整核心的Laravel功能。

解决方法:

  • 在登录表单中添加一个<input type='hidden' name='org' value='-1' />字段。
  • 当用户输入电子邮件地址时,在此字段上添加一个onblur事件,并对后端进行API调用,以获取此用户的组织ID值,并将此值设置为隐藏字段。当然,从用户电子邮件地址获取用户数据。
  • 当用户输入密码并点击提交时,您只需在中间件中执行以下操作:
$lifetime = Organization::find($request->get('org'))->session_lifetime;
config()->set('session.lifetime', $lifetime);

相关问题