我想将Java EE应用程序服务器(GlassFish 3)用作Java应用程序和PHP应用程序的SSO服务。如果用户通过GlassFish进行身份验证,他也应该登录到PHP应用程序。
是否有最佳实践与PHP共享Servlet会话(更精确:身份验证状态)?
答案 0 :(得分:1)
看看PHP / Java Integration。您可以将PHP集成到servlet环境中,也可以让PHP调用Java。现在我并不是100%确定这将专门解决您的问题,并且整合被认为是实验性的。
你最好做的是使用别的东西来分享会话数据。像memcache这样的东西。 Java和PHP都可以自由地与memcache通信。这将是一个更强大的解决方案。
答案 1 :(得分:1)
我没有连接PHP和Java应用服务器的经验,但是在整合方面没有经验:
执行单点登录的常用方法是在PHP脚本中读取会话ID(例如,由Java Server设置的cookie),并在内部将其传递给应用服务器(例如,通过命令行,通过建立HTTP)调用或共享缓存实例)并恢复身份验证状态。
如果无法做到这一点,例如因为服务在不同的域上运行,所以在第一次调用时,您可以将应用服务器的会话ID传递给PHP应用程序。然后,PHP应用程序将创建自己的会话,并将应用程序服务器中的会话ID存储在其中。应用服务器会话的内部验证将如上所述。
如果您需要交换的不仅仅是“登录/未登录”标志,还可以考虑使用session_set_save_handler()替换PHP的标准会话处理。您的自定义会话功能不是将会话数据存储到文件中,而是从您的应用服务器获取其数据,这可以使用身份验证状态,用户名等预先填充会话数据。这将允许一些简单的应用程序间通信。
当然,首先要检查cletus提到的内置Java / PHP集成函数是否已经完成了这一操作。
答案 2 :(得分:1)
我不了解最佳做法...但通常如果它有效并且价格不贵且不会危及安全性,那么这可能是一种可接受的做法。
当用户在没有php会话的情况下访问php页面时,该php页面会重定向到特定的jsp页面。 jsp页面将查看用户是否有活动会话。如果不是,jsp页面将允许用户登录.jsp页面将重定向到特定的php页面,传递诸如身份验证令牌之类的东西,以及原始页面的url。 php页面创建php会话并重定向到请求的原始页面。这些页面可以位于不同的域中并在不同的服务器上运行。这也可以在运行java或php或其他任何服务器的不同服务器上复制和实现。
acc.intt / page.php - > sso.intt / cosession.jsp - > acc.intt / cosession.php - > acc.intt / page.php文件