[转]使用 PHP 创建定制 SSO 登录页面和注销页面

转载自: http://www.oracle.com/technetwork/cn/articles/technote-as-signoff-097232-zhs.html

如果安装了 Oracle 应用服务器 10g 企业版并准备创建定制 SSO 登录页面和注销页面,则您可能需要考虑使用 PHP,而非传统的 PL/SQL 和 JSP 方法。使用 PHP 比使用 PL/SQL 和 JSP 的一大优点是可以轻松地部署和修改页面。使用 PHP,您只需打开文件,进行更改,然后保存该文件即可。新页面和更改将立即生效。

本技术说明演示了使用 PHP 创建和管理定制 SSO 登录页面和注销页面是何等的迅速和简单。

定制 SSO 登录页面和注销页面概述

如果您基于 Oracle9iAS 或 Oracle 应用服务器 10g 开发了支持 SSO 的应用程序,则肯定知道对这些应用程序的初始访问权限通过一个登录屏幕授予。相反,注销操作导致显示一个注销页面,该页面包含一系列的关联的应用程序,并验证用户是否成功注销了每个关联的应用程序。登录页面和注销页面在一次性登录过程中起着重要的作用。登录页面负责用户身份验证和创建唯一加密的会话 cookie,登录服务器使用此 cookie 验证用户当前是否已被验证了身份。注销页面确保用户已从所有其他关联的应用程序中彻底注销。

Oracle 应用服务器一次性登录管理员指南 10g (9.0.4) 第 12 章介绍了作为登录服务器的一部分提供的、用于创建定制登录/注销页面的框架,还详细介绍了在登录服务器中注册定制页面所需的步骤。尽管 Oracle 文档中提供的示例页面代码主要围绕 PL/SQL 和 JSP,但该框架可用于几乎任何基于 web 的技术。本文的剩余部分演示了如何使用 PHP 替代 PL/SQL 和 JSP 来构建您的 SSO 登录页面和注销页面。

第 1 步:为使用 PHP 配置 Oracle 应用服务器 10g

创建定制登录页面/注销页面的第一步是针对 Oracle 应用服务器 10g 配置 PHP。如果 Oracle 应用服务器 Server 10g 所在的计算机上已经安装了 PHP,则只需向 httpd.conf 中添加以下条目即可配置 PHP 使其在 Oracle 应用服务器 10g 的 Apache 版本下运行:

LoadModule php4_module libexec/libphp4.so

# PHP Mod Section
<IfModule mod_php4.c>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
</IfModule>

共享对象库 libphp4.so 应置于 Oracle 应用服务器 10g 实例主目录的 $ORACLE_HOME/Apache/Apache/libexec 目录中。一个值得注意的问题是:如果您的 PHP 版本包含在 Linux 或 Unix 发行套件中,则它可能已针对 Apache 2.0 进行了编译。如果事实确实如此,则在 PHP 二进制文件编译过程中生成的 libphp4.so 文件将与 Oracle 应用服务器 10g 的 Apache 版本不兼容。因此,您必须针对 Oracle 应用服务器 10g 的 Apache 发行套件重新安装/重新编译 PHP。如果主机上未安装 PHP,则需要从 http://www.php.net 下载并安装它。按照以下步骤(以 root 身份)在 Linux 或 Unix 服务器上安装 PHP。

  1. 下载 PHP 源文件压缩包,并将其在所选的目录中展开。建议将其展开到 /opt 目录中。展开此压缩文件后,您将看到一个类似 /opt/php-4.3.4 这样的目录。(该目录取决于所安装 PHP 的版本。)
  2. 确保将 ORACLE_HOME 环境变量设置为 Oracle 应用服务器 10g 所安装在的 ORACLE_HOME。
  3. 浏览到 /opt/php-4.3.4 并执行以下命令:
    ./configure --with-oci9=$ORACLE_HOME \
    --with-apxs=$ORACLE_HOME/Apache/Apache/bin/apxs \
    --enable-sigchild
    
  4. 执行无参数的 make 命令。请注意,如果在 make 命令执行过程中出现与 include (.h) 文件的位置相关的错误,则可能需要将 $ORACLE_HOME/Apache/Apache/include 的内容复制到 /opt/php-4.3.4/include。
  5. 如果第 4 步成功,则执行命令 make install
  6. 现在,就将 PHP 安装到计算机上了。将文件 libphp4.so 从 /opt/php-4.3.4/libs 复制到 $ORACLE_HOME/Apache/Apache/libexec。
第 2 步:为 PHP 页面创建 Apache/OHS 别名

