我在两个不同的域domain1.tld和domain2.tld中创建了两个项目。
domain1.tld是主要事件生成器页面,domain2.tld是其事件之一。我想共享相同的会话(它们实际上共享相同的数据库和相同的apache服务器)。我试图将会话驱动程序更改为“数据库”并创建会话表,但没有任何反应,如果我登录domain1.tld在domain2.tld中没有任何反应。
我真的在网上搜索过但我什么都没发现
答案 0 :(得分:4)
你不能这样做......
当你设置会话时,在浏览器中为服务器端的跟踪存储会话设置一个cookie。
如果你想在两个域之间共享会话,你应该在站点机器人之间共享cookie你不能这样做(你可以只在一个域的子域中做到)
但有一点黑客: 最简单的解决方法是将登录/凭证信息从网站A传递到网站B,并让网站B设置单独的cookie。例如,登录到网站A后,您可以使用加密的查询字符串快速将其重定向到网站B.然后,网站B可以读取信息,设置自己的cookie,并将用户重定向回站点A.
它很乱但可能。
答案 1 :(得分:2)
步骤1:为共享会话数据设置会话驱动程序
首先,将会话驱动程序设置为跨两个域共享的数据库或缓存。您的会话驱动程序不能是文件
第2步:实施跨域会话ID
会话ID在Laravel中通过cookie传递。由于您的网站位于不同的域中,因此会话cookie不会转移。解决此问题的一种方法是将它们附加到所有请求的查询字符串中,如下所示:domain2.tld /?session_token = abcds2342
在您的代码中,必须有一些检测会话的登录,然后查询数据库/缓存(您的会话驱动程序)以获得结果。如果找到结果,则手动设置会话ID并启动会话:
session_id('abcds2342');
session_start();
小心检查IP地址和会话ID 防止人们猜测别人的SessionID因此而来 以另一个人身份登录
步骤2A :为此,您可以实施一个覆盖StartSession 的自定义中间件。此中间件应覆盖getSession,并在检查cookie中的session_id之前,检查请求中是否存在令牌。示例代码如下:
<?php
namespace App\Http\Middleware;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\Http\Request;
use App\SessionShare;
use Closure;
class StartSessionWithSharer extends StartSession
{
/**
* Get the session implementation from the manager.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Session\SessionInterface
*/
public function getSession(Request $request)
{
$session = $this->manager->driver();
/**
* Check if we can find a valid session token from saved records
*/
if($request->get('session_token') && !empty($request->get('session_token'))) {
$sessionShare = SessionShare::valid()->whereToken($request->get('session_token'))->first();
if($sessionShare)
$session_id = $sessionShare->session_id;
}
/**
* Fallback to session in browser
*/
if(!isset($session_id) || !$session_id)
$session_id = $request->cookies->get($session->getName());
$session->setId($session_id);
return $session;
}
}
步骤2B :然后创建自定义服务提供商以覆盖SessionServiceProvider ,如下所示:
<?php namespace App\Providers;
class CustomSessionServiceProvider extends \Illuminate\Session\SessionServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->registerSessionManager();
$this->registerSessionDriver();
$this->app->singleton('App\Http\Middleware\StartSessionWithSharer');
}
}
然后从config / app.php中删除旧的SessionServiceProvider,而不是使用上面的。
步骤2C:然后为表创建App \ SessionShare模型以存储会话ID。此外,上面的代码不会检查IP地址,因此您必须添加它以使其安全并防止暴力攻击
第二步:哦,最后不要忘记为你的所有请求附加session_token的get参数
请注意,上述实现适用于数据库会话驱动程序。当然,您也可以为缓存驱动程序执行此操作。唯一可以改变的是模型实现(步骤2C)以验证会话