Laravel,2个领域的2个项目同一会议

时间:2017-01-18 22:52:00

标签: php laravel session

我在两个不同的域domain1.tld和domain2.tld中创建了两个项目。

domain1.tld是主要事件生成器页面,domain2.tld是其事件之一。我想共享相同的会话(它们实际上共享相同的数据库和相同的apache服务器)。我试图将会话驱动程序更改为“数据库”并创建会话表,但没有任何反应,如果我登录domain1.tld在domain2.tld中没有任何反应。

我真的在网上搜索过但我什么都没发现

2 个答案:

答案 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)以验证会话