熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

用 Oracle AS 10g 為PHP提供的一次性登錄

2013-11-13 16:16:06  來源: Oracle 

  PHP 和 Oracle Application Server
  
  PHP 是一種強大靈活的開放源代碼腳本語言它一般用於在 web 頁面中生成動態內容(PHP 類似於 Perl但遠沒有那麼復雜關於更多的背景知識請訪問 OTN 的開放源代碼開發人員中心}PHP 為大多數數據庫產品(包括 Oracle)提供了一系列隨取隨用的豐富特性和服務(包括 LDAPIMAPSNMPNNTPPOPHTTPXMLXSL)以及數據庫訪問模塊PHP 可以作為 CGI 在 Apache 下運行或者可以配置為 Apache Web Server 模塊
  
  將 PHP 與 Oracle Application Server 集成非常容易因為 Oracle HTTP Server 是一個 Apache Web ServerMod_osso 作為 Apache 模塊與 Oracle Application Server 集成在一起因此利用該應用服務器的特性來保護 PHP 頁面是一件很簡單的事情
  
  方法 PHP 代理頁面方法
  Mod_osso 通過已注冊的 URL 模式來保護 web 頁面它檢查通過 Oracle HTTP Server 的所有請求如果請求或 URL 包含了一個被保護的模式而請求者還沒有在 SSO 服務器上得到驗證那麼該請求者將被重定向到 SSO 登錄屏幕SSO 啟用 PHP 頁面的代理頁面方法利用了一個已注冊的 URL 模式該模式被映射到一個特定的 PHP 頁面上通過在 nf 文件中按下面的說明記錄該模式可以向 mod_osso 注冊 URL
  
  
  <Location /php_apps/ssoreroutephp>
  require validuser
  authType Basic
  </Location>
  
  受保護的 PHP 頁面充當您想要保護的其它所有 PHP 頁面的代理
  
 //gif>

  在圖 PHP 文件(SSOUtilsphp參見列表 )充當庫它包含了一個名為 checkAuthenticated() 的用戶自定義函數並被包含在我們試圖實現 SSO 的 PHP 頁面(MyPagephp參見列表 )中該函數在我們要實現 SSO 的頁面上運行並檢查請求者是否已在 SSO 服務器上得到了驗證如果請求者還沒有得到驗證那麼請求者將被自動重定向到 php 代理頁面該頁面的 URL 模式在 mod_osso 進行了注冊該 php 代理頁面 (ssoreroutephp) 將調用頁面的 URL 作為一個參數提取出來請求者被 mod_osso 重定向到登錄屏幕在成功驗證之後請求者被重定向回 PHP 代理頁面該頁面按順序將請求者重定向回調用頁面
  
  函數 checkAuthenticated() 的 PHP 腳本非常簡單
  
  function checkAuthenticated(){
  
  $SSO_REROUTE = /php_apps/ssoreroutephp?p_redirect_url=;
  $SSO_USER  = getenv(REMOTE_USER);
  
  if (empty($SSO_USER)){
  
  header(Location:$SSO_REROUTE$_SERVER[PHP_SELF]);
  
   }
  
  }
  
  PHP 代理頁面的腳本同樣很簡單
  
  <?php
  
  //重定向回被請求的頁面
  header(Location:$_REQUEST[p_redirect_url]);
  
  ?>
  
  但登錄只是 SSO 服務器完整功能的一部分我們還能夠注銷這通常稱為一次性注銷注銷基於 SSO 的頁面是一個簡單的重定向到 URL /osso_logout?p_done_url=<return url> 的操作注銷 URL 是 SSO 服務器的一個特性
  
  下面的函數 ssoLogoutLink(<return url>) 創建了一條自定義的注銷鏈接
  
  
  function ssoLogoutLink($RETURN_URL=){
  
  $DONE_URL = ;
  
  if (empty($RETURN_URL)){
  $DONE_URL=$_SERVER[PHP_SELF];
  } else {
  $DONE_URL=$RETURN_URL;
   }
  
  $SSO_LOGOUT_URL = /osso_logout?p_done_url=$DONE_URL;
   
  $LOGOUT_LINK  = <a href=\$SSO_LOGOUT_URL\>Click here to Logout</a>;
  
  return $LOGOUT_LINK;
  
  }
  
  代理頁面方法是一種非常簡單的利用基本 mod_osso 功能來保護 PHP 頁面的方法不過它將請求者限制在了與 mod_osso 相關的默認注銷和返回 URL 上因而這種方法沒有提供非常細粒化的控制相比而言在接下來的內容中要討論的方法通過使用 servlet 和動態指令提供了更細粒化的控制
  
  方法 SSO LoginProxy 和 LogoutProxy Servlet 方法
  
  動態指令是 mod_osso 的特性它允許開發人員對應用程序與 SSO 服務器的交互方式進行細粒化的控制動態指令由 HTTP 響應標題和一組專門的錯誤代碼組成使用動態指令來開始驗證和注銷的應用程序不需要向 mod_osso 注冊 URL 模式要警惕的一點是動態指令必須和 OCJ (JEE) 應用程序(如 servlet 或 JSP)結合使用
  
  利用了動態指令的 SSO 使能的 PHP 頁面可以通過使用一個代理 servlet 來實現該 servlet 替請求的 PHP 頁面將動態指令發送給 mod_osso下面敘述的方法(參見圖 )使用了兩個 servlet一個用於登錄一個用於注銷
  