既然已安装了 PHP 并针对 Oracle 应用服务器 10g 对其进行了配置,您现在就需要创建一个物理目录来存放您的 PHP 页面。您可以将此目录置于任何位置,只要 Oracle 用户对其具有读取权限就行。创建此目录后,您将需要将其映射为 OHS (Apache) 下的别名。在 $ORACLE_HOME/Apache/Apache/conf/httpd.conf 文件的 <IfModule mod_alias.c> 条目下,添加类似以下的条目:

Alias /php/ "/opt/oracle/MyDevelopment/PHP/"

<Directory "/opt/oracle/MyDevelopment/PHP">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

这个新别名将构成访问 PHP 页面的 URL 的基础。URL 的格式将形如 http://<hostname>:<port>/php/<filename>.php。

第 3 步:创建 PHP 登录页面

如前所述,Oracle 应用服务器一次性登录管理员指南 10g (9.0.4) 的第 12 章详细介绍了定制 SSO 登录页面所必备的参数和组件,并提供了定制 SSO 登录页面的 PL/SQL 和 JSP 版本的示例代码。任意定制的 SSO 登录页面至少具有以下页面参数:

  • site2pstoretoken — 包含用于登录处理的身份验证请求标记。登录服务器将此参数传递给页面。
  • ssousername — 包含登录用户的名称
  • password — 包含用户的口令
  • p_submit_url — 包含页面所提交到的 URL。登录服务器将此参数传递给页面。
  • p_error_code — 包含与任何身份验证相关的错误代码。如果身份验证过程中出现错误,则登录服务器将此参数传递给页面。
  • p_cancel_url — 包含用户按取消按钮或链接时将用户重定向到的 URL。

以下是用 PHP 编写的定制登录页面的可行示例:

                               
<?php
        
        import_request_variables("gp", "");
         
        $str_token  = $site2pstoretoken;
        $str_user   = $ssousername;
        $str_err    = $p_error_code;
        $str_cancel = $p_cancel_url;
        $str_submit = $p_submit_url;   
?>
<html>
<title> PHP Single Sign-On Page</title>
<style>
        
        .banner_div { background-color:red;
                      color:white;
                      font-size: 50;
                      text-align:center;
                      padding-top: 1.0%;
                      height: 10% ;
                      position:relative;}
        
         .error    { color:red }
        
</style>
        
<body bgcolor="white">
<div class="banner_div" width="100%" valign="center">
        PHP Single Sign-On
</div>
<div align="center">
        
<?php
        
if (! is_null($str_token)) { ?>
        
<form action="<?php print($str_submit) ?>"METHOD='POST' name='LoginForm' AutoComplete='off'>
<input type='hidden' name='site2pstoretoken' value='<?php print($str_token) ?>'> 
<input type='hidden' name='p_submit_url' value='<?php print($str_submit) ?>' >
<table>
          
<?php  
          //Check for error messages
            if (trim($str_err) != ""){
?>
           <tr><td>Error:</td><td><div class="error"><?php print($str_err) ?></div></td></tr>
        
           <?php } ?>
        
            <tr><td>Username:</td><td><input type='text' name='ssousername' size='15' maxlength='80' value=''></td></tr>
             <tr><td>Password:</td><td><input type='password' name='password' size='15' maxlength='255' value=''></td></tr>    
          <tr>
          <td align='center' valign='middle' colspan='2'>
            <input type='submit' value='Login'>
            <input type='button' name='p_request' value='Cancel' onClick='javascript:document.location.href = "<?php print($str_cancel)?>"'>
          </td>
          </tr>
         </table>
         </form>
        
<?php }else{ ?>
        
<h2><center><div class="error">This page can not be accessed directly!</div></center></h2>
        
<?php } ?>
        
</div>
</table>
</body>
</html>

>
                            

创建定制的登录页面后,使用文件扩展名 php (ssologin.php) 将其保存在第 2 步所创建的目录中。该页应可以通过任何 Web 浏览器直接访问。

第 4 步:创建 PHP 注销页面

创建定制的注销页面所需的步骤与创建登录页面所需的步骤非常相似。以下页参数是每个注销页面所必需的:

  • p_app_name[1 ..n] — 表示参与一次性注销过程的关联的应用程序名称的参数。与登录服务器关联的每个关联的应用程序都有一个形如 p_app_name1.. p_app_name(n) 的参数。注销页面需要执行循环来发现每个参数。
  • p_app_url[1..n] — 包含关联的应用程序注销 URL 的参数。每个成功执行 URL 的将显示为勾号图标。与登录服务器关联的每个关联的应用程序都有一个形如 p_app_url1..p_app_url(n) 的参数。注销页面需要执行循环来发现每个参数。
  • p_done_url — 该参数包含指向用户所注销应用程序的 URL。

