当用户登录时,Laravel保持会话

时间:2020-10-22 18:59:47

标签: php laravel

我的用户可以在“记住我”旁边打勾,这意味着他们将永远登录到 。当他们登录时,我用他们的订阅数据填充了自定义会话,这很好用。

问题是当他们关闭计算机后,第二天回来,而不是再次进行登录过程,而是自动加入“仪表板”页面(因为他们已经通过“记住我”登录了)进程),此时我的自定义会话不存在(并触发了错误)。

在App> Http>控制器> Auth> LoginController.php中,我有Login函数,它会覆盖原始的Laravel函数,例如:

public function login(Request $request)
{
    $this->validate($request, ['email' => 'required|email','password' => 'required']);
    
    if (Auth::guard()->attempt($this->credentials($request), $request->remember))
    {
        $subscription = \App\Models\Subscriptions::where('id', \Auth::user()->subscription_id)->first();
        
        \Session::put('subscription',
        [
            'id' => $subscription->id,
            'name' => $subscription->name,
            // etc..
        ]);
    }
}

对我来说,这不是放置自定义会话的正确位置,但我不知道将其放置在何处。

问题:我应该在哪里创建每当用户登录/导航到任何页面时都必须初始化/创建的全局会话?

3 个答案:

答案 0 :(得分:0)

对于改善您的代码,我有一些建议。您的登录功能应仅使用户登录即可。

使用关系!

据我所知,您正在将订阅ID存储在users表中。为什么不将用户ID存储在订阅表中?这样,您可以在这两个表之间创建关系,其中用户将只有一个预订(laravel的hasOne()方法),而预订将属于用户(laravel的belongsTo()方法)。阅读Laravel关于雄辩关系here的文档。

如果不需要,请不要使用会话!

如果实现上述关系,则访问用户的订阅数据将像调用$user->subscription一样容易。由于它很容易检索,因此无需在会话中存储任何内容,因为只要有机会(控制器,刀片服务器...),您就可以使用Auth::user()来使已验证的用户。

如果您仍然想坚持使用会话...

您可以尝试延长会话的生存期,例如this,并将其设置为14天或20年,这样它就永远不会过期。

答案 1 :(得分:0)

已解决

为了使会话数据始终保持最新状态,并考虑到“记住我”复选框,我使用了Laravel Authenticate Middleware来创建我的逻辑。由于auth在每条路线中都被调用,在我看来,这是最好的选择。

为避免多次数据库调用,我将检查会话是否存在,并且仅在创建会话时检查会话是否存在。

App > Http > Middleware > Authenticate.php the documentation允许我们使用称为handle的现有函数。

public function handle($request, \Closure $next, ...$guards)
{
    if (!\Session::get('subscription'))
    {
        // Apply code logic 
    }
    
    // Same logic as the original function https://github.com/laravel/framework/blob/7.x/src/Illuminate/Auth/Middleware/Authenticate.php#L40    
    $this->authenticate($request, $guards);

    return $next($request);
}

答案 2 :(得分:-1)

将您的代码放入AppServiceProvider.php中 将其写入boot()方法中。 引导方法中的代码将始终被首先检查。 阅读有关laravel文档的更多信息。