登录后在会话中存储变量

Posted

技术标签:

【中文标题】登录后在会话中存储变量【英文标题】:Store variable in session after login 【发布时间】:2016-10-07 09:03:07 【问题描述】:

我是 Laravel 框架的新手,我需要你们的帮助,伙计们!

我现在正在尝试的是在登录后立即在会话中添加一个新变量。 此变量取决于当时登录的用户。 我现在拥有的是这个,它有效,但不是我真正想要的:

$loggedUserId = Auth::id();
$getTenantId = DB::table('users')->select('tenant_id')->where('id', $loggedUserId)->get();
$tenantId = $getTenantId[0]->tenant_id;
Session::put('tenant_id', $tenantId);

问题是这段代码存在于 home.blade.php 中,我不希望这样,因为如果,比方说,我想创建一个系统,当用户注销并再次登录时,会出现之后出现的页面login 是注销前最后访问的页面。

我应该把这段代码放在哪里,以便每次用户登录后都会执行?

【问题讨论】:

必须从您的home.blade.php 中删除此代码。查询和会话交互应该“存在”在您的视图之外。 是的,我知道。但是我应该把这段代码放在哪里登录后立即执行?我想将该tenant_id 存储在会话中,但它基于登录的用户。我试图将它放在 loginController 中,但它说 Auth::id() 不存在。 【参考方案1】:

要在用户通过身份验证后立即执行操作,您可以使用 Laravel 的事件。这是确切解释如何订阅您所关注的事件的文档:https://laravel.com/docs/5.3/events#event-subscribers

【讨论】:

这看起来很有趣。我会仔细看看的。谢谢!【参考方案2】:

Create middleware 并将代码放在那里。然后将中间件添加到web 列表(app\Http\Kernel.php)或add middleware to a route group。此外,您可以只用一行代码执行相同的操作:

session()->put('tenant_id', auth()->user()->tenant_id);

最后,在您的情况下,您甚至不需要做所有这些事情,因为 auth()->user()->tenant_idAuth::user()->tenant_id 对所有登录用户都是全局可用的(在所有控制器、视图、模型等中)。

【讨论】:

第二件事对我来说效果很好。我也尝试过使用中间件,但我认为我搞砸了一些东西并且它没有用。谢谢!

以上是关于登录后在会话中存储变量的主要内容,如果未能解决你的问题,请参考以下文章

禁用在控制台中编辑会话存储变量的可能性

linux中使用ssh保持会话链接,自动登录

在 PHP 登录脚本中使用会话和会话变量

PHP 会话变量的安全性如何?

VaryByCustom 不适用于会话变量

在数据库中存储表单登录会话