Laravel 会话背景
会话
跳过此部分以获得快速简单的解决方案
在 Laravel 中,会话 cookie 是通过 Illuminate\Session\SessionManager 类创建的,即通过 buildSession 方法:
SessionManager::buildSession
protected function buildSession($handler)
{
if ($this->app['config']['session.encrypt']) {
return new EncryptedStore(
$this->app['config']['session.cookie'], $handler, $this->app['encrypter']
);
} else {
return new Store($this->app['config']['session.cookie'], $handler);
}
}
在这个方法中我们可以清楚的看到会话的名字来自于我们的config\session.php,特别看这一行:
session.php
'cookie' => 'laravel_session', # ~~ ln 121 at time of writing
好的,但这并没有太大帮助,改变它,改变它到处都是,正如在配置中进行的评论所指出的那样。
此处指定的名称将在每次新会话 cookie 时使用
由框架为每个驱动程序创建。
即使我们可以传递一些动态值,例如:
'cookie' => 'laravel_session' . user()->id,
这会产生一个自相矛盾的、时间结束的、宇宙内爆的结果,因为您正在从 user 请求 id,该 session 可通过 cookie 名称 laravel_session 查找到的 session 访问。 )
让我们离开SessionManager,它只是session.php 配置。我们可以从上面看到,无论我们如何处理,我们所有的会话信息都将属于单个 laravel_session 键。
守卫
也许 Guard 会提供更多信息。
Guard 是您在应用程序中进行身份验证的关键,也是使 Laravel 能够快速创建应用程序的众多因素之一。
查看的方法是Guard::user()。
Guard::user() 在一些初始缓存和注销检查之后做的第一件事就是会话检查。
Guard::user()
$id = $this->session->get($this->getName());
所以在这里,Laravel 正在获取与 getName() 的结果匹配的会话值 - 太棒了 - 我们需要做的就是修改 getName() 来返回一个值,让我们来看看那个方法:
Guard::getName()
public function getName()
{
return 'login_'.md5(get_class($this));
}
这很简单。 $this 指的是 Guard 类,所以 md5 实际上总是相同的(如果有人知道 md5 背后的“为什么”类名每次都相同,请发表评论)。
有几个地方应该更新,例如getRecallerName。
因此,您可以从这里扩展核心 Guard 类并拼接到您的 getName 和 getRecallerName 方法中。
您可能希望围绕此包装一些服务提供者,编写一些单元测试,甚至可能覆盖原来的身份验证管理器。
“天哪,这似乎需要很多工作”
“肯定是比利,肯定是”
https://www.youtube.com/watch?v=dTxQ9yhGnAg
看下一部分
“我只需要一个答案”的快速回答
Ollie Read 已经创建了一个解决方案,可在此处找到:
https://github.com/ollieread/multiauth
我鼓励你看一看,尤其是自定义 Guard 类,它使用自定义 getName 方法扩展了核心 Guard。