两个客户的 PHP 会话重叠


PHP session overlapping for two customers

浏览器的多个选项卡中打开应用程序时遇到会话问题。在我的项目中,用户可以有多个登录 id,这样他就可以使用两个 id 登录应用程序同时作为两个不同的用户。但是当他们尝试使用多个 ID 登录时浏览器的选项卡。浏览器的同一会话正在共享,数据被弄乱了。有什么见解可以解决这个问题吗?

我在 mail.yahoo.com 中看到一个模式,如果我使用一个用户ID登录我的mail.yahoo并尝试登录到新选项卡中的其他用户 ID。其中一个用户注销。知道怎么做...

谢谢

将其

与其他答案拼凑在一起,听起来您需要多个应用程序流。

也就是说,您需要在同一台浏览器、同一台机器上的不同选项卡上登录多个"用户"的应用程序。

这并不是因为他们是使用机器的不同人,而是同一个人与不同的角色一起工作。

事实证明,我自己过去也实施过类似的东西,以便管理人员能够像他们的员工一样通过系统"幽灵"。 他们以其他用户身份登录,但处于只读模式,以便他们可以看到发生了什么。

还行。 那么怎么做。

简单地说 - 会话是不够的 - 你需要的不止这些。 会话 ID 存储在客户端计算机上的 cookie 中,您对设置无能为力 - 一个浏览器 = 一个会话。

但是,您可以做的是将该会话与应用程序流或应用程序上下文拆分。

也就是说,不要在会话的根目录中存储任何内容 - 将会话拆分为不同的组件,在这些组件中,您的设置与当前会话相同。

然后,每个会话的密钥是"应用程序流"密钥。 您需要在URL中传递此信息。

例如

您当前的会话可能具有简单的设置:

$_SESSION['user'] = 'some username';
$_SESSION['role'] = 'power user';

相反,您可以将其存储为:

$_SESSION[0]['user'] = 'some username';
$_SESSION[0]['role'] = 'power user';

在您添加的所有网址上:

&appId=0

每当您引用会话时,您都会使用以下内容:

$username = $_SESSION[ $_GET['appId'] ]['user'];

显然,您将所有这些包装在一个不错的会话处理类中,但这是基本思想。

如果您想要一个链接来生成带有新应用程序流的新登录页面,您只需更改链接上的appId(或完全省略它并将其捕获在您的登录代码中(。

例如

$sLoginLink = "<a href='/login.php?appId=" . generateNewAppStreamId() . "' target='_BLANK'>New Login Screen</a>";

由于所有内容仍存储在会话中,因此整个应用程序的工作方式应该完全相同 - 只要您始终对系统中的每个URL都有appId

我试图使解释尽可能简单 - 如果我使用了太多单词,请原谅我。

如果要使用会话,则必须安排这样的机制,以便在同一浏览器中只能登录一个用户。在登录页面上,检查会话的可用性,它已经有一个值,而不是将您的页面重定向到任何登录页面,如主页、个人资料或您拥有的任何内容。

当用户注销或使用其他用户 ID 登录时,您必须使用 session_regenerate_id() 强制 PHP 使用不同的 cookie 进行新登录。

这实际上是注销的最佳实践。

如果你想让两个用户同时从同一个浏览器登录,你必须在URL中放一些东西来区分他们。例如,登录后,用户 #1 将看到所有页面http://www.example.org/1/...,用户 #2 将拥有自己的自定义 URL (http://www.example.org/2/... (。然后,您需要为每个用户使用正确的参数值session_set_cookie_params()参数$path("/1"表示用户 #1,"/2"表示用户 #2,依此类推(。

不建议将用户 ID 用作自定义用户目录,而是从中生成哈希。