在同一浏览器上为一个Web应用程序进行多个会话

时间:2016-03-09 21:33:32

标签: php laravel session content-management-system session-cookies

只要在身份验证过程中添加了另一个字段(电子邮件,密码 website_id),同一个用户是否可以在同一个浏览器中拥有多个会话?

我正在构建一个允许创建多个onepage网站的PHP应用程序。每个网站都应作为独立网站,具有不同的内容,但它们都具有相同的后端。每个网站都有一组单独的用户/客户。用户可以在任何网站上注册,但网站不一定共享用户群。这意味着用户可以访问site1.domain.com并注册,如果他们希望访问site2.domain.com,则必须再次注册。

他们可能会使用相同的电子邮件地址注册,因此我的用户表允许重复的电子邮件地址,只要它们不在同一个网站中。

这是一个非常简单的CMS。有点像magento在同一个实例下运行的多个网站。它们还允许每个单独的站点拥有自己的客户群。

我计划在这个项目中使用Laravel。我目前的做法是:

修改提供的用户身份验证功能以添加 site_id 字段。这意味着用户可以在多个站点中使用相同的电子邮件地址进行注册,也可以单独登录所有这些站点。如果他们登录到site1并访问site2,他们必须再次登录并拥有两个单独的会话,这些会话将显示为两个不同的应用程序,但只是一个。

从理论上讲,这似乎对我有用。一旦登录,就会为每个单独的子域创建一个cookie,这不适用于不同的子域。我觉得我错过了一些大的东西,我从来没有做过类似的事情,总是依赖Laravel为我处理所有的会话。如果没有对Laravel代码库进行严厉的黑客攻击,这是否可能?

更新

这些是我的约束:

  • 理想的影响是每个网站看起来都是一个单独的应用程序,与其他网站完全没有关系,但都与同一个后端和相同的路由/视图相关联。
  • 用户群和用户会话无法在站点之间共享。我可以让用户注册一次,然后可以登录到每个站点,但我不希望这样。用户应该能够单独访问每个网站。
  • 每个网站都会有不同的子域名,或者在相同的情况下,会有一个不同的域名。

1 个答案:

答案 0 :(得分:1)

PHP会话与域名绑定,因此他们会为您的每个应用自动拥有不同的会话。您可以使用自定义分辨率的路径模型绑定来确定基于域的应用程序。

<强> routes.php文件

Route::group(array('domain' => '{site}.com'), function() {
  //routes go here
});

RouteServiceProvider (在boot方法中)

$router->bind('site', function ($value) {
  return App\Site::where('custom_domain', $value)->first();
});

这是基于假设您的Site模型在数据库中有一个名为custom_domain的字段。组内可用的所有路由都可以使用依赖注入访问Site。您可以根据应用需求调整模型和字段。

您可以使用该模型自定义每个应用的登录页面,并且应用程序将为每个应用程序设置独立的会话。

我也听过关于Landlord package的好消息。您可以使用中间件根据网址定义用户Site。设置完成后,所有雄辩的查询都将根据数据库中的site_id自动确定范围。因此User::all()只会返回当前网站的用户。