Jas*_*enX 22 php laravel laravel-5
在我们的网络应用程序中,如果我使用单个浏览器,以用户A身份登录我们的应用程序,打开另一个选项卡并以用户B身份登录 - 用户A丢失其会话数据.我假设这是由于与用户代理共享的cookie.有没有办法用用户名连接其名称?这样会话可以在同一台机器上使用相同浏览器的并发登录用户之间共存?
我们使用Laravel 5.它有什么办法吗?
Chr*_*ris 23
跳过此部分可获得快速简便的解决方案
在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);
}
}
Run Code Online (Sandbox Code Playgroud)
在这个方法中,我们可以清楚地看到会话的名称来自我们config\session.php,特别是这一行:
session.php文件
'cookie' => 'laravel_session', # ~~ ln 121 at time of writing
Run Code Online (Sandbox Code Playgroud)
好的,但这并没有多大帮助,改变它,在任何地方都改变它,正如在配置中进行的评论所指出的那样.
每次为每个驱动程序为框架创建新的会话cookie时,将使用此处指定的名称.
即使我们可以传递一些动态值,例如:
'cookie' => 'laravel_session' . user()->id,
Run Code Online (Sandbox Code Playgroud)
这就产生了一个矛盾,时间结束,宇宙面临崩溃的结果,因为您所请求的id从user其中通过访问session由查找cookie名称laravel_session.(mindblown)
让我们离开SessionManager,只有它的session.php配置.我们可以从上面看到,无论我们如何处理这个问题,我们所有的会话信息都将归入该单一laravel_session密钥.
也许Guard会有更多的信息.
Guard是您进入应用程序的关键,也是使Laravel快速创建应用程序的众多因素之一.
要看的方法是Guard::user().
Guard::user()在初始缓存和注销检查之后,首先要做的事情之一是会话检查.
卫士::用户()
$id = $this->session->get($this->getName());
Run Code Online (Sandbox Code Playgroud)
所以在这里,Laravel正在获取与结果匹配的会话值getName()- 真棒 - 我们需要做的就是mod getName()返回一个值,让我们采取一种方法:
卫士::的getName()
public function getName()
{
return 'login_'.md5(get_class($this));
}
Run Code Online (Sandbox Code Playgroud)
这很直截了当.$this指的是Guard类,所以md5实际上总是相同的(如果有人知道md5后面的'为什么',每次都是相同的类名,留下评论).
有一些地方应该更新,例如getRecallerName.
因此,从这里开始,您可以扩展核心Guard类并使用getName和getRecallerName方法进行拼接.
您可能希望围绕此包装一些服务提供者,编写一些单元测试,甚至可能覆盖原始的auth管理器.
"Geez,这似乎很多工作"
"肯定是比利,肯定是"
见下一部分
Ollie Read已经创建了一个解决方案,可在此处找到:
https://github.com/ollieread/multiauth
我鼓励大家看看,特别是使用自定义方法Guard扩展核心的自定义类.GuardgetName