一个 webapp 在同一个浏览器上的多个会话

Posted

技术标签:

【中文标题】一个 webapp 在同一个浏览器上的多个会话【英文标题】:Multiple sessions on the same browser for one single webapp 【发布时间】:2016-06-24 12:07:40 【问题描述】:

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

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

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

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

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

修改提供的用户身份验证功能以添加 site_id 字段。这意味着用户可以在多个站点使用相同的电子邮件地址注册,也可以分别登录所有这些站点。如果他们登录到站点 1 并访问站点 2,则他们必须再次登录并有两个单独的会话来处理在他们看来是两个不同的应用程序,但只是一个。

理论上这对我来说似乎是可能的。一旦他们登录,就会为每个单独的子域创建一个 cookie,这在不同的子域上不起作用。我觉得我错过了一些重要的东西,我从来没有做过类似的事情,并且总是依靠 Laravel 为我处理所有的会话内容。如果不对 Laravel 代码库进行大量黑客攻击,这是否可能?

更新

这些是我的限制:

期望的效果是每个网站看起来都是一个单独的应用程序,并且与其他应用程序完全不相关,但都绑定到相同的后端并具有相同的路由/视图。 用户群和用户会话不能在站点之间共享。我可以使用户注册一次并可以登录到每个站点,但我不希望那样。用户应该能够分别访问每个网站。 每个网站都有一个不同的子域,或者在相同的情况下,有一个不同的域。

【问题讨论】:

它不会像你描述的那样工作。有很多方法可以实现似乎是您的目标,但是如果不知道限制是什么,您有什么访问权限,什么是改进,什么是妥协,就不可能回答。您提议修改框架反而违背了使用框架的目的。 这实际上可以在不“破解” Laravel 代码库的情况下实现。 Laravel 提供了创建自定义 session 和 authentication 驱动程序的简单方法,尽管根据具体要求的复杂性,此类事情的特定实现可能需要做一些事情。 @symcbean 我希望我不必修改框架,我的问题是如何在 Laravel 中为一个用户实现多个会话。当我说修改身份验证功能时,我的意思是通过框架允许的方式。可以编写一个类来覆盖自定义需求的身份验证方法,这样我就不会弄乱核心框架。如上所述,限制是网站不能共享相同的用户群。 【参考方案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 的好消息。您使用中间件根据 url 定义用户是哪个Site。一旦设置好,所有 eloquent 查询将根据数据库中的 site_id 自动确定范围。所以User::all() 只会返回当前站点的用户。

【讨论】:

这是我耳朵(或眼睛?)的音乐。我还没有准备好开始开发我的应用程序,我仍处于研究阶段。一旦我开始,我会先尝试一下。我会回到这里发布我的结果,但这听起来完全符合我的需要。 (楼主看起来很厉害!)

以上是关于一个 webapp 在同一个浏览器上的多个会话的主要内容,如果未能解决你的问题,请参考以下文章

管理多个选项卡的 webapp 会话数据/控制器流

管理多个选项卡的 webapp 会话数据/控制器流

浅析PHP的会话技术

php的会话技术

在 iOS Safari 上的浏览​​器会话之间未保存 Cookie

在会话作用域的JSF支持bean中观察CDI事件