//gif>

  在圖 一個 PHP 文件(SSOUtilsphp參見列表 )充當了資料庫它包含了一個名稱為 checkAuthenticatedProxy() 的用戶自定義函數並被包含在我們試圖實現 SSO 的 PHP 頁面(MyPagephp參見列表 )中該函數在我們通過 SSO 啟用的頁面上運行並檢查請求者是否已經在 SSO 服務器上得到了驗證如果該請求者還沒有得到驗證那麼它將連同一個參數被自動重定向到登錄代理 servlet 上該參數指定了到調用頁面的返回 URL登錄代理 servlet 發出所需的動態指令來將一條 SSO 登錄請求發送給 SSO 服務器請求者被 mod_osso 重定向到登錄屏幕在成功驗證之後請求者被重定向回登錄代理 servlet 從調用頁面接收到的返回 URL 上
  
  注銷過程是類似的一個 PHP 函數 ssoLogoutLinkProxy(<return url>) 運行以創建到注銷代理 servlet 的一條超鏈接注銷代理 servlet 發出所需的動態指令來發送一條 SSO 注銷請求給 SSO 服務器請求者被注銷並被重定向到 SSO 注銷屏幕在單擊注銷屏幕中的 Return 按鈕之後請求者被重定向回注銷代理 servlet 從調用頁面接收到的返回 URL 上
  
  函數 checkAuthenticatedProxy() 的 PHP 腳本基本上和先前的方法中所敘述的 checkAuthenticate() 的 PHP 腳本一樣函數之間主要的區別是重定向 URLcheckAuthenticatedProxy() 的 PHP 腳本是
  
  function checkAuthenticatedProxy(){
  
  $SSO_REROUTE = /ssoproxy/loginProxy?p_redirect_url=;
  $SSO_USER  = getenv(REMOTE_USER);
  
  if (empty($SSO_USER)){
  
  header(Location:$SSO_REROUTE$_SERVER[PHP_SELF]);
  
   }
  
  }
  
  函數 ssoLogoutLinkProxy(<return url>) 的 PHP 腳本基本上和函數 ssoLogutLink(<return url>) 相同兩個函數之間主要的區別是重定向 URLssoLogoutLinkProxy(<return url>) 的 PHP 腳本是
  
  function ssoLogoutLinkProxy($RETURN_URL=){
  
  $DONE_URL = ;
  
  if (empty($RETURN_URL)){
  $DONE_URL=$_SERVER[PHP_SELF];
  } else {
  $DONE_URL=$RETURN_URL;
   }
  
  $SSO_LOGOUT_URL = /ssoproxy/logoutProxy?p_done_url=$DONE_URL;
   
  $LOGOUT_LINK  = <a href=\$SSO_LOGOUT_URL\>Click here to Logout</a>;
  
  return $LOGOUT_LINK;
  
  }
  
  列表 中的 Java 類說明了創建上述方法中使用的每一個代理 servlet 所需的代碼兩個 servlet 都包含了對一個名為 SSOUtilities 的 Java 類的引用SSOUtilities 是包含了用來發出動態指令和其它與 SSO 相關功能的封裝方法的一個類兩個 servlet 都被映射到了與應用程序相關的webxml 文件中定義的特定 URL 模式上
  
  您可以看到登錄代理和注銷代理 Servlet 方法對登錄和注銷之後 PHP 應用程序的流動方式提供了更細粒化的控制
  
  我應當選擇哪種方式?
  在看了通過 SSO 啟用 PHP 頁面的兩種方法之後您可能很自然地想問我應當選擇哪種方法?或者更進一步為什麼我要選擇更復雜的而不是更簡單的解決方案?這些問題的答案取決於您需要控制 SSO 的程度如果您所有應用程序或頁面需要的是基本的保護那麼 PHP 代理方法將滿足您的需要但如果您的應用程序需要通過使用動態指令來提供更細粒化的控制那麼 SSO LoginProxy 和 LogoutProxy 方法將是更好的選擇
  
  第一種方法可以有效地發揮作用但沒有提供足夠的靈活性它還要求實際向 mod_osso 注冊一個 URL 模式而第二種方法沒有這種要求第二種解決方案不僅提供了動態指令的靈活性而且可以擴展或改變來滿足一組更加定制化的需求
  
  各有千秋
  理論上任何能夠在 Oracle Application Server 下部署的腳本語言(PerlPythonColdFusion)都可以使用我提到過的相同方法來與 mod_osso 交互並啟用 SSO
From:http://tw.wingwit.com/Article/program/Oracle/201311/18058.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.