在我的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没有一个本地的方式来实现这样的东西,因为我认为这似乎是相当标准的希望定制会话生存期的基础上,以某种方式。
我该怎么做呢?
1条答案
按热度按时间cnwbcb6i1#
没有接触过Laravel那么多,也不建议调整核心的Laravel功能。
解决方法:
<input type='hidden' name='org' value='-1' />
字段。onblur
事件,并对后端进行API调用,以获取此用户的组织ID值,并将此值设置为隐藏字段。当然,从用户电子邮件地址获取用户数据。