【问题标题】:How to read session values form another session instance in PHP?如何从 PHP 中的另一个会话实例中读取会话值?
【发布时间】:2011-03-20 22:30:34
【问题描述】:

我在 PHP 中做一些事情,我必须读取另一个会话实例的会话值。 例子

浏览器1: $_SESSION['value']="user1";

浏览器2: $_SESSION['value']="user2";

Browser1 需要从某个请求中获取“user2”值。该请求还将包括 cookie(key, value)。

我该怎么做?

谢谢, 华尔

【问题讨论】:

  • 这就是会话的工作方式。
  • 你想做什么?可能有更好的方法来实现您的目标。
  • 欢迎使用stackoverflow
  • 好的,这是我的问题,我的公司有 2 台服务器正在运行,1 台 PHP 服务器处理 SSO(单点登录),另一个是在 ruby​​ on rails(ROR)上运行的 Web 应用程序,通常浏览器与 SSO 通信以进行登录、验证等,但我们需要实现新功能,其中 ROR 服务器需要代表浏览器在 SSO 提交身份验证请求,因此我需要为该浏览器存储的会话来自包含 cookie(key, cookie) 的 ROR 请求的 SSO。
  • 因为您尝试进行单点登录,所以我在这个问题中添加了 SSO 标签。

标签: php session single-sign-on session-cookies


【解决方案1】:

1 个处理 SSO(单点登录)的 PHP 服务器,另一个是在 ruby​​ on rails(ROR) 上运行的 Web 应用程序

[...]

但我们需要实现新功能,其中 ROR 服务器需要代表浏览器在 SSO 提交身份验证请求

您的 SSO 模型不需要以这种方式工作。事实上,它不应该。

SSO 通常是这样工作的。我使用非标准名称是因为我累了,不记得他们的正式名称是什么:

  • 最终用户:使用需要登录的浏览器的家伙。
  • 页面服务器:最终用户尝试登录的站点。
  • 身份验证服务器:实际拥有最终用户数据主版本的站点。
  1. 最终用户向页面服务器请求页面。
  2. 页面服务器检查最终用户的现有登录状态。如果最终用户未登录,页面服务器会使用唯一令牌将最终用户重定向到身份验证服务器。
  3. 身份验证服务器使用唯一令牌从最终用户获取请求。它会做任何需要做的事情来让用户登录。
  4. 用户登录后,身份验证服务器将带有另一个不同的唯一令牌的最终用户发送回页面服务器。
  5. 最终用户向页面服务器发出的请求导致页面服务器向身份验证服务器发出请求。该请求包括原始唯一令牌另一个不同的唯一令牌
  6. 身份验证服务器向页面服务器响应有关用户的信息,如果令牌无效,则返回错误消息。一旦检索到用户数据,身份验证服务器就会使令牌失效。 (这可以防止请求重放。顺便说一下,您应该在整个过程中使用 SSL。)
  7. 页面服务器将用户登录并存储它需要的有关最终用户的任何信息。

页面服务器在任何时候都不会“冒充”最终用户,并且页面服务器或身份验证服务器在任何时候都不需要接触彼此的最终用户会话数据。

页面服务器在任何时候都不会获得用户凭据的副本。 最终用户的实际身份验证只发生在身份验证服务器上。在身份验证服务器使用正确的请求令牌将用户退回后,页面服务器请求有关用户的数据。

如果您愿意,您可以使这个过程更加复杂。例如,身份验证服务器将用户退回的 URL 可能需要自定义。您可以将返回 URL 包含在最终用户对身份验证服务器的请求中,但如果这样做,您应该对其进行签名(例如使用 HMAC),以确保某些恶意 cretin 不会在途中对其进行操作。

清如泥?

【讨论】:

  • 非常感谢您的澄清,我们的 SSO 按照您所说的核心工作。这是我的问题的更多细节......我们现在有 3 台服务器:D SSO ROR 另一个页面服务让我们简称为 APS。现在用户已登录 ROR,因此浏览器上有 ROR 和 SSO 的唯一令牌。 ASP 服务器不知道发生了什么。在某些时候,ROR 服务器将要求 ASP 执行某些操作(特权操作) ASP 必须确保该用户在执行该任务之前已登录 SSO。我该怎么做?
  • @wael34218 因此,您有应用程序 A、B 和 C。用户在 A 和 B 上登录,但不是 C。您希望 A 或 B 告诉 C 用户正在做某事, 正确的?用户在所有三个应用程序中都有一个唯一标识符,对吧?如果是这样,为您需要执行的可以接受 签名令牌 和用户唯一 ID 的操作创建特定的 API 不是很容易吗?它实际上会说,“嘿,应用程序 C?是的,我是应用程序 A。用户 42 需要 foo 酒吧。”应用程序 C 然后查找令牌并确保它是合法的,然后以用户身份对条形进行 foos。如果用户在 C 中不存在,可能会变得粘滞。
  • (600 个字符是不够的。)关键是这三个应用程序中的任何一个都知道用户就是用户。毕竟权威人士是这么说的。为每个应用程序都能够信任其他应用程序的请求创建一种方法,并将其建立为 API。
  • 这是解决我问题的简单方法,非常感谢!!我会尝试一下,看看效果如何。
  • 最后我在 SSO 上做了一个功能来检查通过另一个 Web 服务器的身份验证。不确定这是否是最佳做法。
【解决方案2】:

默认会话存储是一个文件。你可以access each file like you would access any other file。会话数据经过编码,必须先解码才能使用。有a number of solutions for this in the comments

  • session_decode - session_decode — 从字符串中解码会话数据

【讨论】:

    【解决方案3】:

    您将需要创建某种数据存储系统,该系统可供您应用程序的所有用户访问。 Cookie 和会话仅限于当前用户/浏览器。

    数据库或文件是您需要使用的示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多