在我的 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
中间件设置为运行 BEFORE StartSession
中间件,如下所示:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
//...
\App\Http\Middleware\CustomSessionLifetime::class,
\Illuminate\Session\Middleware\StartSession::class,
//...
],
然后我无法使用
session_lifetime
函数获取用户(以及组织或 auth()->user()
属性值),因为会话尚未启动。
2) 如果我将
CustomSessionLifetime
中间件设置为运行 AFTER StartSession
中间件,如下所示:
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
//...
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\CustomSessionLifetime::class,
//...
],
然后我无法配置
session.lifetime
配置值,因为会话已经启动并且旧值已在那里使用。
令我感到惊讶的是,Laravel 没有一种原生的方式来实现这样的事情,因为我认为以某种方式基于用户自定义会话生命周期似乎是非常标准的。
我怎样才能完成这项工作?
没有接触过 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);