以下是用 PHP 编写的定制注销页面的可行示例:

                               
<?php
          import_request_variables("gp", "");
        
          $done_url  = $p_done_url;
        
         ?>
<html>
<title> PHP Single Sign-Off Page</title>
<style>
        
          .banner_div { background-color:red;
                       color:white;
                       font-size: 50;
                       text-align:center;
                       padding-top: 1.0%;
                       height: 10% ;
                       position:relative;}
        
          .error    { color:red }
        
</style>
        
<body bgcolor="white">
<div class="banner_div" width="100%" valign="center">
PHP Single Sign-Off
</div>
<div align="center">
        
<?php 
        
           $i=0;
           for(;;)
           {
              $i++;
        
              //Create numbered parameter name values.
              $param1  = "p_app_name".$i;
              $param2  = "p_app_logout_url".$i;
        
              $app_name = $$param1;
              $url_name = $$param2;
        
        
             if(trim($app_name)!=""){
        
                 if ($i==1){
                  print("<table border=1 >");
                  print("<tr>");
                  print("<th>Appliction Name</th>");
                  print("<th>Logout Status</th>");
                  print("</tr>");
                 }
        
                 print("<tr>");
                 print("<td>");
                 print($app_name);
                 print("</td>");
                 print("<td><img src='");
                 print($url_name);
                 print("'></td>");
                 print("</tr>");
        
              }else{
        
                 if ($i>1){
                    print("</table>");
                    print("<br>");
                    print("<form><INPUT TYPE='button' NAME='p_request' VALUE='Return' ");
                    print(" onClick='javascript:document.location.href = \"");
                    print($done_url);
                    print("\";'>");
                    print("<form>");
                 }else{
        
                  print("<h2><center><div class=\"error\">This page can not be accessed directly!</div></center></h2>");
        
                 }
         
                 break;
              }
           }
?>
        </table>
        
</div>
</body>
</html>
                            

创建定制的登录页面后,使用文件扩展名 php (ssosignoff.php) 将其保存在第 2 步所创建的目录中。该页应可以通过任何 Web 浏览器直接访问。

第 5 步:将新页面注册到登录服务器

创建定制的 SSO 登录页面和注销页面的最后一步是将它们注册到登录服务器。在应用服务器的先前版本中,通过更新 ORASSO 模式(或登录服务器模式)中的 WWSSO_LS_CONFIGURATION_INFO$ 表注册登录页面和注销页面。WWSSO_LS_CONFIGURATION_INFO$ 表包含一个名为 LOGIN_URL 的列,用于确定与登录服务器关联的每个页面的位置:

  • 登录页面
  • 更改口令页面
  • 一次性注销页面

默认情况下,LOGIN_URL 列包含条目 unused unused unused。 Unused 表示定制页的占位符。在过去,第一个 unused 是登录页面的占位符,第二个是更改口令页面的占位符。从 Oracle 应用服务器 10g 开始,WWSSO_LS_CONFIGURATION_INFO$ 表中已不包含登录页面和更改口令页面的占位符。它们而是由位于 Oracle 应用服务器 10g 基础架构实例的 $ORACLE_HOME/sso/conf/policy.properties 文件中的参数 loginPageUrl 和 chgPasswordPageUrl 表示。一次性注销页面仍由 WWSSO_LS_CONFIGURATION_INFO$ 表中的第三个 unused 占位符表示。

要注册在第 3 步中创建的登录页面,请在 Oracle 应用服务器 10g 基础架构主目录中编辑 $ORACLE_HOME/sso/conf/policy.properties 文件并添加类似以下的条目:

LoginPageURL= http://<host>:<port>/php/ssologin.php

要注册在第 4 步中创建的注销页面,请登录到登录服务器所安装在的数据库实例(通常是基础架构实例)中的 ORASSO 模式。ORASSO 的口令可以位于以下 DN 下的 OID 中:

                               
OrclResourceName=ORASSO,orclReferenceName=asdb,cn=IAS Infrastructure Databases,cn=IAS,cn=Products,cn=OracleContext 
                            

成功登录到 ORASSO 模式后,执行类似如下所示的 DML 语句:

                               
UPDATE WWSSO_LS_CONFIGURATION_INFO$
SET LOGIN_URL='UNUSED UNUSED http://<host>:<port> /php/ssosignoff.php';

COMMIT;
                            

注册了这两个页面后,在 Oracle 应用服务器 10g 基础架构上停止和启动 SSO 进程。要测试这些页面,只需尝试登录到任何关联的应用程序,如 Oracle Portal。

您已经使用 PHP 为 SSO 创建了定制的登录页面和注销页面。

posted on 2011-06-19 14:54  DavidYanXW  阅读(472)  评论(0)    收藏  举报