PHP 和 Oracle Application Server
PHP 是一種強大
靈活的開放源代碼腳本語言
它一般用於在 web 頁面中生成動態內容
(PHP 類似於 Perl
但遠沒有那麼復雜
關於更多的背景知識
請訪問 OTN 的開放源代碼開發人員中心
}PHP 為大多數數據庫產品(包括 Oracle)提供了一系列隨取隨用的豐富特性和服務(包括 LDAP
IMAP
SNMP
NNTP
POP
HTTP
XML
XSL)以及數據庫訪問模塊
PHP 可以作為 CGI 在 Apache 下運行
或者可以配置為 Apache Web Server 模塊
將 PHP 與 Oracle Application Server 集成非常容易
因為 Oracle HTTP Server 是一個 Apache Web Server
Mod_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/ssoreroute
php>
require valid
user
authType Basic
</Location>
受保護的 PHP 頁面充當您想要保護的其它所有 PHP 頁面的代理
//gif> 在圖
中
PHP 文件(SSOUtils
php
參見列表
)充當庫
它包含了一個名為 checkAuthenticated() 的用戶自定義函數
並被包含在我們試圖實現 SSO 的 PHP 頁面(MyPage
php
參見列表
)中
該函數在我們要實現 SSO 的頁面上運行
並檢查請求者是否已在 SSO 服務器上得到了驗證
如果請求者還沒有得到驗證
那麼請求者將被自動重定向到 php 代理頁面
該頁面的 URL 模式在 mod_osso 進行了注冊
該 php 代理頁面 (ssoreroute
php) 將調用頁面的 URL 作為一個參數提取出來
請求者被 mod_osso 重定向到登錄屏幕
在成功驗證之後
請求者被重定向回 PHP 代理頁面
該頁面按順序將請求者重定向回調用頁面
函數 checkAuthenticated() 的 PHP 腳本非常簡單
function checkAuthenticated(){
$SSO_REROUTE =
/php_apps/ssoreroute
php?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 模式
要警惕的一點是
動態指令必須和 OC
J (J
EE) 應用程序(如 servlet 或 JSP)結合使用
利用了動態指令的 SSO 使能的 PHP 頁面可以通過使用一個代理 servlet 來實現
該 servlet 替請求的 PHP 頁面將動態指令發送給 mod_osso
下面敘述的方法(參見圖
)使用了兩個 servlet
一個用於登錄
一個用於注銷
//gif> 在圖
中
一個 PHP 文件(SSOUtils
php
參見列表
)充當了資料庫
它包含了一個名稱為 checkAuthenticatedProxy() 的用戶自定義函數
並被包含在我們試圖實現 SSO 的 PHP 頁面(MyPage
php
參見列表
)中
該函數在我們通過 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 腳本一樣
函數之間主要的區別是重定向 URL
checkAuthenticatedProxy() 的 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>) 相同
兩個函數之間主要的區別是重定向 URL
ssoLogoutLinkProxy(<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 都被映射到了與應用程序相關的web
xml 文件中定義的特定 URL 模式上
您可以看到
登錄代理和注銷代理 Servlet 方法對登錄和注銷之後 PHP 應用程序的流動方式提供了更細粒化的控制
我應當選擇哪種方式? 在看了通過 SSO 啟用 PHP 頁面的兩種方法之後
您可能很自然地想問
我應當選擇哪種方法?
或者更進一步
為什麼我要選擇更復雜的而不是更簡單的解決方案?
這些問題的答案取決於您需要控制 SSO 的程度
如果您所有應用程序或頁面需要的是基本的保護
那麼 PHP 代理方法將滿足您的需要
但如果您的應用程序需要通過使用動態指令來提供更細粒化的控制
那麼 SSO LoginProxy 和 LogoutProxy 方法將是更好的選擇
第一種方法可以有效地發揮作用
但沒有提供足夠的靈活性
它還要求實際向 mod_osso 注冊一個 URL 模式
而第二種方法沒有這種要求
第二種解決方案不僅提供了動態指令的靈活性
而且可以擴展或改變來滿足一組更加定制化的需求
各有千秋 理論上
任何能夠在 Oracle Application Server 下部署的腳本語言(Perl
Python
ColdFusion)都可以使用我提到過的相同方法來與 mod_osso 交互並啟用 SSO
From:http://tw.wingwit.com/Article/program/Oracle/201311/18058.html