2010-02-06 158 views
4

我想爲Java應用程序和PHP應用程序使用Java EE應用程序服務器(GlassFish 3)作爲SSO服務。如果用戶通過GlassFish進行身份驗證,他也應該登錄到PHP應用程序。與PHP共享Servlet會話

是否有一個與PHP共享Servlet會話(更精確:身份驗證狀態)的最佳實踐?

回答

1

看一看PHP/Java Integration。您可以將PHP集成到servlet環境中,或讓PHP調用Java。現在我不能100%確定這將專門解決您的問題,並且整合被認爲是實驗性的。

你可能最好做的是使用別的東西來共享會話數據。像memcache一樣。 Java和PHP都可以自由地與memcache通信。這將是一個更加強大的解決方案。

+0

還是看Caucho的栓皮櫟的Java實現的PHP製作集成更容易。 – rsp 2010-02-06 17:51:23

1

我有連接PHP和Java應用程序服務器沒有經驗,但在整合一般:

一種常見的方式做單點登錄上閱讀會話標識(如餅乾由Java服務器設置)在PHP腳本中傳遞給應用程序服務器(例如通過命令行,通過創建HTTP調用或共享緩存實例)並獲取身份驗證狀態。

如果這是不可能的,例如因爲這些服務在不同的域上運行,所以您可以在第一次調用它時將您的應用服務器的會話ID傳遞給PHP應用程序。然後,PHP應用程序將創建自己的會話,並將來自應用程序服務器的會話ID存儲在其中。如上所述,應用服務器會話的內部驗證將工作。

如果您不僅需要交換「登錄/未登錄」標誌,還可以考慮使用session_set_save_handler()來替換PHP的標準會話處理。您的自定義會話功能可以將會話數據存儲到文件中,而不是將會話數據存儲到文件中,從您的應用服務器獲取數據,該數據可以預先填充會話數據,如身份驗證狀態,用戶名等。這將允許進行一些簡單的應用程序間通信。

當然,首先檢查由cletus提到的內置Java/PHP集成函數是否已經不能實現。

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文件