ヘッダーをスキップ
Oracle Access Manager開発者ガイド
10g(10.1.4.2.0)
E05808-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

4 Access Manager SDKを使用したアクセス・ゲートのビルド

この章では、Access Manager SDKについて、およびカスタム・アクセス・ゲートを作成するためのAccess Manager SDKの使用方法について説明します。内容は次のとおりです。

この章は、次の項から構成されます。

4.1 アクセス・ゲートの概要

アクセス・ゲートは、アクセス・サーバーのクライアントまたはエージェントです。アクセス・ゲートは、アクセス・システムで保護されたLDAPドメイン内のリソースへのユーザーのアクセス・リクエストを処理します。

一般的には、リソース・リクエストを受け取るサーブレット(プラグイン)またはスタンドアロン・アプリケーションにカスタム・アクセス・ゲート・コードを埋め込みます。このコードは、Access Manager APIライブラリを使用して、アクセス・サーバー上での認証と認可を行います。

リソースが保護されていない場合、アクセス・ゲートはリクエストされたリソースに対する自由なアクセスをユーザーに許可します。リソースが保護されていて、ユーザーがアクセスを得るために特定の資格証明を提示できるように認可されている場合は、アクセス・ゲートがそのユーザー資格証明の取得を試み、アクセス・サーバーが資格証明を確認できるようにします。ユーザーの認証とリソースへの認可が成功すると、アクセス・ゲートは、ユーザーがリソースを利用できるようにします。


注意:

このドキュメントの目的上、Access Manager APIは、アクセス・サーバーの認証、認可、その他のサービスに開発者がアクセスするためのプログラミング用のコールのセットのみを意味します。これとは対照的に、Access Manager SDKは、アクセス・サーバーSDKインストール・パッケージによってインストールされるすべてのファイルを意味します。

4.1.1 事前作成済アクセス・ゲート(WebGate)の概要

Oracle Access Managerには、WebGateとも呼ばれる事前作成済のアクセス・ゲートがいくつか付属しています。これらデフォルトのWebGateは、次のような特定のWebサーバーにあるHTTPリソースを保護するように設定されています。

  • Microsoft Internet Information Server

  • iPlanet/SunONE Web Server

  • Apache Web Server

  • Lotus Domino

  • IBM HTTP Server(IHS)

BEA WebLogicやIBM WebSphereなどのアプリケーション・サーバー上にあるEJB(Embedded Java Bean)リソース(HTTP以外のリソース)を保護できるWebGateもあります。『Oracle Access Managerインストレーション・ガイド』には、ホスト・サーバー・ソフトウェアとホスト・マシン・オペレーティング・システムの様々な組合せに対して利用可能なWebGate実装をリストしたマトリックスが記載されています。

4.1.2 カスタム・アクセス・ゲートはどのような場合に作成するのか

一般に、Oracle Access Managerによってまだデフォルト・ソリューションが用意されていないリソースへのアクセスを制御する必要がある場合に、標準のWebGateのかわりに、カスタム・アクセス・ゲートをデプロイします。たとえば、次のような場合があります。

  • HTTP以外のリソースの保護

  • 特殊機能を実装するために開発したカスタムWebサーバーの保護(リバース・プロキシなど)

  • HTTPとHTTP以外のリソースの組合せを保護するためのシングル・サインオン(SSO)の実装

    たとえば、WebLogicクラスタとWebLogic以外のリソースが含まれているエンタープライズ環境でSSOを実現するためのアクセス・ゲートを作成することができます。

4.1.3 アクセス・ゲートのアーキテクチャ

各アクセス・ゲートは、3つのタイプのリソースからビルドします。

  • カスタム・アクセス・ゲート・コード。これは、アクセス・ゲートの他の部分が常駐するマシン上で実行されるサーブレットまたはスタンドアロン・アプリケーションに埋め込みます。アクセス・ゲート・コードの作成には、次の4種類の開発言語プラットフォームのいずれでも使用できます。

    • C++

    • C(疑似オブジェクト指向クラス)

    • C#(.NET Frameworkによるマネージ・コード)

    • Java

    これらのプラットフォームは、言語固有の方法で実装された等価な機能をサポートし、C++で記述されているアクセス・システムの実際のコードへのインタフェースとして機能します。

  • 構成情報。次があります。

    • 環境変数。アクセス・ゲートがインストールされるサーバー上に設定します。環境変数は、サーバーでUNIXとWindowsのどちらが稼働しているかによって異なります。

    • ObAccessClient.xmlファイル。アクセス・ゲートがインストールされるサーバー上に格納されます。このファイルには、configureAccessGateコマンドライン・アプリケーションを使用して入力する構成情報が格納されます。

    • アクセス・ゲートの接続設定値。この設定値を入力、表示、編集するには、「アクセス・システム・コンソール」から「アクセス・ゲート構成」に移動します。この設定値は、Oracle構成ディレクトリに格納されます。

  • Access Manager APIライブラリの各種実装。アクセス・ゲートとアクセス・サーバーの間での対話に使用します。次の各種実装があります。

    • JavaまたはCファミリ言語(C\C++\C#)のヘッダー・ファイル

    • JNIライブラリ(Java専用、jobaccess.jar内にパッケージされています)

    • ObAccessライブラリ(アクセス・ゲートをホストするマシンで使用されるオペレーティング・システム・プラットフォーム用のライブラリ)

図4-1は、ホスト・サーバー上にインストールされるアクセス・ゲートのコンポーネントを示しています。

図4-1 アクセス・ゲートのアーキテクチャの詳細

アクセス・ゲートのアーキテクチャの詳細。
「図4-1 アクセス・ゲートのアーキテクチャの詳細」の説明

4.1.4 アクセス・ゲートのバリエーション

作成されるアクセス・ゲートには、次に示す作成時の因子に応じてバリエーションがあります。

  • インストール先ホスト・マシンのオペレーティング・システム(OSプラットフォームによって異なるAccess Manager SDKインストール・パッケージが必要です)

  • スタンドアロン・アプリケーションとして実行するか、サーバー・プラグインとして実行するか

  • アクセス・ゲートを記述する開発言語(つまり、APIの実際の関数へのインタフェース。そのインタフェースが選択できる、ということです)

  • アクセス・ゲートを記述するターゲットとなるサーバーのタイプ(Webサーバーまたはアプリケーション・サーバーを保護できます)

  • アクセス・ゲートで保護するリソースのタイプ(HTTPリソースと非HTTPリソースを両方とも保護できます)

  • アクセス・ゲートがユーザー資格証明を取得する方法(様々な方法の中でも特に、HTTPフォームによる入力、セッション・トークン、コマンドライン入力を使用することをお薦めします)

4.1.5 アクセス・ゲートによるリソース・リクエストの処理方法

前述の因子によるバリエーションがあるのとは無関係に、ほとんどのアクセス・ゲートは、ユーザー・リクエストの処理に一定の基本ステップを使用します。

ユーザーまたはアプリケーションが、アクセス・ゲートがインストールされているサーバー上で実行されているサーブレットまたはアプリケーションに対してリソース・リクエストを発行すると、そのサーブレットまたはアプリケーションに埋め込まれているアクセス・ゲート・コードが、次のダイアグラムに示されている基本プロセスを開始します。

図4-2は、リソース・リクエストの処理方法を示しています。

図4-2 プロセスの概要: リソース・リクエストの処理

リソース・リクエストの処理。
「図4-2 プロセスの概要: リソース・リクエストの処理」の説明

プロセスの概要: リソース・リクエストの処理

  1. アクセス・ゲート・コードが埋め込まれているアプリケーションまたはサーブレットが、ユーザーのリソース・リクエストを受け取ります。

  2. アクセス・ゲートにより、ObResourceRequest構造体が生成されます。次に、この構造体は、リクエストされたリソースが保護されているかどうかをアクセス・ゲート・コードがアクセス・サーバーに問い合せるために使用されます。

  3. アクセス・サーバーが応答します。

  4. リソースが保護されていない場合は、次のようになります。

    1. アクセス・ゲートは、リソースへのアクセスをユーザーに許可します。保護されている場合は、次のようになります。

    2. アクセス・ゲートがObAuthenticationScheme構造体を生成、使用して、ユーザーがどの資格証明を提示する必要があるかをアクセス・サーバーに問い合せます。(このステップは、アクセス・ゲートでリソース別の認証スキームを使用できる場合にのみ必要です)。

  5. アクセス・サーバーが応答します。

  6. アプリケーションは、フォームまたはその他の手段を使用してユーザーに資格証明を要求します。場合によっては、ユーザー資格証明が次の一部としてすでに発行されていることがあります。

    • 有効なセッション・トークン

    • Webブラウザからの入力

    • アクセス・ゲート・アプリケーションを起動したコマンドライン・スクリプトの引数またはキーボード入力

  7. ユーザーがアプリケーションに応答します。

  8. アクセス・ゲートにより、ObUserSession構造体が生成されます。この構造体を通して、アクセス・サーバーはユーザー資格証明を取得し、資格証明をOracle Access Managerユーザー・ディレクトリ内のユーザー・プロファイルにマップします。

  9. 資格証明が有効と判定されると、アクセス・ゲートがユーザーのセッション・トークンを作成し、認可リクエストをアクセス・サーバーに送信します。このリクエストには、ユーザーID、ターゲット・リソースの名前およびリクエストされた操作が含まれています。

  10. アクセス・ゲートはリソースへのアクセス権をユーザーに付与します。これはもちろん、ユーザーがリクエストした特定のリソースに対する操作を行う権限がある場合に限られます。

  11. (図に対応部分なし)。正常に動作する場合、アクセス・ゲートは、作成したオブジェクトによって使用されているメモリーを割当て解除して、Access Manager APIを停止します。

ここまでのステップは、認可プロセスが必ずたどるステップです。その後に分岐する次の場合については、通常、サーブレットまたはアプリケーション内の追加コード部分によって処理されます。

  • リクエストされたリソースが保護されていない場合。

  • 保護されたリソースに関連付けられている認証チャレンジ・メソッドがアプリケーションでサポートされていない場合。

  • 有効なシングル・サインオン・クッキー(ObSSOCookie)がユーザーにあり、クッキーに埋め込まれたセッション・トークンが現在でも有効なため、資格証明を再提示しなくてもリソースにアクセスできる場合。ObSSOCookiesとシングル・サインオンの詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

  • ユーザーが、指定された条件に有効な資格証明を提示できなかった場合。

  • その他のエラー状態が発生した場合。

  • 特殊な状況や機能を処理するために、開発者がアクセス・ゲートに追加のカスタム・コードを組み込んである場合。

4.2 アクセス・ゲートのデプロイの概要

通常、アクセス・ゲートは、各分野の専門知識を持ったメンバーで構成されるチームでデプロイします。たとえば、ネットワーク管理者は、ソフトウェアのインストールや必要な環境変数の設定を行います。開発者はカスタム・アクセス・ゲート・コードを作成し、アクセス管理者は特定のリソースを保護するためのポリシー・ドメインを作成します。開発者とアクセス管理者はアクセス・サーバーを共同で構成して、新規のアクセス・ゲートと連携するようにできます。

アクセス・システムを担当するチームは、次のタスクを行う必要があります。ただし、メンバーによって、担当するタスクは異なります。

タスク概要: アクセス・ゲートのデプロイ

  1. 「Access Manager SDKのインストール」の説明に従って、アクセス・ゲートをホストするマシンにAccess Manager SDKをインストールします。

  2. 「アクセス・ゲート・コードの作成」の説明に従って、カスタム・アクセス・ゲート・コードを記述し、リソース・リクエストを受け取るサーブレットまたはアプリケーション内に組み込みます。

  3. 「アクセス・ゲートの構成」に従ってアクセス・ゲートを構成します。構成作業は次のとおりです。

    • アクセス・ゲートをインストールしたホスト・サーバー上で環境変数を設定します。

    • 「アクセス・システム・コンソール」でアクセス・ゲートのエントリを作成します(通常、このエントリは、アクセス管理者とアクセス・ゲート開発者が共同で作成します)。

    • アクセス・ゲート開発者は、アクセス・ゲートをホストするマシン上で、GUIではない対話型のconfigureAccessGateアプリケーションを実行して、ObAccessClient.xmlファイルを作成します。

  4. 『Oracle Access Managerアクセス管理ガイド』の説明に従い、ポリシー・ドメインを作成してエンタープライズ・リソースを保護します。

    この作業には、リソースの定義とリソースに対して許可する操作の指定が含まれます。一般的に、このタスクは、アクセス管理者がアクセス・システム・コンソールを使用して行います。


    注意:

    アクセス管理者がアクセス・ゲートで保護するポリシー・ドメインに割り当てるリソース・タイプとチャレンジ・メソッドを、開発者が受け、処理対象としてアクセス・ゲートに正確にコーディングする必要があります。ポリシー・ドメインを使用したリソースの保護の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

4.2.1 バージョンおよびプラットフォームのサポート

この章で特定のバージョンおよびプラットフォームについて言及している場合、それらは例示のみの目的で記載されています。

サポートおよび動作要件の情報は、次のURLで確認できます。

http://www.oracle.com/technology/documentation/

この情報を表示するには、OTNに登録する必要があります。

この統合に使用できるバージョンおよびプラットフォームを確認するには、Metalinkを次のように参照します。

Metalinkで情報を表示する手順

  1. ブラウザに次のURLを入力します。

    https://metalink.oracle.com

  2. MetaLinkにログインします。

  3. 「Certify」タブをクリックします。

  4. 「View Certifications by Product」をクリックします。

  5. 「Application Server」オプションを選択し、「Submit」をクリックします。

  6. 「Oracle Identity Management」を選択し、「Submit」をクリックします。

  7. 「Oracle Identity Management Certification Information 10g(10.1.4.0.1)(html)」をクリックして「Oracle Identity Management」ページを表示します。

  8. 「Section 6, Oracle Access Manager Certification」のリンクをクリックして動作保証マトリックスを表示します。

4.2.2 Access Manager SDKのインストール

アクセス・システムでWebGateのみを使用する場合は、それぞれの自己完結型WebGateインストール・パッケージに必要な各リソースがすべて含まれているので、Access Manager SDKをインストールする必要はありません。

1つ以上のカスタム・アクセス・ゲートを使用する場合は、アクセス・ゲートをホストするそれぞれのサーバーにAccess Manager SDKのインスタンスをインストールする必要があります。Access Manager SDKの各インスタンスがインストール先のサーバーのタイプ(UNIXまたはWindows)と一致する場合は、同一のデプロイ内にUNIX版とWindows版の両方のアクセス・ゲートをインストールできます。

Access Manager SDKは、アクセス・サーバー・インストール・パッケージには含まれていません。自己完結型SDKは、独立したセットアップ・パッケージで出荷され、次のラベルが付いています。

COREid#_#_Platform_AccessServerSDK[.ext]

#_#はインストールするOracle Access Managerのバージョン、platformはSDKをインストールするホスト・サーバーのオペレーティング・システムです。extは、ファイル名の拡張子の.exeで、Windowsインストール・パッケージの場合にのみ記載されます。

たとえば、COREid_10_1_4_sparc-s2_AccessServerSDKの場合は、Solarisオペレーティング・システムを実行するサーバーへのインストールに必要となるAccess Manager SDKのバージョンが含まれています。

通常のWindowsシステムへのAccess Manager SDKのデフォルトのインストール場所は、次のとおりです。

C:\Program Files\Oblix\AccessServerSDK

どこにインストールするにしても、SDKのインストール・パスは記録しておいてください。後でこの章内でSDK_install_dirの文字列が記載されている場合に必要となるためです。

4.2.2.1 Access Manager SDKの入手

Access Manager SDKは、次のURLにあるOracle Technology Networkからダウンロードできます。

http://www.oracle.com/technology

4.2.2.2 WindowsへのSDKのインストール

SDKをダウンロードし終わったら、それをインストールしてください。次の手順は、SDKをWindowsにインストールする方法を示しています。

WindowsマシンにSDKをインストールする手順

  1. アクセス・ゲートをインストールするマシン上で、Access Manager SDKインストール・パッケージが格納されているディレクトリに移動します。このパッケージへのパスの定型は、次のとおりです。

    Device\...\AccessSystem\Platform
    
    

    Deviceはインストール・イメージがあるCDまたはハード・ディスク・ドライブ、Platformはアクセス・ゲートのインストール先となるホスト・サーバーのオペレーティング・システムです。

  2. 次の実行可能ファイルをダブルクリックします。

    COREid#_#_Platform_AccessServerSDK
    
    

    ただし、#_#は実行対象のバージョン、Platformはアクセス・ゲートのインストール先となるマシンのオペレーティング・システムです。

    次に例を示します。

    COREid_10_1_4_Win32_AccessServerSDK.exe
    
    
  3. 「ようこそ」画面が表示されたら、「次へ」をクリックします。

  4. ライセンス契約が表示されたら、「契約の使用許諾条項に同意します」というボックスを選択して先に進むかどうかを決定します。

  5. 次の画面では、SDKをインストールしようとしているホスト・マシンの管理者権限が必要なことが示されます。

    現在のアカウントに管理者権限がある場合は、「次へ」をクリックします。

    管理者権限のないアカウントでログインしている場合は、次のサブタスクを実行します。

    1. 「取消」をクリックして、インストール・ウィザードを閉じます。

    2. システムからログオフします。

    3. 管理者アカウントを使用して再びログインします。

    4. Access Manager SDKのインストール・ウィザードを再起動します。

  6. 次のいずれかの方法を使用して、インストール・ディレクトリを選択します。

    • 「参照」をクリックして、目的のディレクトリに移動します。

    • 「宛先名」入力フィールドにカーソルを置き、目的のディレクトリのパスを入力します。

    • 「宛先名」入力フィールドに表示されるデフォルトのインストール・ディレクトリをそのまま受け入れます。

      Windowsの場合、デフォルトはC:\Program Files\NetPointになります。サブディレクトリの\AccessServerSDKは、インストール時にこのデフォルトの基本パスの末尾に追加されます。

    いずれの場合も、「宛先名」入力フィールドに目的のディレクトリが表示されたら、「次へ」をクリックして先に進みます。

  7. 目的のインストール・ディレクトリを示す画面が表示されたら、目的のロケーションが正しく示されているかどうかを確認してください。このパスは、この章内の説明でSDK_install_dirが記載されるたびに必要になりますので、記録しておいてください。

  8. 「次へ」をクリックして、ファイルのインストールを開始します。

  9. 必要に応じて、画面に表示されるプロンプトに応答します。

  10. インストールが完了すると、手順が正常に完了したことを示す画面が表示されます。

4.2.2.3 UNIXへのSDKのインストール

UNIXマシンにSDKをインストールする手順

  1. アクセス・ゲートをインストールするマシン上で、Access Manager SDKインストール・パッケージが格納されているディレクトリに移動します。

    このパッケージへのパスの定型は、次のとおりです。

    Device\...\AccessSystem\Platform
    
    

    Deviceはインストール・イメージがあるCDドライブまたはハード・ディスク・ドライブ、Platformはアクセス・ゲートのインストール先となるマシンのオペレーティング・システムです。

  2. 次の実行可能ファイルを見つけます。

    COREid#_#_Platform_AccessServerSDK
    
    

    ただし、#_#は実行対象のバージョン、Platformはアクセス・ゲートのインストール先となるマシンのオペレーティング・システムです。

    次に例を示します。

    COREid_10_1_4_sparc-s2_AccessServerSDK
    
    
  3. UNIXプロンプトで該当のAccess Manager SDKインストール・パッケージの名前を入力し、GUIモードのインストールを開始します。


    注意:

    この手順では、使用するUNIXマシンがGUIモードをサポートすることを前提としています。次のように入力することで、インストール・パッケージを対話型コマンドライン・モードで実行することもできます。
    run ./installationPackage
    
    

    installationPackageは、使用するマシンに対応するAccess Manager SDKインストール・パッケージの名前です。


  4. 「ようこそ」画面が表示されたら、「次へ」をクリックします。

  5. ライセンス契約が表示されたら、「契約の使用許諾条項に同意します」というボックスを選択して先に進むかどうかを決定します。

  6. インストーラにより、インストールするファイルの所有者として設定するユーザーおよびグループの入力を要求された場合、アクセス・ゲートで保護するサーバー・アプリケーションを所有しているユーザーとグループを指定しておくのが最も簡単です。いずれにしても、インストールを続行するには、指定したユーザーまたはrootでログインする必要があります。

  7. [Enter]を押してデフォルト・インストール・ディレクトリをそのまま使用するか、設定値を入力してから[Enter]を押します。


    注意:

    パスに特殊文字が含まれているディレクトリには、Oracle Access Managerコンポーネントをインストールすることはできません。禁止されている文字には、空白、改行、*、[]、{}などがあります。

  8. 目的のインストール・ディレクトリを示す画面が表示されたら、目的のロケーションが正しく示されているかどうかを確認してください。ディレクトリが存在しない場合は、インストーラにより作成されます。このパスは、この章内の説明でSDK_install_dirが記載されるたびに必要になりますので、記録しておいてください。

  9. 「次へ」をクリックして、ファイルのインストールを開始します。

  10. 必要に応じて、画面に表示されるプロンプトに応答します。

  11. インストールが完了すると、手順が正常に完了したことを示す画面が表示されます。

4.2.3 アクセス・ゲートの構成

アクセス・ゲートの構成を、アクセス・ゲートの作成やSDKのインストールと混同しないでください。アクセス・ゲートの構成は次のサブタスクで構成されています。

タスク概要: アクセス・ゲートの構成

  1. アクセス・ゲートを配置したホスト・サーバー上で環境変数を設定します(「環境変数の設定」を参照)。

  2. アクセス・サーバーにアクセス・ゲート・エントリを作成します(「アクセス・サーバーへのアクセス・ゲート・エントリの作成」を参照)。

  3. Access Manager SDKのインストール環境内にObAccessClient.xmlファイルを作成します(「configureAccessGateユーティリティの実行」を参照)。

  4. アクセス・ゲートごとに、configureAccessGateユーティリティを実行する必要があります(「configureAccessGateユーティリティの実行」を参照)。

    いずれのアクセス・ゲート構成サブタスクも、アクセス・ゲート・カスタム・コードを作成する前または後のどちらでもかまいません。


    注意:

    Access Manager SDKのインストール環境内にObAccessClient.xmlファイルを作成します(「configureAccessGateユーティリティの実行」を参照)。

4.2.3.1 環境変数の設定

必要となる環境変数は、アクセス・ゲートを配置するホスト・サーバーのオペレーティング・システムにより異なります。使用環境が次のどちらであるかによって、該当する方の手順を実行してください。

  • Windowsホスト

  • UNIXホスト

Windowsマシンで環境変数を設定する手順

  1. 「スタート」メニュー→「コントロール パネル」→「システム」→「詳細」→「環境変数」の順に選択します。

  2. 「システム環境変数」ボックスの内容を調べます。

  3. 「値」を追加する必要がある「変数」名があったら、その「変数」をクリックして「編集」をクリックし、ステップ6に進みます(追加しない場合は、「新規」をクリックして、次のステップに進みます)。

  4. 「新しいシステム変数」テキスト ボックスの該当のフィールドに、変数名と変数値を入力します。

  5. 「OK」をクリックして変数を確定し、ステップ7に進みます。

  6. 「システム変数の編集」テキスト ボックスが表示されたら、「変数値」フィールドをクリックして、文字列の末尾にカーソルを移動し、「; value」(順にセミコロン、空白文字、新規の値)を入力し、「OK」をクリックして変数を確定します。

  7. ステップ3から6を繰り返し、次の表に記載の変数をすべて追加します。


    注意:

    Windows 2003の場合、これらの変数はただちに有効となり、システムの再起動を必要としません。Windows 2000の場合は、変数を入力した後、マシンを再起動する必要があります。これにより、すべての変数が確実に有効になります。

表4-1 Windowsの環境変数

変数名=既存パス; 追加する値 説明

PATH = 既存パス; SDK_install_dir\oblix\lib

obaccess.dllなどのライブラリ・ファイルのロケーションを指定する。

CLASSPATH = 既存パス; SDK_install_dir\oblix\lib\jobaccess.jar

Access Manager APIのJavaクラス・アーカイブの名前とロケーションを指定する。(Access Manager APIのJava実装を使用してカスタム・アクセス・ゲート・コードを書く場合にのみ必要)。

OBACCESS_INSTALL_DIR = SDK_install_dir

Access Manager SDKのインストール・ルートを指定する。(アクセス・ゲートがSDK_install_dirをObConfig.initializeメソッドの一部として指定しない場合にのみ必要)。


UNIXマシンで環境変数を設定する手順

  1. UNIXシステムで、テキスト・エディタを使用して、変数が含まれたファイル(複数可)を開きます。

  2. 表4-2に記載のすべての変数について、リストされている値を追加します。ただし、変数名がない場合は、変数名をその値とともにファイルに追加します。


    注意:

    新規の変数が有効になるように、各UNIX環境に応じた手段(システムの再起動など)を実行してください。

表4-2 UNIXの環境変数

変数名=既存パス; 追加する値 説明

LD_LIBRARY_PATH = 既存パス; SDK_install_dir/oblix/lib(Solarisの場合のみ)

Solarisシステム上のlibobaccess.soなどのライブラリ・ファイルのロケーションを指定する。

CLASSPATH = 既存パス; SDK_install_dir/oblix/lib/jobaccess.jar

Access Manager APIのJavaクラス・アーカイブの名前とロケーションを指定する。Access Manager APIのJava実装を使用してカスタム・アクセス・ゲート・コードを書く場合にのみ必要。

POST_CLASSPATH = 既存パス; SDK_install_dir/oblix/lib/jobaccess.jar


OBACCESS_INSTALL_DIR = 既存パス; SDK_install_dir

Access Manager SDKのインストール・ルートを指定する。


4.2.3.2 アクセス・サーバーへのアクセス・ゲート・エントリの作成

アクセス・サーバーがカスタム・アクセス・ゲートに接続できるようにするには、次のタスクを実行します。(入力する情報がアクセス・ゲートとObAccessClient.xmlファイルの詳細に一致する場合は、このタスクをアクセス・ゲートの作成前に実行できます)。

アクセス・サーバー上にアクセス・ゲート・エントリを作成する手順

  1. 「アクセス・システム・コンソール」、「アクセス・システム構成」、「新規Access Gateの追加」の順に選択します。

  2. 「アクセス・ゲート名」フィールドにわかりやすい名前を入力します。


    注意:

    システム内でこのアクセス・ゲートを他のアクセス・ゲートと明確に区別できるような名前を付けてください。たとえば、ポート6006をリスニングするWebサーバー「Customer Care 5」上にアクセス・ゲートをインストールした場合、「CustCare5_6006」のようにすると、このアクセス・ゲートを識別するために役立ちます。

  3. 「ホスト名」フィールドに、アクセス・ゲートを配置するサーバー・インスタンスをホストするマシンのDNS名を入力します。

    次に例を示します。

    CustomerCare5.oblix.com

  4. 次のように環境別に各アクティビティを実行します。

    • アクセス・ゲートをインストールするマシンで、追加のWebサーバーやアプリケーション・サーバーをホストしない場合は、このステップをスキップしてください。

      (通常、この値はサーバーを担当する管理者が割り当て、アクセス・ゲートの管理者はアクセス・ゲート構成プロファイルにこの値を記録するだけになります。)

    • アクセス・ゲートをインストールするマシンで、追加のWebサーバーやアプリケーション・サーバーをホストする場合は、サーバーがユーザー・リクエストをリスニングするポート番号を入力して、アクセス・ゲートを使用するサーバー・インスタンスを指定します。


      注意:

      6000から65,536の間の値で、ネットワーク上の他のポートで使用されていない値を使用することをお薦めします。

  5. アクセス・ゲートがアクセス・サーバーに接続するときのパスワードとして使用する英数字の文字列を入力します。

    この値はどのトランスポート・モードでもオプション指定となっています。ただし、簡易モードと証明書モードではアクセス・ゲート構成と直接関連しない他のパスワードが使用されます。しかし、アクセス・ゲートにパスワードを設定することをお薦めします。オープン・モードを使用する場合は、特にそうです。これにより、未認可のアクセス・ゲートがアクセス・サーバーに接続するのを防止できるためです。

  6. 確認のため、パスワードを再入力します。

  7. パネルの最下部にある「保存」をクリックして、値を確定します。

ここまでのステップで、アクセス・ゲートのデプロイ段階に必要な情報はすべて指定しました。以降のステップでは、その他のパラメータにオプション値を入力します。これらのパラメータは、デフォルト値を変更しないかぎり、付属のデフォルト値に設定されるものです。アクセス・ゲートの変更による他のパラメータの設定の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

4.2.3.3 configureAccessGateユーティリティの実行

システム上の各アクセス・ゲートについて、configureAccessGateユーティリティを実行する必要があります。このユーティリティは、アクセス・ゲートの初期化に使用するデータをObAccessClient.xmlファイルに記憶します。

configureAccessGateツールは、Access Manager APIを起動するたび、およびアクセス・ゲート操作中のその他のタイミングで、この情報の読取りと更新を行います。

このファイルは、デフォルトではアクセス・ゲートのホスト・マシンの次のディレクトリに格納されます。

SDK_install_dir\oblix\config

ObAccessClient.xmlファイルの内容を表示するには、任意のテキスト・エディタを使用してください。ObAccessClient.xmlファイルの内容およびアクセス・ゲートの変更の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。


注意:

テキスト・エディタでObAccessClient.xmlを編集しないでください。テキスト・エディタではなく、コマンドライン・ウィンドウから起動するconfigureAccessGateアプリケーションを使用してください。

コマンドライン・ウィンドウからのconfigureAccessGateアプリケーションを使用してObAccessClient.xmlを編集することで、システム内での各アクセス・ゲート・パラメータの整合性を取ることができます。この理由は、confgureAccessGateはObAccessClient.xmlを変更するのみでなく、X.509証明書の作成やリクエストなど、簡易モードや証明書モードに関連したその他の重要タスクを実行するからです。アクセス・ゲートの変更の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

UNIXマシンでconfigureAccessGateを実行する手順

  1. UNIXコマンドラインで、次のディレクトリに移動します。

    SDK_install_dir\oblix\tools
    
    

    SDK_install_dirは、Access Manager SDKインストールのルート・ディレクトリです。

  2. 次のコマンドを入力して、[Enter]キーを押します。

    ./configureAccessGate -i SDK_install_dir -t AccessGate
    
    

    ここで、SDK_install_dirは、SDKをインストールしたディレクトリです。

  3. 画面に表示される一連のプロンプトに応答します。

    アクセス・ゲートを構成するときに使用可能なスイッチ、許容される引数およびデフォルト値については、『Oracle Access Managerアクセス管理ガイド』を参照してください。

configureAccessGateプログラムが正常終了すると、サーバー上のアクセス・ゲートが有効になります。

WindowsマシンでconfigureAccessGate.exeを実行する手順

  1. 「スタート」メニューから「ファイル名を指定して実行」を選択します。

  2. 「名前」フィールドに、次のコマンドを入力します。

    cmd
    
    
  3. コマンドライン(GUIではありません)ウィンドウが開いたら、次のコマンドを入力してディレクトリを変更します。

    cd SDK_install_dir\oblix\tools\configureAccessGate
    
    

    ここで、SDK_install_dirは、Access Manager SDKインストールへのパスです。

  4. 次のコマンドをスイッチと引数とともに入力し、configureAccessGateユーティリティを起動します。

    configureAccessGate -i SDK_install_dir -t AccessGate
    
    

    ここで、SDK_install_dirは、Access Manager SDKインストールへのパスです。

画面に表示される一連のプロンプトに応答します。アクセス・ゲートを構成するときに使用可能なスイッチ、許容される引数およびデフォルト値については、『Oracle Access Managerアクセス管理ガイド』を参照してください。

configureAccessGateプログラムが正常終了すると、サーバー上のアクセス・ゲートが有効になります。

4.2.4 アクセス・ゲート・コードの作成

この手順については、「カスタム・アクセス・ゲート・コードの概要」の項を参照してください。

4.2.4.1 カスタム・アクセス・ゲートのクローニング

追加サーバーを保護するために、すでにデプロイしたアクセス・ゲートと類似のアクセス・ゲートを作成する場合、新規のコードを記述する必要は必ずしもありません。場合によっては、既存のアクセス・ゲートを追加サーバーにクローンすることも可能です。

タスク概要: カスタム・アクセス・ゲートのクローニング

  1. クローンしたアクセス・ゲートを配置するサーバーのオペレーティング・システムと互換性のあるバージョンのAccess Manager SDKをインストールします。「バージョンおよびプラットフォームのサポート」を参照してください。

  2. 新規のアクセス・ゲートが接続するアクセス・サーバー上に、そのアクセス・ゲートのエントリを作成します。「アクセス・サーバーへのアクセス・ゲート・エントリの作成」を参照してください。

  3. configureAccessGateユーティリティを実行して、新規のアクセス・ゲートを配置するサーバー上に新しいアクセス・ゲート用のObAccessClient.xmlファイルを作成します。「configureAccessGateユーティリティの実行」を参照してください。

    あるいは別の方法として、最初のアクセス・ゲートのObAccessClient.xmlファイルを新規のホスト・サーバーにコピーし、configureAccessGateユーティリティを実行して、そのファイルを変更することもできます。

  4. アクセス・ゲートをクローンしたサーバーに対して、Access Manager API環境変数を設定します。「環境変数の設定」を参照してください。

  5. アクセス・ゲートをクローンしたサーバーに、カスタム・アクセス・ゲート・コードが含まれているプレーン・テキスト・ファイルをコピーします。

  6. 新規のアクセス・ゲートの詳細に合うよう、転送されたコードに必要な変更を行います。

  7. ホスト・サーバーのオペレーティング・システム、およびカスタム・アクセス・ゲート・コードの記述に使用した開発言語と互換性のあるコンパイラを使用して、コードを再コンパイルします。「バージョンおよびプラットフォームのサポート」を参照してください。

4.2.5 リソースの保護

ポリシー・ドメインは、保護するリソース、適用する保護方法および保護方法が適用されるユーザーとグループを指定します。通常、ポリシー・ドメインはアクセス管理者が作成および管理します。アクセス・ゲート開発者がアクセス・ゲートで保護する特定のポリシー・ドメインを作成、変更、表示するには、アクセス管理者と連携する必要があります。ポリシー・ドメインの作成の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

4.3 Access Manager SDKの概要

この項では、最初にAccess Manager SDKの概要について説明します。次に、インストールされたSDKのディレクトリとサブディレクトリの内容について概説します。最後に、BEA WebLogicシステム向けカスタム・アクセス・ゲートをサポートするためのファイル・セットについて説明します。

4.3.1 SDKの概要

Access Manager SDKはオプション・コンポーネントとして、アクセス・サーバーとは別にインストールされます。SDKには、カスタム・アクセス・ゲートをビルドするために必要なすべての情報とリソースが用意されています。SDKには、Access Manager APIの各種実装を構成する各ファイルの他、ドキュメントとコード・サンプルが含まれており、サポートされている開発プラットフォームのそれぞれについて、簡単なアクセス・ゲート・サーブレットやアプリケーションの作成方法が示されています。

4.3.2 SDKの内容

Access Manager SDKインストール・ディレクトリには、次のサブディレクトリと内容が含まれています。

_jvmAccessSDK: Access Manager SDKインストール・ウィザードが使用するJavaランタイム・リソースが含まれています。

_uninstAccessSDK: インストール・ウィザードを使用してAccess Manager SDKをアンインストールするためのリソースが含まれています。

apidoc: Access Manager APIのJava実装のドキュメントです。このドキュメントには、次のURLからアクセスできます。

SDK_install_dir\apidoc\com\oblix\access\package-summary.html


注意:

com.oblix.accessパッケージには、Access Manager APIのドキュメントがあります。com.oblix.accessmgrパッケージには、ポリシー・マネージャAPIのドキュメントがあります。

examples: サンプルのビルド・ファイル、サンプルのmakeスクリプト、AppServer_ReadMe.html Webページが含まれています。このページは、WebLogicサーバー向けのアクセス・ゲートの作成方法についての説明です。

obaccess: Javaサーブレットの例が含まれています。サーバー・アプリケーションのstartupクラスやshutdownクラスを拡張するためのプロトタイプ・クラスも含まれています。

ejbAccessTest: 「ブローカBean」EJBの例があります。BEA WebLogicのネーミング規則に従ったサンプルのビルド・ファイルとビルド・スクリプトも含まれています。

include: Access Manager APIのC++およびCの実装を構成するための、クラス、メソッド、関数を定義するヘッダー・ファイルが含まれています。

oblix: 次の4つのサブディレクトリがあります。

config: Access Manager SDKインストールの構成データが含まれています。

lang: Access Manager SDKのインストールの言語固有ファイル(英語、フランス語、その他)が含まれています。次のファイルがあります。

  • release notes: 主なドキュメントへの記載が間に合わなかった情報が含まれています。

  • netlibmsg.lst: エラーが発生したときにアクセス・ゲートが使用するメッセージのファイルです。アクセス・ゲートの構成方法に応じて、これらのメッセージは、ローカルに記録、ローカルに表示または無視できます。

  • ObAccessClient.msg: 様々なイベントに対してアクセス・ゲートが表示するメッセージ・テキストが記載されています。

lib: アプリケーションに組み込まれるAccess Manager SDKライブラリとJavaアーカイブ・ファイルが含まれています。これらは次のとおりです。

  • various libraries: APIに必要なコード・ライブラリです。(たとえば、Windows用のdllファイル、Solaris用の.soファイルなど)。

  • jobaccess.jar: APIのJavaアーカイブ・ファイルです。

  • ObAccessClient.xml file: アクセス・ゲート構成ファイルの例です。

orig: SDKのインストール中に作成される情報が含まれています。これは無視してください。

tools: 次の4つの重要なサブディレクトリが含まれています。

  • configureAccessGate: アクセス・ゲートを構成するためのツールとこのツールに必要なメッセージが含まれています。

  • lang_tools: Access Manager SDKのインストールの開発言語(Java、Cなど)固有のファイルが含まれています。

  • migration_tools: 旧バージョンのAPIで作成したアクセス・ゲートを現行バージョンのSDKに移行するための情報が含まれています。

  • openssl: 簡易モードと証明書モードで動作するようにアクセス・ゲートを構成するためのツールと簡易証明書が含まれています。

samples: スタンドアロンのアクセス・テスト・アプリケーションをJava、C、C++およびC#(.NET)で記述した各バージョンが含まれています。複雑なアプリケーションを作成する前に、SDKのビルド・プロセスに慣れるために使用してください。


注意:

SDKのインストール後は、サブディレクトリとファイルの相対位置を変更しないでください。変更すると、APIが正しくビルドおよび操作できなくなります。

4.3.2.1 BEA WebLogicサポート・ファイル

BEA WebLogicのクイック・サポートを可能にするため、Access Manager SDKにはWebLogicと互換性のあるStartupクラスとShutdownクラスがあります。WebLogic Manager API自体にも拡張可能なクラスがあり、WebLogic Serverの起動機能や停止機能を拡張できます。

ObStartupAppGate.javaクラスとObShutdownAppGate.javaクラスが、次の場所にあります。

SDK_install_dir/examples/obaccess

これらのクラスは、アクセス・ゲートの初期化の前に必要となるWebLogic Serverの初期化を可能にします。これらのクラスは、開発するアプリケーションに応じて、そのまま、あるいは変更して利用することができます。

ObStartupAppGateとObShutdownAppGateのJavaクラスは、BEA提供のWebLogicドキュメントに詳述されている規格に準拠します。WebLogic Server用に独自のStartupクラスとShutdownクラスを作成する前に、SDK_install_dir\examples\ AppServer_Readme.htmlに記載されているAccess Manager SDKとWebLogic Application Serverのドキュメントで、サーバーの起動と停止に関する項をお読みください。

Access Manager APIのObConfig.initializeメソッドはアクセス・ゲートを初期化します。ObConfig.shutdownメソッドは、アクセス・ゲートを正常に停止します。初期化が成功すると、Access Manager SDKを使用してビルドしたすべてのJavaコンポーネントは、WebLogic Serverにデプロイされたときにアクセス・ゲート構成を共有します。

4.4 Access Manager APIの概要

この項では、最初に4種類のAccess Manager API実装で使用されているネーミング規則を比較します。次に、APIクラスの概要、特に様々な開発環境における特定機能の様々な処理方法について説明します。

4種類の言語に固有実装の詳細参照資料が、「C++実装の詳細」にそれぞれ独立した項を設けて記載されています。Java実装についてのみ、詳細参照資料がオンラインのJavaDoc HTMLファイルとしても用意されています。これらのファイルは、SDK_install_dir/apidoc/index-all.htmlからアクセスできます。

4.4.1 実装間の比較

開発者は、Access Manager APIを使用してカスタム・アクセス・ゲート・コードを記述する場合、Java、C、C++またはC#の4種類の開発言語のいずれでも使用できます。これら4種類の実装は、APIを実装する際にプラットフォーム固有の機能を活用できますが、機能的には等価です。

4.4.1.1 メモリー管理の概要

Access Manager APIの4種類の実装は、メモリー管理が大きく異なります。

JavaとC#には、ともに自動ガベージ・コレクション機能があります。どの言語もデストラクタを明示的にコールすることはできません。かわりに、組込みガベージ・コレクタに、それが必要と判断したときに未使用オブジェクトのメモリーを割当て解除させます。この場合、ガベージ・コレクタによってオブジェクトがいつクリーンアップされるかまでは明らかではありません。ただし、参照されなくなったオブジェクトはすべて破棄し、メモリー・リークが発生しないように管理されます。

一方、CとC++では、プログラムに必要とされなくなったオブジェクトをクリーンアップするには、デストラクタを明示的にコールする必要があります。C言語の各疑似クラスについては、名前の末尾に_freeが付く関数を使用します。new演算子を使用して以前に作成したC++オブジェクトが不要になった場合は、delete演算子を使用して破棄します。

4.4.1.2 クラス間の対応

Access Manager APIの機能は、7つの基本クラスで編成されています。C言語は明確にはオブジェクト指向言語ではありませんが、各関数は「疑似オブジェクト指向クラス」に編成されています。

表4-3に、各言語プラットフォーム間の対応するクラス名をリストします。

表4-3 Access Manager API実装固有クラス間の対照表

クラスの用途 C++ C C# Java

パラメータを格納するための構造体(リストまたはハッシュテーブル)をサポートする。

ObMap

ObMap_t

ObDictionary

java.util.Hashtable。java.util.Dictionaryの拡張(Com. Oblix.Accessクラスではない)。

リストにおける反復処理をサポートする(CとC++実装のみ。C#とJavaはハッシュテーブルを列挙する)。

ObMapIterator

ObMap Iterator_t

ObDictionary Enumerator

java.util.Hashtable。java.util.Dictionaryの拡張(Com. Oblix.Accessクラスではない)。

ユーザー認証を処理するための構造体を作成および操作する。

ObAuthentication Scheme

ObAuthn Scheme_t

ObAuthentication SchemeMgd

ObAuthentication Scheme。ObAuthentication Schemeのインタフェースが実装される。

リソースに対するユーザー・リクエストを処理するための構造体を作成および操作する。

ObResource Request

ObResource Request_t

ObResource RequestMgd

ObResource Request。ObResource Requestのインタフェースが実装される。

ユーザー・セッションを処理するための構造体を作成および操作する。ユーザー・セッションは、ユーザー認証とともに開始され、ユーザーがログオフするかタイムアウトになると終了する。

ObUserSession

ObUserSession_t

ObUser SessionMgd

ObUserSession。ObUserSessionのインタフェースが実装される。

アクセス・ゲート構成情報を取得および変更する。

ObConfig

ObConfig_t

ObConfigMgd

ObConfig

Access Manager APIによってスローされるエラーを処理する。

ObAccess Exception

ObAccess Exception_t

ObAccess ExceptionMgd

ObAccess Exception


4.4.1.3 マルチ言語実装の概要

独自のカスタム・アクセス・ゲート・コードを記述するための開発言語インタフェースとして、4種類の機能的に等価なAccess Manager API実装のうち、いずれを選択してもかまいません。ただし、いずれの言語を使用して記述したコードも、APIの構成要素であるC++バイナリと通信します。

また、特定の開発言語、コンパイラ、サーバー、オペレーティング・システム構成について作成したアクセス・ゲート・コードは、他の環境でも正しく動作させるために再コンパイルが必要になる場合があります。

アクセス・ゲートを適正に動作させるには、次の機能領域に関して特定のベスト・プラクティスに従う必要があります。

4.4.2 ObMap

アクセス・ゲートは、アクセス・サーバーと通信する際、「名前:値」のペアとして編成されたエントリ(または項目)のリストを介して、情報の格納、引渡し、受信を行います。エンド・ユーザーには不透明なこのリストの構造体は、CおよびC++環境ではマップと呼ばれています。JavaまたはC#のコンテキストで使用する場合は、ハッシュテーブルと呼ばれます。

リストおよびハッシュテーブルの構造体には、次のようないろいろなタイプのAccess Manager API関連データが格納されます。

  • リソース・リクエスト情報

  • 認証スキーム情報

  • ユーザー・セッション情報

  • アクセス・ゲート構成情報

たとえば、代表的なアクセス・ゲートでは、ユーザー資格証明のセットを、次のような書式の単一項目リストとしてアクセス・サーバーに渡します。

UserName=JSmith&Password=J5m1th

Access Manager APIのCおよびC++実装は、このような構造体を作成および操作するためにそれぞれObMapクラスとObMap_t擬似クラスを使用します。C#実装でこれと等価なクラスはObDictionaryです。APIのJava実装の場合は、リスト構造体を処理するための独自のクラスがなく、すべてのリスト関連機能について、java.util.Hashtableという名前の標準Javaクラスを使用します。

これらの実装クラスには、すべて次の機能を持つメソッドがあります。

  • リスト(またはハッシュテーブル)を作成します。

  • 「名前:値」のペアをリスト(またはハッシュテーブル)に追加します。

  • 項目の「名前」の部分がわかっている場合に、リスト(またはハッシュテーブル)から「名前:値」のペアを読み取ります。

  • リスト(またはハッシュテーブル)内の項目の合計数をレポートします。

  • 既存のリスト(またはハッシュテーブル)をコピーします。

  • リスト構造体(またはハッシュテーブル)に使用されているメモリーを割当て解除します。

Access Manager APIのリストおよびハッシュテーブルを操作するその他のメソッドについては、「ObMapIterator」を参照してください。

4.4.2.1 等価なメソッド

表4-4に、ObMapクラスと等価な、4種類のAPI実装のコンストラクタとメソッドを示します。この表では、既存のJavaメソッドは、ObAccessのCファミリ実装のいずれかのメソッドに等価でさえあれば記載されていることに注意してください。

表4-4 ObMap関連クラスのメソッド(とコンストラクタ)間の対照表

C++(ObMap) C(ObMap_t) C#(ObDictionary) Java(java.util.Hashtable)

get

ObMap_get

get_Item

get

put

ObMap_put

add

put

size

ObMap_size

get_Count

size

copy

ObMap_copy

Clone

Hashtable(map t)

Delete

ObMap_free

(組込みガベージ・コレクション)

(組込みガベージ・コレクション)

(コンストラクタ)

ObMap_new

(コンストラクタ)

(コンストラクタ)


4.4.3 ObMapIterator

ハッシュテーブルまたはリストの中の項目を順次実行する(または反復する)必要がある場合があります。C、C++、C#の実装は、それぞれObMapIterator、ObMapIterator_t、ObDictionaryの各クラスを使用して、この機能とそれに関連する機能を処理します。Java実装は、この機能を実現するために、Access Manager APIクラスではなく標準Javaクラスのjava.util.Hashtableを使用します。

リスト構造体の解析に完全なイテレータの機能が必要とされるのはAccess Manager APIのCとC++実装のみのため、各実装に用意されているメソッドは異なっています。C#とJavaのAPI実装は、ハッシュテーブルを使用するので、解析の処理に完全なイテレータ機能は使用しません。

ObMapIteratorには、次のようなポインタ機能を持つメソッドがあります。

  • リストのポインタを作成します。

  • このポインタをリスト内で現在の項目から次の項目に移動します。

  • リスト内でポインタの現在位置の先に追加項目が存在するかどうかを判別します。現在のポインタ位置の先に項目がなくなった場合は、ポインタがリストの末尾に到達したことがわかります。

  • ポインタに使用されているメモリーを割当て解除します。

4.4.3.1 等価なメソッド

表4-5に、ObMapIteratorクラスと等価な、4種類のAPI実装のコンストラクタとメソッドを示します。この表では、Javaメソッドは、ObAccessのCファミリ実装のいずれかのメソッドに等価でさえあれば記載されていることに注意してください。

表4-5 ObMapIterator関連クラスのメソッドの対照表

C++(ObMapIterator) C(ObMapIterator_t) C#(ObDictionary Enumerator) Java(java.util.Hashtable)

next

ObMapIterator_next

MoveNext




get_Current


hasMore

ObMapIterator_hasMore





get_Entry




get_Key




get_Value


(コンストラクタ)

ObMapIterator_new

Reset


Delete

ObMapIterator_free

(組込みガベージ・コレクション)

(組込みガベージ・コレクション)


4.4.4 ObAuthenticationScheme

Access Manager APIにより、特定のユーザーがリクエストするターゲット・リソースに関連する認証スキーム(認証テンプレート)の情報を格納、引渡し、取得するためのObAuthenticationScheme構造体が作成されます。つまり、認証スキームで、一連の資格証明をユーザーに要求する方法が指定されます。

各認証スキームの詳細は、アクセス管理者により特定のリソースを保護するためにアクセス・サーバーにポリシー・ドメインが作成されたときに指定されます。認証スキームの詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

資格証明は、名前と値の複数のペアで、ユーザー認証のためにアクセス・ゲートがアクセス・サーバーに渡します。たとえば、HTTP Basicチャレンジ・メソッドを使用するアクセス・ゲートは、名前と値のペアが2つ含まれた次の資格証明文字列を渡します。

userid=JSmith&Password=J5m1th

前述の例では、名前と値のペア2つの間を区切るためにアンパサンド文字(&)を使用し、名前と値の各構成要素の間を区切るのには等記号(=)が使用されています。

前提条件となる認証スキームはリクエスト先のリソースにより異なるので、ObAuthenticationScheme構造体が作成されるのは、ObResourceRequest構造体でターゲット・リソースを指定した後になります。

各認証スキームには、表4-6にリストした要素が含まれています。

表4-6 ObAuthenticationSchemeの要素

要素 詳細

Display Name

認証スキームを識別するためのわかりやすい名前です。たとえば、常連購入者用価格リストへのアクセスを常連の顧客に付与する認証スキームに、「Customer Form Login」という名前を付けることができます。

Mask Byte

Mask

Expected Credentials

0x00

資格証明は不要です。プラグインは匿名ユーザーにマップしてください。

0x01

ユーザーIDとパスワード(HTTP Basicなど)

0x02

SSL/TLSクライアント認証を使用した証明書(HTTPSなど)

0x04

HTMLログイン・フォーム内のユーザー定義の資格証明関連フィールド

0x08

資格証明は、セキュア接続(HTTPSなど)で送信し、リダイレクションURLも使用する必要があります。

このバイトは、使用するチャレンジ・メソッドのタイプ、および資格証明の送信にセキュア接続を使用する必要があるかどうかを示します。

チャレンジ・メソッド

none

basic

certificate

form

secure

Strength

これは正の整数で認証レベルを定義します。

Redirection URL

HTTPセキュア認証を実行するURLです(形式は「https://host:port」)。セキュア認証(またはSecurIDなど中央の認証サーバー)が不要な場合は、この値はNULLに設定されます。

Challenge Parameters

Challenge Method

Value

basic

認証ドメイン(LDAPディレクトリなど)

form

ユーザーのWebブラウザに表示されるログイン・フォームのURL

form

資格証明として使用するログイン・フォーム・フィールドをスペースで区切ったリスト

form

ログイン・フォームが受信したデータをポストするURL

この要素は追加の認証スキーム関連情報を名前と値のペアとして格納します。

このオプションのパラメータが指定されていない場合は、Challenge Parametersには文字列が表示されません。

パラメータ名

realm

form

creds

action

Plug-in Sequence

この要素はAccess Manager APIからは不可視です。


4.4.4.1 等価なメソッド

表4-7に、ObAuthenticationSchemeクラスと等価な、4種類のAPI実装のコンストラクタとメソッドを示します。

表4-7 ObAuthenticationScheme関連クラスのメソッドの対照表

C++(ObAuthentication Scheme) C(ObAuthentication Scheme_t) C#(ObAuthentication SchemeMgd) Java(ObAuthentication Scheme)

getName

ObAuthn_getName

get_Name

getName

getMask

ObAuthn_getMask

get_Mask

(これに該当するメソッドはJavaではパブリックではありません)

requires SecureTransport

ObAuthn_requires SecureTransport

get_Requires SecureTransport

requires SecureTransport

IsBasic

ObAuthn_isBasic

get_IsBasic

isBasic

IsCertificate

ObAuthn_isCertificate

get_IsCertificate

isCertificate

IsForm

ObAuthn_isForm

get_IsForm

isForm

IsNone

ObAuthn_isNone

get_IsNone

isNone

getLevel

ObAuthn_getLevel

get_Level

getLevel

getRedirectUrl

ObAuthn_get RedirectUrl

get_RedirectUrl

getRedirectUrl

getChallengeParameter

ObAuthn_getChallengeParameter

get_ChallengeParameter

getChallengeParameter

getAllChallengeParameters

ObAuthn_getAllChallengeParameters

get_AllChallengeParameters

getAllChallengeParameters

getNumberOfChallengeParameters

ObAuthn_getNumberOf
ChallengeParameters

get_NumberOfChallenge
Parameters

getNumberOfChallenge
Parameters

(コンストラクタ)

ObAuthn_new

(コンストラクタ)

(コンストラクタ)

(コピー・コンストラクタ)

(未実装)

Clone

clone

Delete

ObAuthn_free

(組込みガベージ・コレクション)

(組込みガベージ・コレクション)


4.4.5 ObResourceRequest

Access Manager APIはObResourceRequest構造体を使用して、リソースへのユーザーのアクセス・リクエスト情報の格納、引渡し、取得を行います。この情報には、表4-8にリストした要素が含まれています。

表4-8 ObResourceRequestの要素

要素 詳細

Resource Type

これにはHTTPやEJBのような組込みタイプ、およびアクセス・システム・コンソールを使用して定義されるカスタム・タイプがあります。リソース・タイプの構成とポリシー・ドメインを使用したリソースの保護の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

Resource Name

Oracle Access Managerネームスペース内のターゲット・リソースの名前。次の書式で指定する必要があります。

[//host[:port]]/resourceName

オプションのhostとportの値には、このリソース名であるresourceNameが格納されているWebサーバーを指定します。

hostとportはHTTPリソースでのみ使用できます。

Operation

リソースに対して実行するアクション。リソース・タイプによって限定されます。たとえば、HTTPリソースに対するGETやPOST、EJBリソースに対するEXECUTEがそうです。カスタム・リソース・タイプの場合は、Operationsは、アクセス・システム・コンソールでリソース・タイプを定義する際に定義します。リソース・タイプの構成とポリシー・ドメインを使用したリソースの保護の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

Parameter Set(オプション)

リクエストする操作の名前と値のペア。パラメータの名前と値は文字型である必要があります。HTTPリソースの場合は、これらはリクエスト問合せ文字列かPOSTデータから抽出できます。EJBリソースでは、パラメータ・エントリがBeanのメソッドのパラメータになっている場合があります。名前と値は、いずれも必須ではありません。名前と値は、開発者とアクセス管理者の合意により、任意のデータを使用できます。

名前と値のペアは、認証リクエストのデータを指定するときに使用できます。これは、外部ソースのデータを必要とする認証に便利です。たとえば、口座番号を渡すプラグインを作成することができます。プラグインを使用したアクセス制御のカスタマイズの詳細は、『Oracle Access Managerカスタマイズ・ガイド』を参照してください。


ObResourceRequestコンストラクタは、表4-9に記載されているポリシー情報をアクセス・サーバーから戻します。

表4-9 ObResourceRequestへのレスポンスとしてアクセス・サーバーが戻す情報

要素 詳細

Protection Flag

リクエスト先のリソースがアクセス・システム・ポリシーで保護されているかどうかを示します。保護されていない場合、アクセス・ゲートはユーザーにリソースへの自由なアクセスを許可します。

Authentication scheme name

ターゲット・リソースに関連付けられている認証スキームを示す内部ID。


ObAuthenticationSchemeコンストラクタは、ObResourceRequest構造体に含まれている情報を使用して、どの認証スキームがターゲット・リソースに関連付けられているかを判別します。同様に、ObUserSessionコンストラクタは、ObResourceRequest構造体に含まれている情報を使用して、認証済のユーザーがターゲット・リソースへのアクセスを認可されているかどうかを判断します。

4.4.5.1 等価なメソッド

表4-10に、ObResourceRequestクラスと等価な、4種類の実装のメソッドの名前を示します。

表4-10 ObResourceRequest関連クラスのメソッドの対照表

C++(ObResource Request) C(ObResource Request_t) C#(ObResource RequestMgd) Java(ObResource Request)

getResourceType

ObResource_getResourceType

get_ResourceType

getResourceType

getResource

ObResource_getResource

get_Resource

getResource

getOperation

ObResource_getOperation

get_Operation

getOperation

getParameters

ObResource_getParameters

get_Parameters

getParameters

getNumberOfParameters

ObResource_getNumberOfParameters

get_NumberOfParameters

getNumberOfParameters

isProtected

ObResource_isProtected

get_IsProtected

isProtected

getAuthorizationParameters

ObResource_getParameters

get_AuthorizationParameters

getAuthorizationParameters

getNumberOfAuthorizationParameters

ObResource_getNumberOf
AuthorizationParameters

get_NumberOfAuthorization
Parameters

getNumberOfAuthorization
Parameters

(コピー・コンストラクタ)

(未実装)

Clone

Clone

Delete

ObMap_free

(組込みガベージ・コレクション)

(組込みガベージ・コレクション)

(コンストラクタ)

ObResourceRequest_new

(コンストラクタ)

(コンストラクタ)


4.4.6 ObUserSession

ログイン(または「認証」)の成功に必要となるユーザー資格証明がアクセス・サーバーで検証されると、アクセス・ゲートがObUserSession構造体を作成して、ユーザー、ターゲット・リソースおよび各種認証ポリシー情報について、情報の格納、引渡し、取得を行います。この構造体は、ObResourceRequestとObAuthenticationSchemeの構造体から抽出した情報、およびアクセス・サーバーが戻す情報を使用して作成されます。あるいは、ObUserSession構造体を作成する別の方法として、現在有効なユーザー・セッションに関する情報が格納されているセッション・トークンに含まれるASCII文字列の情報を使用することもできます。

逆に、ObUserSession構造体からセッション・トークンを生成することもできます。ObUserSession構造体は有効なセッション・トークンから作成できます。ただし、セッション・トークンに含まれていないアクションやエラーに関する情報は含まれません。最初にリクエストされたURLをパスワード変更サーブレットに渡す認証リクエストおよびフォーム・ベース認証のために、外部ソースからデータを取得する方法の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

ObUserSessionの中心的メソッドは、認証に成功したユーザーがターゲット・リソースへのアクセスを認可されているかどうかに関するアクセス・サーバー内の情報を戻します。ObUserSessionのその他のメソッドは、ユーザーが認証を受けた時期(および、拡張すれば、現行セッションが期限切れとなる時期も含まれる)、リソースへのアクセスについてユーザーが最後に認可を得た時間、その他の情報を戻します。すべてのメソッドによってObUserSession構造体に戻される情報を、表4-11に示します。

表4-11 ObUserSessionの要素

要素 説明

User Identity

LDAPユーザー・ディレクトリ内にあるユーザーのプロファイル・エントリの識別名(DN)。

Level

ユーザーの認証に使用された認証スキームのセキュリティ・レベル。アクセス・システム管理者が割り当てる相対的数値です。認証スキームのセキュリティ・レベルの変更の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

Location(オプション)

ユーザーのWebブラウザ(またはユーザーのWebブラウザを表すプロキシ・サーバー)のロケーション。たとえば、プロキシ・サーバーのDNSホスト名、またはユーザーのブラウザのIPアドレス。

Session start time

ユーザーの認証が成功した時間。この時間と最大許容セッション時間を使用して、セッションがいつ期限切れになるかを計算できます。

Last use time

最後にユーザーの認可が成功した時間。アイドル・セッションがいつ期限切れになるかを計算するために使用します。

Actions

認証と認可の際にアクセス・システムのポリシー・ルールに従って設定されたアクション。各ルールには、ユーザーが作成可能なアクション・タイプが含まれています。アクション・タイプにより、アプリケーションにアクションの解釈方法を指示します。HTTPの場合の例には、cookieやheaderVarがあります。

Status

セッションの現行のステータスを示す、次のいずれか。

  • logged in

  • logged out

  • login failed

  • expired

Error numberとError Message

最後の認証または認可で発生したエラー。


4.4.6.1 等価なメソッド

表4-12には、Access Manager APIのObUserSessionクラスと等価なメソッドの名前が記載されています。

表4-12 ObUserSession関連クラスのメソッドの対照表

C++(ObUserSession) C(ObUserSession_t) C#(ObUserSessionMgd) Java(ObUserSession)

getLocation

ObUser_getLocation

get_Location

getLocation

getAction

ObUser_getAction

getAction

getAction

getActions

ObUser_getActions

getActions

getActions

getActionTypes

ObUser_ getActionTypes

get_ActionTypes

getActionTypes

getNumberOfActions

ObUser_ getNumberOfActions

getNumberOfActions

getNumberOfActions

getLevel

ObUser_getLevel

get_Level

getLevel

getStartTime

ObUser_ getStartTime

get_StartTime

getStartTime

getLastUseTime

ObUser_ getLastUseTime

get_LastUseTime

getLastUseTime

getStatus

ObUser_getStatus

get_Status

getStatus

getUserIdentity

ObUser_ getUserIdentity

get_UserIdentity

getUserIdentity

getError

ObUser_getError

get_Error

getError

getErrorMessage

ObUser_ getErrorMessage

get_ErrorMessage

getErrorMessage

isAuthorized

ObUser_isAuthorized

isAuthorized

IsAuthorized

isAuthorizedWith Parameters

ObUser_isAuthorized WithParameters

isAuthorized WithParameters

IsAuthorized(追加パラメータ付き)

getSessionToken

ObUser_ getSessionToken

get_SessionToken

getSessionToken

setLocation

ObUser_setLocation

set_Location

setLocation

(コピー・コンストラクタ)

(未実装)

Clone

Clone

logoff

ObUser_logoff

LogOff

logoff

Delete

ObUser_free

(組込みガベージ・コレクション)

(組込みガベージ・コレクション)

ObUserSession(コンストラクタ)

ObUserSession_from Token

ObUserSession_ Authenticate

ObUserSessionMgd(コンストラクタ)

ObUserSession(コンストラクタ)


4.4.7 ObConfig

ObConfigクラスには、Access Manager APIの初期化と停止を行う各メソッド、およびアクセス・ゲートのデータの格納、引渡し、取得を行う各メソッド、および必要に応じた変更と構成を行うための各メソッドが含まれています。

ObConfig.initializeメソッドは、次の機能を実行します。

  • インストール・ディレクトリの名前をinstallDirパラメータまたは環境変数のOBACCESS_INSTALL_DIRから取得して、アクセス・ゲートに渡します。

  • ObAccessClient.xmlファイルがアクセス・サーバー・インストール・ディレクトリに存在し、アクセス・ゲートで読取り可能なことを検証します。

  • 現行のブートストラップのアクセス・ゲート構成をObAccessClient.xmlから読み取ります。

  • ObAccessGate.msgメッセージ・カタログを開いて、ユーザーのエラーや例外に使用するテキストを取得します。

  • ブートストラップ構成に指定されている、1つ以上のアクセス・サーバーに接続します。

  • アクセス・サーバーからアクセス・ゲート構成全体を取得します。

  • ローカル・リソース・リクエストと認証スキーム・キャッシュを作成します。

  • アクセス・ゲート構成を定期的に更新するスレッドを作成します。

ObConfigにはshutdownメソッドがあり、アプリケーションでAccess Manager APIを使用する必要がなくなった場合には、リソースを解放するためにこれをコールする必要があります。

4.4.7.1 構成パラメータ

各アクセス・ゲートに設定される構成情報の詳細を表4-13に示します。これらの項目は、アクセス・ゲートが初期化されるたびにObConfig構造体に読み取られます。これらの項目にアクセスするには、C++の実装ではObConfig.getItemとObConfig.getAllItemsを使用します。C、C#およびJavaの実装で対応するメソッドは、それぞれObConfig_getItemとObConfig_getAllItems、ObConfigMgd.getItemとObConfigMgd.getAllItems、およびCom.Oblix.Access.getItemとCom.Oblix.Access.getAllItemsです。

表4-13 アクセス・ゲート構成パラメータ

パラメータ名 パラメータ値

accessServerTimeout

アクセス・サーバーへの接続が再確立を必要とするまでにオープン状態でいられる秒数。

cacheTimeout

キャッシュ内の認証スキームまたはリソース・リクエスト・オブジェクトが自動的にフラッシュされるまで存続できる秒数。値にゼロを指定した場合は、キャッシュ内の要素がフラッシュされなくなります。

debug

onまたはoff。debugをonにすると、アクセス・ゲートは、アクセス・サーバーに送信したすべてのメッセージをトレースします。

failoverThreshold

アクセス・ゲートに接続されているプライマリ・アクセス・サーバーの数がこのしきい値以下になると、Access Manager APIがセカンダリ・アクセス・サーバーへの1つ以上の接続を開きます。

id

Oracle構成ディレクトリ内のアクセス・ゲートの文字列の識別子。

idleTimeout

認証が成功してから次の認証が必要となるまでの最大秒数。この値を超過すると、ユーザーは再度認証される必要があります。

transportSecurity

アクセス・サーバーへの接続に使用される、次のいずれかのセキュリティ・モード。

open: 暗号化は行われません。

simple: TLS暗号化。組込みのCAから生成した証明書を使用します。

cert: TLS暗号化。完全なCAから発行された証明書を使用します。

lastUpdateTime

1/1/1970 00:00から、最後にアクセス・ゲートの構成を更新した時間にいたるまでの秒数。

maxCacheElements

固定サイズの認証スキーム・キャッシュに含まれるリソース・リクエスト・オブジェクトの最大数。

maxConnections

アクセス・ゲートに対してオープン可能な最大接続数。

preferredHost

認証スキームがセキュア認証を必要とする場合に、ユーザーのブラウザのリダイレクト先となるWebサーバーのホスト・アドレス。アクセス・ゲートはこの値を使用して、たとえば、認証リクエスト内のホストを指定します。

primaryDomain

シングル・サインオン・ドメインなど、ObSSOCookiesの設定に使用するドメイン。他のアプリケーションは、このパラメータを必要に応じて解釈または無視できます。

primary_server_list

アクセス・ゲートが最初に接続するアクセス・サーバーのリスト。

このリストの形式は次のとおりです。

host1:port1,numConn1, host2:port2,numConn2 . . .

ここで、hostnは、アクセス・サーバーのDNSです。

secondary_server_list

プライマリ・サーバーへの接続数がfailoverThreshold以下になったときに、アクセス・ゲートが接続するアクセス・サーバーのリスト。

このリストの形式は次のとおりです。

host1:port1,numConn1, host2:port2,numConn2 . . .

ここで、hostnは、アクセス・サーバーのDNSです。

sessionTimeout

アプリケーションで生成されたユーザー・セッションが有効でいられる最大秒数。

sleepFor

アクセス・サーバー接続が稼働中であることをアクセス・ゲートが確認する時間間隔(秒数)。

state

enabledまたはdisabled。このパラメータの解釈はアプリケーションに依存します。disabledにすると、アクセス・ゲートがすべてのリソースへのアクセスを即時に可能にします。


4.4.7.2 等価なメソッド

表4-14には、Access Manager APIのObConfigクラスと等価なメソッドの名前が記載されています。

表4-14 ObConfig関連クラスのメソッドの対照表

C++ ObConfig C ObConfig_t C# ObConfigMgd Java ObConfig

initialize

ObConfig_initialize

initialize

initialize

shutdown

ObConfig_shutdown

shutdown

shutdown

getAllItems

ObConfig_getAllItems

get_AllItems

getAllItems

getNumberOfItems

ObConfig_ getNumberOfItems

get_NumberOfItems

getNumberOfItems

getItem

ObConfig_getItem

getItem

getItem

getSDKVersion

ObConfig_getSDKVersion

get_SDKVersion

getSDKVersion

getNAPVersion

ObConfig_getNAPVersion

get_NAPVersion

getNAPVersion


4.4.8 ObAccessException

Access Manager APIメソッドは、問題を検出するとObAccessExceptionをスローします。発生したエラーの種類は、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」に記載の、Cファミリのエラー・メッセージ名の列挙リストから推測できます。(Javaでこれに相当するのは、「Javaのステータス・メッセージとエラー・メッセージのためのフィールド」です)。

エラーによっては、ObAccessGate.msgカタログ内にあるその例外メッセージ・テキストに0個から5個の部分文字列データを挿入できます。(この挿入機能が使用できるのは、Cファミリの実装の場合のみです。Javaのメッセージの文字列は分割できない1つのまとまりとして処理する必要があります)。

たとえば、エラー・コード208のObAccessException_NOT_PROTECTEDは、次のように定義されます。

   ObAccessException_NOT_PROTECTED {
      Unprotected resource %1 used in an
      ObAuthenticationScheme or ObUserSession
      constructor.}

アプリケーションがxresourceという名前の非保護リソースを処理中にこのエラーが発生した場合、APIによりObAccessExceptionが生成されます。この構造体にはエラー・コード208とテキストxresourceが含まれますが、xresourceは%1の部分文字列が置換されたものです。

このクラスのCファミリのメソッドでは、エラー・コードを抽出できる他にも、インデックス(1から5)を使用して部分文字列を抽出できます。また、部分文字列を挿入した、メッセージ全体に相当する文字列を生成できます。C++環境では、捕捉したObAccessExceptionを削除する必要があります。

一方、Java実装では、メッセージ全体の取得のみがサポートされるという制限があります。つまり、部分文字列の抽出や操作をすることはできません。

C実装のObAccessExceptionでエラーを捕捉するには、例外ハンドラを作成する必要があります。詳細は、「C言語のエラー・ハンドラ」を参照してください。サンプル・プログラム「C擬似クラスを使用した簡単なアクセス・ゲートの例: access_test_c.cpp」には、このようなエラー・ハンドラが実装されています。

4.4.8.1 等価なメソッド

表4-15には、ObAccessException関連クラスの、4種類の実装について各メソッドを示します。

表4-15 ObResourceRequest関連クラスのメソッドの対照表

C++(ObAccess Exception) C(ObAccess Exception) C#(ObAccess ExceptionMgd) Java(ObResource Request)

getCode

ObAccessException_getCode

get_Code


getParameter

ObAccessException_getParameter

getParameter


toString

ObAccessException_toString

get_String


getCodeString

ObAccessException_getCodeString(現在非使用。「C言語のエラー・ハンドラ」を参照)

getCodeString


(コンストラクタ)

Exception Handler(登録されているコールバック関数)

(コンストラクタ)

(コンストラクタ)


4.5 グローバリゼーションとAccess Manager SDK、Access Manager API、カスタム・アクセス・ゲート

Access Manager SDKをインストールすると、Access Manager APIを使用してカスタム・アクセス・ゲート・コードを記述する場合、Java、C、C++またはC#(.NET)の4種類のサポートされている開発言語のいずれでも使用できます。これら4種類の実装は、APIを実装する際にプラットフォーム固有の機能をそれぞれ活用しますが、機能的には等価です。

カスタム・アクセス・ゲート・コードを記述するための開発言語インタフェースとして、4種類の実装のうちどれでも選択できますが、このガイドに記載されているように、各コードはAPIの構成要素であるC++バイナリとやり取りします。

10g(10.1.4.0.1)のCおよびC++のAccess Manager APIを使用してカスタム・アクセス・ゲートを開発する場合、データは自動的にUTF-8エンコーディングで送受信されます。以前のリリースでは、データの送受信にはLatin-1エンコーディングが使用されていました。

Access Manager APIの10g(10.1.4.0.1)C#(.NET)マネージ・コード実装には、外部的な変更はありません。ただし、C# .NETの実装は内部的にUTF-16エンコーディングを使用するようになりました。これは以前のNetPointリリースではLatin-1に変換されていたものです。10g(10.1.4.0.1)アクセス・サーバーおよびC#のアクセス・ゲートでは、UTF-8エンコーディングが自動的に使用されます。

Access Manager APIのJavaインタフェースとJava実装では、10g(10.1.4.0.1)になってからの外部的な変更はありません。ただし、JNIのコールでは、UTF-16でエンコードされた、Javaの文字型オブジェクトが使用されます。以前のNetPointのリリースでは、このデータはLatin-1に変換されていました。10g(10.1.4.0.1)のアクセス・サーバーとアクセス・ゲートでは、UTF-8エンコーディングが自動的に使用されます。


注意:

10g(10.1.4.0.1)のAccess Manager SDKとカスタムの10g(10.1.4.0.1)のアクセス・ゲートは、以前のアクセス・サーバー、および以前のAccess Manager SDKやアクセス・ゲートとの下位互換性はありません。ただし、下位互換である10g(10.1.4.0.1)のアクセス・サーバーとは、以前のアクセス・ゲートを使用することはできます。『Oracle Access Manager概要』も参照。

4.6 カスタム・アクセス・ゲート・コードの概要

通常のアクセス・ゲート・アプリケーションは、アクセス・ゲート・セッションの作成に必要となる一連のイベントのほとんどを含むように編成する必要があります。

アクセス・ゲート・アプリケーションを構成するセクション

  1. 必要なライブラリのインクルードまたはインポート

  2. リソースの取得

  3. 認証スキームの取得

  4. 認証スキームに必要となるユーザー資格証明の収集

  5. ユーザー・セッションの作成

  6. リソースに対するユーザー認可のチェック

  7. クリーンアップ(CおよびC++のみ: C#とJavaは、自動ガベージ・コレクションを使用)

  8. 停止

4.6.1 代表的なアクセス・ゲートの実行フロー

HTTPのフォーム・ベースのアクセス・ゲートのアプリケーションとプラグインは、すべて次の図に示すような同じ基本パターンを実行します。図は、フォーム・ベースのアプリケーションのプロセス・フローを示しています。

  • メイン・フロー: ライブラリのインポート、アクセス・サーバーSDKの初期化、ObResource Requestオブジェクトの作成、リクエストされたリソースが保護されているかどうかの確認。

  • リクエストされたリソースが保護されている場合: obAuthentication Schemeオブジェクトの作成。HTTPフォーム・ベースの認証スキームを使用している場合: ユーザーIDとパスワードを含む構造体の作成、obUserSessionオブジェクトの作成、ユーザーが認証されるかどうかの判定。

  • ユーザーが認証された場合: ユーザーが認可されるかどうかの判定。

  • ユーザーが認可された場合: リクエスト先リソースへのアクセスの許可、APIの停止、プログラムの終了。

    ユーザーが認可されなかった場合: アクセスの拒否、理由の報告、APIの停止、プログラムの終了。

  • HTTPフォーム・ベースの認証スキームを使用していない場合: アクセスの拒否、理由の報告、APIの停止、プログラムの終了。

    リソースが保護されていない場合: アクセスの許可、APIの停止、プログラムの終了。

フォーム・ベースのアプリケーションのプロセス・フロー。

注意:

このテスト・アプリケーション、あるいはこの章に記載のその他のいずれかの例を実行する場合、アクセス・システムが正しくインストールおよび構成されていることを確認してください。特に、サンプル・プログラムで必要とされるURLと認証スキームに完全に一致するリソースが保護されるように構成されているかどうかを確認してください。ポリシー・ドメインの作成とポリシー・ドメインを使用したリソース保護の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

4.6.2 簡単なアクセス・ゲートの例: JAccessGate.java

この例は、このマニュアルで最も簡単なアクセス・ゲート・プログラムです。正常に動作するアクセス・ゲートに必要となる最小限のタスクをどのように実装するかを示した例となっています。

  • アクセス・サーバーに接続します。

  • HTTPフォーム・チャレンジ・メソッドを採用した認証スキームを使用してログインします。

  • HTTP GETリクエストを使用してリソースの認証を確認します。

  • Access Manager APIの例外を捕捉およびレポートします。

通常、このコール順序は、フォーム・チャレンジ・メソッドを使用するアクセス・ゲートに共通です。フォーム・メソッドのアクセス・ゲート間の主な違いは、認証に必要な資格証明と保護するリソース・タイプです。

例4-1には、JAccessGate.javaの完全なリストが記載されています。テキスト・ファイルのJAccessGate.javaにこのコードをそのままコピーすることで、Access Manager SDKがインストールされているマシン上で実行することができます。リストの後の項に、コードの各行についての注釈を記載します。これにより、開発者がJavaバージョンのAccess Manager APIコールをよく理解できるようになります。

例4-1 JAccessGate.java

import java.io.*;
import java.util.*;
import java.text.*;
import com.oblix.access.*;

public class JAccessGate {
   public static final String ms_resource = "//Example.com:80/secrets/
         index.html";
   public static final String ms_protocol = "http";
   public static final String ms_method = "GET";
   public static final String ms_login = "jsmith";
   public static final String ms_passwd = "j5m1th";
   public static void main(String argv[]) {
      try {
         ObConfig.initialize();
         ObResourceRequest rrq = new ObResourceRequest(ms_protocol, ms_resource,
               ms_method);
         if (rrq.isProtected()) {
            System.out.println("Resource is protected.");
            ObAuthenticationScheme authnScheme = new ObAuthenticationScheme(rrq);
            if (authnScheme.isForm()) {
               System.out.println("Form Authentication Scheme.");
               Hashtable creds = new Hashtable();
               creds.put("userid", ms_login);
               creds.put("password", ms_passwd);
               ObUserSession session = new ObUserSession(rrq, creds);
               if (session.getStatus() == ObUserSession.LOGGEDIN) {
                  if (session.isAuthorized(rrq)) {
                     System.out.println("User is logged in and authorized for the
                           request at level " + session.getLevel());
                  } else {
                     System.out.println("User is logged in but NOT authorized");
                  }
               } else {
                  System.out.println("User is NOT logged in");
               }
            } else {
               System.out.println("non-Form Authentication Scheme.");
            }
         } else {
            System.out.println("Resource is NOT protected.");
         }
      }
      catch (ObAccessException oe) {
         System.out.println("Access Exception: " + oe.getMessage());
      }
      ObConfig.shutdown();
   }
}

4.6.2.1 注釈付きコード

システム入出力、テキスト処理、その他の基本機能を実装する3つの標準Javaライブラリをインポートします。

import java.io.*;
import java.util.*;
import java.text.*;

Access Manager APIクラスのJava実装が含まれているライブラリをインポートします。このライブラリが参照可能になるように、(UNIXとWindowsの両方のプラットフォームについて)jobaccess.jarのあるディレクトリがCLASSPATH環境変数に設定されていることを確認します。このファイルは、デフォルトではSDK_install_dir/oblix/libにインストールされています。

import com.oblix.access.*;

このアプリケーションにJAccessGateと命名します。

public class JAccessGate {

このアプリケーションは最も単純な例のため、リソースへのユーザー・アクセス・リクエストに関連したパラメータを表すためにグローバル定数を宣言することとします。

このパラメータ・セットは、実際のアプリケーションでは通常、リクエスト元アプリケーション、HTTPフォーム入力またはコマンドライン入力から渡される文字列の配列として受信されます。

   public static final String ms_resource = "//Example.com:80/secrets/index.html";
   public static final String ms_protocol = "http";
   public static final String ms_method = "GET";
   public static final String ms_login = "jsmith";
   public static final String ms_passwd = "j5m1th";

Javaインタプリタ上でメイン・メソッドを起動します。argvという名前の文字列配列がメイン・メソッドに渡されます。この例では、jsmithというユーザーが、j5m1thというパスワードを使用して、HTTPリソースの//Example.com:80/secrets/index.htmlをリクエストします。GETは、リクエスト先リソースに対して実行するHTTP操作です。サポートされているHTTP操作とポリシー・ドメインを使用したリソース保護の詳細は、『Oracle Access Managerアクセス管理ガイド』内の章を参照してください。

 public static void main(String argv[]) {

メイン・メソッド内のすべての関連するプログラム文をtryという大きなブロック内に配置し、プログラム終了までにすべての例外をこの捕捉用ブロックで捕捉できるようにします。

 try {

Access Manager SDKを初期化して、JAccessGateアプリケーションがCom.Oblix.Access JavaクラスとネイティブのJNIオブジェクトの両方にアクセスできるようにします。ここではSDKインストール・ルートを指定せず、OBACCESS_INSTALL_DIR環境変数に設定されている値を使用します。

SDKは1回初期化するだけで済みますが、Access Manager APIへのコールを試行する場合は、その前にSDKを初期化してください。

 ObConfig.initialize();

ObResourceRequestコンストラクタを次の3つのパラメータとともに使用して、rrqという名前の新規のリソース・リクエスト・オブジェクトを作成します。

  • ms_protocol: リクエストするリソースのタイプを示します。未指定の場合、デフォルト値はHTTPです。使用可能な値としてEJBもありますが、ここでの例にはこれは使用しません。『Oracle Access Managerアクセス管理ガイド』に記載されているように、カスタム・タイプを作成することもできます。

  • ms_resource: リソースの名前です。この例でリクエストされたリソース・タイプはHTTPなので、リソース名の前にホスト名とポート番号を付けることができます。次のようにします。

    //Example.com:80/secrets/index.html
    
    
  • ms_method: リソースに対して実行する操作のタイプです。リソース・タイプがHTTPの場合、指定可能な操作はGETとPOSTです。EJBタイプのリソースでは、操作はEXECUTEにかぎります。カスタム・リソース・タイプの場合、アクセス・システム・コンソールでリソース・タイプを設定する際に、許可する操作を定義します。リソース・タイプの定義とポリシー・ドメインを使用したリソース保護の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

ObResourceRequest rrq = new ObResourceRequest(ms_protocol,
   ms_resource, ms_method);

リクエスト先リソースrrqが認証スキームによって保護されているかどうかを確認します。

 if (rrq.isProtected()) {

リソースが保護されている場合は、そのことをレポートします。

 System.out.println("Resource is protected.");

ObAuthenticationSchemeコンストラクタを使用して、authnSchemeという名前の認証スキーム・オブジェクトを作成します。リクエスト先リソースrrqを指定し、この特定のリソースに特定の認可スキームが関連付けられているかどうかを、ObAuthenticationスキームに確認させます。

 ObAuthenticationScheme authnScheme =new ObAuthenticationScheme(rrq);

フォーム・ベースの認可スキームが使用されているかどうかを判別します。

 if (authnScheme.isForm()) {

認可スキームにチャレンジ・メソッドとしてHTTPフォームが使用されている場合は、そのことを報告します。次に、ユーザー名(userid)とユーザー・パスワード(password)を示す名前と値のペアを指定したcredsというハッシュテーブルを作成します。ms_loginとms_passwdの値をハッシュテーブルに読み取ります。

System.out.println("Form Authentication Scheme.");
Hashtable creds = new Hashtable();
creds.put("userid", ms_login);
creds.put("password", ms_passwd);

ObUserSessionコンストラクタを使用して、sessionという名前のユーザー・セッション・オブジェクトを作成します。リクエスト先リソースをrrqに、認証スキームをcredsに指定して、認証試行が成功したかどうかを示す状態情報が含まれる新規の構造体をObUserSessionが戻すようにします。

ObUserSession session = new ObUserSession(rrq, creds);

ObUserSession状態情報に対してgetStatusメソッドを起動し、ユーザーが正常にログインできたか(認証されたか)どうかを確認します。

if (session.getStatus() == ObUserSession.LOGGEDIN) {

ユーザーが認証されている場合は、リソース・リクエスト構造体rrqに指定したリソースへのアクセスをユーザーが認可されるかどうかを確認します。

if (session.isAuthorized(rrq)) {
  System.out.println(
    "User is logged in " +
    "and authorized for the request " +

sessionという名前のユーザー・セッションに対してgetLevelメソッドによって戻される認可レベルを確認します。

 "at level " + session.getLevel());

rrqに指定されたリソースに対してユーザーが認可されていない場合は、ユーザーは認証されているが、リクエストしたリソースへのアクセスは認可されていないことを報告します。

} else {
  System.out.println("User is logged in but NOT authorized");

ユーザーが認証されていない場合は、そのことを報告します。(実際のアプリケーションでは、ユーザーに認証のための機会をさらに与える場合があります)。

} else {
  System.out.println("User is NOT logged in");

認証スキームでHTTPフォーム・ベースのチャレンジ・メソッドが使用されていない場合は、そのことを報告します。実際のアプリケーションでは、このようなとき、basic(useridとpasswordのみを要求する)、certificate(SSL over HTTPSまたはTLS over HTTPS)、またはsecure(リダイレクトURLによるHTTPS)など、認可スキームに指定されている他のチャレンジ・メソッドを提供するように分岐する場合があります。チャレンジ・メソッドとユーザー認証の構成の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

} else {
  System.out.println("non-Form Authentication Scheme.");
}

リソースが保護されていない場合は、そのことを報告します。(アクセス・ゲートはリソースを保護しようとしなくなるので、ユーザーはリクエストしたリソースへのアクセスを自動的に取得します)。

} else {
  System.out.println("Resource is NOT protected.");
}
}

前述のtryブロック内でエラーが発生した場合は、関連テキスト・メッセージのoeを取得して、これを報告します。

catch (ObAccessException oe) {
  System.out.println(
  "Access Exception: " + oe.getMessage());
}

これで、アクセス・サーバーへのコールが終了になるため、APIを停止して、このコールでAPIが保持してきたメモリーを解放します。

  ObConfig.shutdown();
}
}

プログラムを終了します。このアプリケーションで作成した構造体が使用するメモリーは、不要になった時点でJava Garbage Collectionにより自動的にクリーンアップされるので、割当て解除する必要はありません。

4.6.3 C擬似クラスを使用した簡単なアクセス・ゲートの例: access_test_c.cpp

このサンプルでは、C言語の疑似クラスを使用して簡単なアクセス・ゲートを実装します。これらのクラスのメンバーである関数は、実際には、C++コードをコールするラップされたポインタです。

SDKが初期化される前に、例外処理が、SDKに登録されているコールバック関数により実行されます。このエラー処理関数は、エラー条件の報告が必要になったときに各SDKメソッド内からコールされます。この例では、エラー・ハンドラは、単に、戻されたエラー・コードに関連するエラー・メッセージを表示し、プログラムを停止するのみです。

例4-2には、access_test_c.exeの完全なリストが記載されています。このコードをテキスト・ファイルにカット・アンド・ペーストして、.cppのファイル名拡張子を付け、アクセス・ゲートが常駐するサーバー・プラットフォーム上でC言語プログラム用のコンパイラを使用することで、実行可能コードを生成することができます。リストの後の項に、このコード例の注釈を記載します。

例4-2 access_test_c.cpp

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <obaccess_api_c.h>

void myExceptionHandler(ObAccessExceptionCode_t code) {
   printf("EXCEPTION: %s\n", ObAccessException_getCodeString(code));
   exit(1);
}

int main(int argc, char *argv[]) {
   const char *userid, *password, *method, *url, *location;
   ObResourceRequest_t res;
   ObAuthnScheme_t authnScheme;
   ObMap_t credentials;
   ObUserSession_t user;
   ObMap_t actions;
   ObMap_t parameters;
   ObMap_t requiredParameters;
   ObMapIterator_t iter;
   const char **actionTypes;
   const char *name, *val;
   int i;
   if (argc < 5 || argc > 7) {
      printf("EXPECTED: userid password HTTP-method URL(without http:)
            [client-location [authz-parameters]]\n");
      return 1;
   }
   userid   = argv[1];
   password = argv[2];
   method   = argv[3];
   url      = argv[4];
   location = argc >= 6 ? argv[5] : NULL;
   if (argc == 7) {
      parameters = ObMap_new();
      for (name = strtok(argv[6], "="); name != NULL; name = strtok(NULL, "=")) {
         val = strtok(NULL, "&");
         ObMap_put(parameters, name, val);
      }
   } else {
      parameters = NULL;
   }
   ObAccessException_setHandler(myExceptionHandler);
   ObConfig_initialize(NULL);
   res = ObResourceRequest_new("http", url, method, NULL);
   if (ObResource_isProtected(res)) {
      authnScheme = ObAuthn_new(res);
      if (ObAuthn_isBasic(authnScheme)) {
         credentials = ObMap_new();
         ObMap_put(credentials, "userid",   userid);
         ObMap_put(credentials, "password", password);
         user = ObUserSession_authenticate(res, credentials, NULL);
         if (ObUser_getStatus(user) == ObUser_LOGGEDIN) {
            ObUser_setLocation(user, location);
            if (parameters != NULL
                     ? ObUser_isAuthorizedWithParameters(user, res, parameters)
                     : ObUser_isAuthorized(user, res)) {
               printf("GRANTED\n");
            } else {
               printf("DENIED\n");
               printf("ERROR: %s\n", ObUser_getErrorMessage(user));
               if (ObUser_getError(user) == ObUser_ERR_NEED_MORE_DATA) {
                  requiredParameters = ObResource_getAuthorizationParameters(res);
                  printf("REQUIRED PARAMETERS:");
                  iter = ObMapIterator_new(requiredParameters);
                  while (ObMapIterator_hasMore(iter)) {
                     ObMapIterator_next(iter, &name, &val);
                     printf(" ");
                     printf(name);
                  }
                  printf("\n");
                  ObMapIterator_free(&iter);
                  ObMap_free(&requiredParameters);
               }
            }
         if (parameters != NULL) ObMap_free(&parameters);
         printf("ACTIONS:");
         actionTypes = ObUser_getActionTypes(user);
         for (i = 0; actionTypes[i] != NULL; i++) {
            actions = ObUser_getActions(user, actionTypes[i]);
            iter    = ObMapIterator_new(actions);
            while (ObMapIterator_hasMore(iter)) {
               printf("\n");
               ObMapIterator_next(iter, &name, &val);
               printf("%s: %s=%s", actionTypes[i], name, val);
            }
            ObMapIterator_free(&iter);
         }
         ObUser_logoff(user);
         } else {
            const char *errmsg;
            errmsg = ObUser_getErrorMessage(user);
            printf("LOGIN FAILED: %s", errmsg);
         }
         ObUser_free(&user);
         ObMap_free(&credentials);
      } else {
         printf("RESOURCE SCHEME NOT BASIC");
      }
      ObAuthn_free(&authnScheme);
    } else {
       printf("NOT PROTECTED");
    }
    ObResource_free(&res);
    ObConfig_shutdown();
    return 0; }

4.6.3.1 注釈付きコード

システム入出力、文字列操作、その他の基本機能を実装する3つの標準Cライブラリをインポートします。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Access Manager APIのC実装をインポートします。

#include <obaccess_api_c.h>

例外ハンドラを作成して、関連エラー・メッセージを報告してエラーに対応し、プログラムを終了します。

void myExceptionHandler(ObAccessExceptionCode_t code) {
   printf("EXCEPTION: %s\n", ObAccessException_getCodeString(code));
   exit(1);
}

メイン・メソッドの必要な変数と定数を宣言します。argcは、スペース区切りの配列argv内の文字列の合計数を示します。argv内の最初の文字列は、常にプログラムの名前のaccess_test_c.exeです。

int main(int argc, char *argv[]) {
   const char *userid, *password, *method, *url, *location;
   ObResourceRequest_t res;
   ObAuthnScheme_t authnScheme;
   ObMap_t credentials;
   ObUserSession_t user;
   ObMap_t actions;
   ObMap_t parameters;
   ObMap_t requiredParameters;
   ObMapIterator_t iter;
   const char **actionTypes;
   const char *name, *val;
   int i;

コマンドライン入力に5個未満または7個を超える文字列があると、コマンドラインから入力する必要がある情報とその順序がユーザーに表示されます。

   if (argc < 5 || argc > 7) {
      printf("EXPECTED: userid password HTTP-method URL(without http:)
            [client-location [authz-parameters]]\n");
      return 1;
   }

コマンドライン入力に5個から7個の文字列がある場合は、2番目から5番目の文字列(argv[1]〜arg[4])をそれぞれuserid、password、method、urlの変数に代入します。

   userid   = argv[1];
   password = argv[2];
   method   = argv[3];
   url      = argv[4];

コマンドライン入力から受け取った配列内に6個以上の文字列があると、6番目の引数をlocation変数に代入します。ない場合は、locationをNULLに設定します。

 location = argc >= 6 ? argv[5] : NULL;

コマンドライン入力の配列にちょうど7個の文字列が含まれている場合は、新規のObMapリスト構造体を作成し、これにparametersという名前を付けます。

if (argc == 7) {
   parameters = ObMap_new();

通常、7番目の文字列(argv[6])は「n1=v1&n2=v2...」の形式にします。ここではstrtokメソッドを起動して、この文字列を名前と値のペアのトークンに分解し、parametersリストに読み取ります。strtokは、解析する文字列がNULLで開始されるものと想定しているので、各トークンの開始デリミタは常にNULLです。さらにstrtokは、トークンの終了デリミタを見つけて、トークンを構成する文字を戻した後、終了デリミタ以前と終了デリミタを含むすべてをNULLに設定します。したがって、各トークンの開始デリミタは必ずNULLです。

一方、終了デリミタは、=から&に変更された後、strtokが文字列内の後続のパラメータの名前と値を解析すると、再び元の=に戻ります。

      for (name = strtok(argv[6], "="); name != NULL; name = strtok(NULL, "=")) {
         val = strtok(NULL, "&");
         ObMap_put(parameters, name, val);
      }

argv内の引数が5個または6個のみの場合は、parametersをNULLに設定します。

   } else {
      parameters = NULL;
   }

コールバック関数のmyExceptionHandlerをAccess Manager SDKに登録します。

 ObAccessException_setHandler(myExceptionHandler);

Access Manager API SDKがインストールされているディレクトリを指定せずに、アクセス・ゲートを初期化します。ここではロケーションが指定されていないので、オペレーティング・システムは、OBACCESS_INSTALL_ DIR環境変数に設定されている値を使用します。

 ObConfig_initialize(NULL);

ObResourceRequest構造体を作成して、次を指定します。

  • リソース・タイプ: HTTP

  • ターゲット・リソース: urlに格納されている値

  • リソースに対して実行するアクション: methodに格納されている値

  • 認証に必要なパラメータ: NULL

 res = ObResourceRequest_new("http", url, method, NULL);

リクエストしたリソースが保護されている場合は、authnSchemeという名前のObAuthn構造体を作成し、リソースの保護に使用されている具体的な認証スキームについての情報を戻します。

if (ObResource_isProtected(res)) {
  authnScheme = ObAuthn_new(res);

認証スキームがBasicの場合は、ObMap構造体を作成し、ユーザーの資格証明を示すuseridとpasswordの値をこの構造体に読み込みます。

if (ObAuthn_isBasic(authnScheme)) {
  credentials = ObMap_new();
  ObMap_put(credentials, "userid",   userid);
  ObMap_put(credentials, "password", password);

指定されたリソース・リクエスト、および指定されたユーザーIDとパスワードについて、ObUserSession_authenticateメソッドを起動します。

 user = ObUserSession_authenticate(res, credentials, NULL);

ユーザーがログインできた場合、つまりユーザーの認証が成功した場合は、locationに格納されている値をユーザーのマシンのIPアドレスとして割り当てます。

 if (ObUser_getStatus(user) == ObUser_LOGGEDIN) {
    ObUser_setLocation(user, location);

parameters構造体が空ではない場合は、parametersに指定するパラメータを使用して、ターゲット・リソースへのアクセスをユーザーが認可されるかどうかを確認します。空の場合は、パラメータを使用しないで、ターゲット・リソースへのアクセスをユーザーが認可されるかどうかを確認します。

if (parameters != NULL
         ? ObUser_isAuthorizedWithParameters(user, res, parameters)
         : ObUser_isAuthorized(user, res)) {

ターゲット・リソースへのアクセスをユーザーが認可されている場合は、そのことを報告します。

 printf("GRANTED\n");

認可されていない場合は、リクエストが拒否されたこと、および関連するエラー・メッセージを報告します。

戻すエラー・コードがObUser_ERR_NEED_MORE_DATAの場合は、認可に必要なすべてのパラメータの名前を報告します。これには、requiredParametersという名前のObMapIterator構造体を作成し、必要なパラメータをすべて報告します(ただし、ユーザーが指定する必要があるそれぞれの値は報告できません)。

} else {
   printf("DENIED\n");
   printf("ERROR: %s\n", ObUser_getErrorMessage(user));


注意:

このリソースのアクセス・ポリシーを使用するには、元のObUser_isAuthorizedコールには指定されていない認可パラメータを指定する必要があります。このような事態が発生するのは、ポリシーの認可ルールが、パラメータを必要とする認可プラグインのある認可スキームを使用している場合です。第5章「ポリシー・マネージャAPI」を参照してください。

if (ObUser_getError(user) == ObUser_ERR_NEED_MORE_DATA) {
   requiredParameters = ObResource_getAuthorizationParameters(res);
   printf("REQUIRED PARAMETERS:");
   iter = ObMapIterator_new(requiredParameters);
   while (ObMapIterator_hasMore(iter)) {
      ObMapIterator_next(iter, &name, &val);
      printf(" ");
      printf(name);
   }

requiredParameters構造体と、この構造体から名前文字列を抽出するために使用したイテレータiterの両方を破棄することで、クリーンアップを行います。

      printf("\n");
      ObMapIterator_free(&iter);
      ObMap_free(&requiredParameters);
   }
}

parametersが空ではない場合、構造体が使用したメモリーの割当てを解除します。

 if (parameters != NULL) ObMap_free(&parameters);

リソースに適用されるポリシーの認証ルールと認可ルールに定義されているすべてのアクションを報告します。これらのアクションは「タイプ:名前:値:値:タイプ」の形式で、アクション間の順序は任意です。ObUser_getActionTypesが、この一連のアクションのアクション・タイプの配列を戻します(headerVarなど)。逆に、各アクション・タイプのアクションからなるObMap構造体を戻すのは、ObUser_getActionsです。iterが、各ObMap構造体に含まれるすべてのアクションを実行します。

printf("ACTIONS:");
actionTypes = ObUser_getActionTypes(user);
for (i = 0; actionTypes[i] != NULL; i++) {
   actions = ObUser_getActions(user, actionTypes[i]);
   iter    = ObMapIterator_new(actions);
   while (ObMapIterator_hasMore(iter)) {
      printf("\n");
      ObMapIterator_next(iter, &name, &val);
      printf("%s: %s=%s", actionTypes[i], name, val);
   }

ObMapIterator構造体のactionsの情報を抽出するために使用したiter文字列を破棄します。

 ObMapIterator_free(&iter);

ローカルのObUserSession構造体をログオフ状態に設定します。


注意:

残りのセッション・トークン(ユーザーのブラウザ上のCookieに格納されたものなど)によってセッションが再び作成されるのを防止するため、これらのユーザー・セッションをログオフ状態にすることで、これらのトークンを明示的にリセットする必要があります。

}
ObUser_logoff(user);

ログオフ状態に設定しない場合は、認証が失敗したこと、および関連するエラー・メッセージを報告します。

} else {
   const char *errmsg;
   errmsg = ObUser_getErrorMessage(user);
   printf("LOGIN FAILED: %s", errmsg);
}

userというObUser構造体とcredentialsというObMap構造体に対するメモリーを割当て解除してクリーンアップします。

 ObUser_free(&user);
ObMap_free(&credentials);

認証スキームがBasicでない場合は、そのことを報告します。

 } else {
    printf("RESOURCE SCHEME NOT BASIC");
}

authnSchemeという名前のObAuthn構造体が使用していたメモリーを割当て解除してクリーンアップします。

 ObAuthn_free(&authnScheme);

リクエストしたリソースが保護されていない場合は、そのことを報告します。

 } else {
    printf("NOT PROTECTED");
}

resという名前のObResourceRequest構造体が使用していたメモリーを割当て解除してクリーンアップします。次に、アクセス・ゲートを停止して、正常終了したことを示す0を戻します。

   ObResource_free(&res);
   ObConfig_shutdown();
   return 0;
}

プログラムを終了します。

4.6.4 例: Javaログイン・サーブレット

この例では、APIコールの基本パターンに従って、JAccessGateの例に記載のようにアクセス・ゲートを定義します。ただしこの例は、Webサーバーまたはアプリケーション・サーバー内で実行されるJavaサーブレットとして実装されています。アクセス・ゲート・サーブレットは、この環境では、Webアプリケーションのユーザーに対してさらに重要な役割を果すことができます。サーブレットは、アクセス・システムのセッション・トークンをユーザーのHTTPセッション内に格納することで、ユーザーがシングル・サインオンできるようにします。つまり、最初のリクエストで確立された認証済アクセス・サーバー・セッション情報は、1回認可確認した後でも破棄されません。格納されたセッション・トークンは、破棄されずに、Beansやその他のサーブレットなどのサーバー側アプリケーション・コンポーネントで利用できるようになり、これらのコンポーネントが同じ資格証明をリクエストするためにユーザーに繰り返し割り込む必要がなくなります。セッション・トークン、ObSSOCookiesおよびシングル・サインオンの構成の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

このサンプル・ログイン・サーブレットは、カスタム・ログイン・ページ上のフォームでuserid/passwordパラメータを受け付け、ユーザーにOracle Access Managerへのログインの機会を提供します。ログインが成功した場合、サーブレットは、セッション・トークンをObUserSessionオブジェクト内に格納します。これにより、同じHTTPセッション内の後続のリクエストは認証ステップをバイパスし(後続のリクエストが最初のリクエストと同じ認証スキームを使用する場合)、シングル・サインオンを実現します。

例4–3は、Javaログイン・サーブレットの完全なリストです。このコードは、Webサーバーまたはアプリケーション・サーバーに組み込むプラグインのベースとして使用できます。このコード・サンプルの後に、このコードの注釈付きバージョンがあります。

例4-3 Java LoginServletの例

package obaccess;

import java.io.*;
import java.util.*;
import java.text.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.util.*;
import com.oblix.access.*;

public class LoginServlet extends HttpServlet {

   public void init(ServletConfig config) throws ServletException {
      try {
         ObConfig.initialize("install directory of access server sdk");
      } catch (ObAccessException oe) {
         oe.printStackTrace();
      }
   }

   public void service(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
      ObAuthenticationScheme authnScheme = null;
      ObUserSession user = null;
      ObResourceRequest resource = null;
       response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      out.println("<HTML>");
      out.println("<HEAD><TITLE>LoginServlet: Error Page</TITLE></HEAD>");
      out.println("<BODY>");
      HttpSession session = request.getSession( false);
      String requestedPage = request.getParameter(Constants.REQUEST);
      String reqMethod = request.getMethod();
      Hashtable cred = new Hashtable();
      try {
         if (requestedPage == null) {
            out.println("<p>REQUESTED PAGE NOT SPECIFIED\n");
            out.println("</BODY></HTML>");
            return;
         }
         resource = new ObResourceRequest("http", requestedPage, "GET");
         if (resource.isProtected()) {
            authnScheme = new ObAuthenticationScheme(resource);
            if (authnScheme.isBasic()) {
               if (session == null) {
                  String sUserName = request.getParameter( Constants.USERNAME);
                  String sPassword = request.getParameter( Constants.PASSWORD);
                  if (sUserName != null) {
                     cred.put("userid", sUserName);
                     cred.put("password", sPassword);
                     user = new ObUserSession(resource, cred);
                     if (user.getStatus() == ObUserSession.LOGGEDIN) {
                        if (user.isAuthorized(resource)) {
                           session = request.getSession( true);
                           session.putValue( Constants.OBUSER, user);
                           response.sendRedirect( requestedPage );
                        } else {
                           out.println("<p>User " + sUserName + " not
                                 authorized for " + requestedPage + "\n");
                        }
                     } else {
                        out.println("<p>User" + sUserName + "NOT LOGGED IN\n");
                     }
                  } else {
                     out.println("<p>USERNAME PARAM REQUIRED\n");
                  }
               } else {
                  user = (ObUserSession)session.getValue(Constants.OBUSER);
                  if (user.getStatus() == ObUserSession.LOGGEDIN) {
                     out.println("<p>User " + user.getUserIdentity() + " already
                           LOGGEDIN\n");
                  }
               }
            } else {
               out.println("<p>Resource Page" + requestedPage + " is not
                     protected with BASIC\n");
            }
         } else {
            out.println("<p>Page " + requestedPage + " is not protected\n");
         }
      } catch (ObAccessException oe) {
            oe.printStackTrace();
      }
   out.println("</BODY></HTML>");
   }
}

4.6.4.1 注釈付きコード

このリストに定義されているすべてのクラスは、obaccessという名前のパッケージに含まれています。

package obaccess;

システム入出力、テキスト操作、基本機能を実装する3つの標準Javaパッケージをインポートします。

import java.io.*;
import java.util.*;
import java.text.*;

サーブレット関連機能を実装する2つのJava拡張機能パッケージをインポートします。

import javax.servlet.*;
import javax.servlet.http.*;

例外を処理する標準Javaパッケージをインポートします。

import java.io.IOException;

com.oblix.access.jarパッケージをインポートします。これはAccess Manager APIのJava実装です。

import com.oblix.access.*;

このサーブレットは、Java Enterprise Editionでサポートされている汎用HttpServletの機能をベースにビルドされており、LoginServletという名前です。

public class LoginServlet extends HttpServlet {

サーブレット・エンジンはinitメソッドを1回コールして、アクセス・ゲートを初期化します。初期化に失敗した場合は、そのことを該当のエラー・メッセージとともに報告します。

public void init() {
      ObConfig.initialize(Òinstall directory of the access server sdkÓ);
   } catch (ObAccessException oe) {
         oe.printStackTrace();
   }
}

javax.servlet.serviceメソッドを起動し、ユーザーのリソース・リクエストを処理します。

public void service(HttpServletRequest request, HttpServletResponse response)
  throws IOException, ServletException {

リソース・リクエストの処理に使用するObAccess構造体が格納されている変数をNULLとして初期化し、このアプリケーションが使用するレスポンス・タイプをtext/htmlに設定します。

ObAuthenticationScheme authnScheme = null;
ObUserSession user = null;
ObResourceRequest resource = null;
response.setContentType("text/html");

LoginServlet: Error Pageという名前の出力ストリームを開き、ユーザーのブラウザにリダイレクトします。

PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>LoginServlet: Error Page</TITLE></HEAD>");
out.println("<BODY>");

このユーザーにすでにセッションがあるかどうかを確認します。falseをパラメータとしてgetSessionメソッドを起動して、既存サーブレット・セッションの値(ObUserSessionではない)がある場合はその値を戻します。ない場合はNULLを戻します。

 HttpSession session = request.getSession(false);

ターゲット・リソースの名前を取得して、これをrequestedPage変数に代入し、リクエストに使用されたHTTPメソッド(GET、POST、PUTなど)の名前を取得して、これをreqMethod変数に代入します。

String requestedPage = request.getParameter(Constants.REQUEST);
String reqMethod = request.getMethod();

credという名前のハッシュテーブルを作成し、ユーザーの資格証明を格納します。

 Hashtable cred = new Hashtable();

requestedPage変数が空のまま戻された場合は、ターゲット・リソースの名前が正しく指定されていないことを報告し、サーブレットを終了します。

try {
   if (requestedPage == null) {
out.println("<p>REQUESTED PAGE NOT SPECIFIED\n");
out.println("</BODY></HTML>");
return;
   }

リクエストしたページの名前が戻された場合は、ObResourceRequest構造体を作成して、次を設定します。

  • リソース・タイプ: HTTP

  • HTTPメソッド: GET

  • リソース: requestedPage変数に設定されている値

 resource = new ObResourceRequest("http", requestedPage, "GET");

ターゲット・リソースが保護されている場合は、リソース・リクエスト用にObAuthenticationScheme構造体を作成し、名前をauthnSchemeとします。

if (resource.isProtected()) {
   authnScheme = new ObAuthenticationScheme(resource);

ターゲット・リソースに関連付けられている認証スキームがHTTP「Basic」で、現在ユーザー・セッションが存在しない場合は、javax.servlet.servletrequest getParameterを起動してユーザーの資格証明であるユーザー名とパスワードを戻し、それぞれsUserNameとsPasswordの変数に代入します。


注意:

次の文でauthnScheme.isBasicコールを正しく動作させるには、ユーザー名とパスワードをユーザーのHTTPリクエストの問合せ文字列内に含める必要があります。次のようにします。

http://host.example.com/resource?username=bob&userpassword=bobspassword

ここで、resourceは、リクエスト先のリソース、bobはリクエスト元のユーザー、bobspasswordはユーザーのパスワードです。



注意:

authnScheme.isBasicのかわりにauthnScheme.isFormを使用する場合は、追加コードを記述して、次のステップを実装する必要があります。

authnScheme.isFormの追加コードに実装するステップ

  1. 元のリクエストを処理して、フォーム・ベースのログインが必要なことを判断します。

  2. ログイン・フォームに関する302リダイレクト・レスポンスを送信し、HTTPセッションに元のリソース情報を保存します。

  3. ユーザー名とパスワードとともにポストされたフォーム・データを処理して、ユーザーを認証します。

  4. HTTPリソースから元のリクエストのリソースを取得し、そのリソースに関する302リダイレクト・レスポンスを送信します。

  5. 元のリクエストをもう1回処理しますが、今回はHTTPセッション内に格納されているObUserSessionを使用して処理します。

if (authnScheme.isBasic()) {
   if (session == null) {
      String sUserName = request.getParameter(Constants.USERNAME);
      String sPassword = request.getParameter(Constants.PASSWORD);

ユーザー名が存在する場合は、credという名前のハッシュテーブルに、関連パスワードと合せて読み取ります。

if (sUserName != null) {
   cred.put("userid", sUserName);
   cred.put("password", sPassword);

resourceという名前のObResourceRequest構造体とcredハッシュテーブルの情報に基づいて、ユーザー・セッションを作成します。

 user = new ObUserSession(resource, cred);

戻されたユーザーのステータス・コードがLOGGEDINの場合、そのユーザーの認証は成功しています。

 if (user.getStatus() == ObUserSession.LOGGEDIN) {

ターゲット・リソースへのアクセスをユーザーが認可されるかどうかを確認します。

 if (user.isAuthorized(resource)) {

サーブレット・ユーザー・セッション(ObUserSessionと混同しないでください)を作成し、そこにユーザーの名前を追加します。

 session = request.getSession( true);
session.putValue( Constants.OBUSER, user);

ユーザーのブラウザをターゲット・ページにリダイレクトします。

 response.sendRedirect(requestedPage);

ターゲット・リソースへのアクセスをユーザーが認可されなかった場合は、そのことを報告します。

 } else {
    out.println("<p>User " + sUserName + " not authorized
      for " + requestedPage + "\n");
 }

ユーザーが正しく認可されていない場合は、そのことを報告します。

} else {
    out.println("<p>User" + sUserName + "NOT LOGGED IN\n");
}

ユーザー名が入力されていない場合は、そのことを報告します。

 } else {
out.println("<p>USERNAME PARAM REQUIRED\n");
}

セッションがすでに存在する場合は、OBUSERを取得し、これをuserセッション変数に代入します。

 } else {
    user = (ObUserSession)session.getValue(Constants.OBUSER);

ユーザーがログインできた場合、つまりユーザーの認証が成功した場合は、そのことをユーザー名とともに報告します。

 if (user.getStatus() == ObUserSession.LOGGEDIN) {
      out.println("<p>User " + user.getUserIdentity() + " already
      LOGGEDIN\n");
 }
}

ターゲット・リソースがBasic認証スキームで保護されていない場合は、そのことを報告します。

} else {
   out.println("<p>Resource Page" + requestedPage + " is not protected
         with BASIC\n");
}

ターゲット・リソースがどの認証スキームによっても保護されていない場合は、そのことを報告します。

} else {
   out.println("<p>Page " + requestedPage + " is not protected\n");
}

エラーが発生した場合は、トレースバックを報告します。

 } catch (ObAccessException oe) {
   oe.printStackTrace();
}

出力をユーザーのブラウザにストリームとして送信します。

    out.println("</BODY></HTML>");
  }
}

4.6.5 C# APIを使用した例: access_api_test.cs

このサンプル・プログラムは、C#(.NETのマネージ・コード)APIの例です。

プロセスの概要: サンプル・プログラム

  1. システムを初期化します。


    注意:

    WindowsまたはUNIXでこのプログラムを実行する前に、必ずOBACCESS_INSTALL_DIR環境変数にSDK_install_dirを設定してください。

  2. リソース・リクエストを作成し、ターゲット・リソースが保護されているかどうかを確認します。

  3. このリソースの認証がBasicかどうかを確認します。

  4. Oracle Access Managerユーザー・ディレクトリに定義されているcuser10k429という名前のユーザーをログインさせます。


    注意:

    ユーザーの名前およびその他の詳細を変更して、Oracle Access Managerユーザー・ディレクトリ内の有効なエントリに一致させてください。

  5. ユーザーがログインできたことを確認します。

  6. ターゲット・リソースへのアクセスをユーザーが認可されるかどうかを確認します。

  7. ユーザーのIDとユーザーのマシンのロケーションを取得します。

次の行は、このプログラムへのコマンドライン入力の典型です。

 access_api_test //www.example.com:88/managed

.NETプログラムのコンパイル、リンク、実行の詳細は、次のファイルを参照してください。

SDK_install_dir\samples\access_csharp\README.txt

例4–4は、Access_API_Testの完全なリストです。リストの後に注釈付きコードの項があります。

例4-4 Access_API_Test

using System;
using System.Reflection;
using System.Collections;
using Oblix.Access.Server;
using Oblix.Access.Common;

class Access_API_Test {
  public static int Main(string[] args) {
    String resourceString = "//www.oblix.com:80/managed";
    if ( args.Length > 0 )resourceString = args[0];
    Console.WriteLine("Initialize the configuration directory!");
    try {
      String config = "../../../../";
      ObConfigMgd.initialize(config);
    } catch (ObAccessExceptionMgd ex) {
      Console.WriteLine("Initialization Exception caught: " + ex.String);
      return -1;
    }
    ObDictionary parameters = new ObDictionary();
    ObResourceRequestMgd resource = new
        ObResourceRequestMgd("http",resourceString,"GET",parameters);
    if ( resource.IsProtected == true ) {
      Console.WriteLine("Resource " + resourceString + " is protected ..." );
      try {
        ObAuthenticationSchemeMgd authnScheme = new
            ObAuthenticationSchemeMgd(resource);
        if ( authnScheme.IsBasic ) {
          Console.WriteLine("Authentication is basic" );
          ObDictionary credentials = new ObDictionary();
          credentials.Add("userid","cuser10k429");
          credentials.Add("password","oblix");
          ObUserSessionMgd user = new ObUserSessionMgd(resource,credentials);
          ObUserStatusMgd status = user.Status;
          if ( !status.IsLoggedIn ) {
            Console.WriteLine("User is not logged in");
            return -1;
          }
          user.Location = "127.0.0.1";
          Console.WriteLine("User: " + user.UserIdentity + " is logged
              in...");
          Console.WriteLine("User location is: " + user.Location);
          if ( user.IsAuthorized(resource) ) {
            Console.WriteLine("User is authorized");
          } else {
            Console.WriteLine("User is not authorized");
          }
        } else {
          Console.WriteLine("Authentication is not basic" );
        }
      } catch (ObAccessExceptionMgd ex) {
        Console.WriteLine("Access Exception caught: " + ex.String);
        return -1;
      }
    } else {
      Console.WriteLine("Resource is NOT protected ... " );
    }
    return 1;
  }

4.6.5.1 注釈付きコード

ロード済メソッドのメソッド・タイプ管理、リストおよびハッシュテーブルのサポートならびに基本機能を実装する3つの.NET frameworkライブラリをインポートします。

using System;
using System.Reflection;
using System.Collections;

Access Manager APIのC#実装をインポートします。この実装は、メイン・ライブラリおよび、ポリシー・マネージャAPIとともに頻繁に使用するコードからなる共有ライブラリにあります。

using Oblix.Access.Server;
using Oblix.Access.Common;

このプログラムにAccess_API_Test.csという名前を付けます。

class Access_API_Test {
   public static int Main(string[] args) {

このプログラムは、フォームまたはセッション・トークンからユーザー入力を取得しません。ここでは説明を簡単にするため、単に、実行するメソッドのパラメータにサンプルの値を割り当てるだけです。

 String resourceString = "//www.example.com:80/managed";

C#のアプリケーションは、コマンドラインに最大1つの引数を予期します。args配列に1つ以上の引数がある場合、args内の最初の文字列をresourceString変数に代入し、前の文で割り当てたURL文字列を置換します。引数がない場合は、前の文でresourceStringに代入した文字列をそのまま使用します。

if ( args.Length > 0 )resourceString = args[0];
Console.WriteLine("Initialize the configuration directory!");
try {
  String config = "../../../../";
  ObConfigMgd.initialize(config);

初期化が失敗した場合は、そのことを該当のエラー・メッセージとともに報告し、プログラムの事実上の終了を意味する-1の値を戻します。(このC#プログラムでは、実行に失敗すると-1を戻します。一方、C++のサンプルのaccess_test_cは、実行が失敗した場合は1を戻し、実行が正常終了した場合は0を戻します。)

} catch (ObAccessExceptionMgd ex) {
..Console.WriteLine("Initialization Exception caught: " + ex.String);
..return -1;
}

parametersという名前のObDictionary構造体を作成し、ユーザー資格証明を格納します。

 ObDictionary parameters = new ObDictionary();

リソース・リクエスト・オブジェクトを作成し、パラメータを次のように指定します。

  • リソース・タイプをHTTPに設定します。

  • ターゲット・リソースとして、さきにresourceStringに代入したURLを指定します。

  • リソースに対して実行するアクションとしてGETを指定します。

  • ObDictionary構造体のparametersに、認証に必要なパラメータを格納します。

ObResourceRequestMgd resource = new
   ObResourceRequestMgd("http",resourceString,"GET",parameters);

ターゲット・リソースが保護されているかどうかを確認し、保護されている場合は、そのことを報告します。

if ( resource.IsProtected == true ) {
   Console.WriteLine("Resource " + resourceString + " is protected ..." );

リクエストしたリソースに関連付けられている認証スキームの情報を戻すためのオブジェクトを作成します。

try {
   ObAuthenticationSchemeMgd authnScheme = new
      ObAuthenticationSchemeMgd(resource);

認証スキームがBasicの場合は、そのことを報告します。

if ( authnScheme.IsBasic ) {
   Console.WriteLine("Authentication is basic" );

credentialsという名前のObDictionary構造体を作成し、ユーザーのログイン資格証明を格納します。ユーザーIDとパスワードは、このテスト・アプリケーションではソース・コード内に提供されていますが、実際のアプリケーションではキーボード入力またはセッション・トークンから取得されます。

ObDictionary credentials = new ObDictionary();
credentials.Add("userid","cuser10k429");
credentials.Add("password","oblix");

現行ユーザー、リクエストしたリソース、そのリソースに関連付けられている認証スキームに関する情報を格納するためのObUserSessionMgd構造体を作成します。

ObUserSessionMgd user = new ObUserSessionMgd(resource,credentials);
ObUserStatusMgd status = user.Status;

ユーザーがログインできなかった場合、つまり、ユーザーの認証が成功しなかった場合は、そのことを報告し、プログラムの事実上の終了を意味する-1を戻します。

if (!status.IsLoggedIn) {
   Console.WriteLine("User is not logged in");
   return -1;
}

ユーザーのマシンのIPを127.0.0.1に設定します。実際のアプリケーションでは、このロケーションはキーボード入力またはセッション・トークンから取得します。

 user.Location = "127.0.0.1";

ユーザーがログインできたことを報告してから、ユーザーのブラウザのIPを報告します。

Console.WriteLine("User: " + user.UserIdentity + " is logged
   in...");
Console.WriteLine("User location is: " + user.Location);

指定リソースへのアクセスをユーザーが認可されるかどうかを報告します。

if ( user.IsAuthorized(resource) ) {
  Console.WriteLine("User is authorized");
} else {
  Console.WriteLine("User is not authorized");
}

リクエスト先リソースに関連付けられた認証スキームがBasicではない場合は、そのことを報告します。

} else {
   Console.WriteLine("Authentication is not basic" );
}

実行エラーが発生した場合は、該当するエラー・メッセージを報告し、プログラムの事実上の終了を意味する-1を戻します。

} catch (ObAccessExceptionMgd ex) {
   Console.WriteLine("Access Exception caught: " + ex.String);
   return -1;
}

リソースが保護されていない場合は、そのことを報告し、正常終了を意味する1を戻します。

    } else {
      Console.WriteLine("Resource is NOT protected ... " );
    }
    return 1;
  }
}

4.6.6 追加のメソッドを使用した例: access_test_java.java

次のサンプル・プログラムは、サンプル・アプリケーションJAccessGate.java内で確立されている基本パターンをベースとしてビルドされており、追加でいくつかのアクセス・サーバー・メソッドを起動しています。たとえば、アクセス・システムのセッション・オブジェクトを点検して、現在の認証スキームに関連付けられているポリシー・ルール内にどのアクションが現在構成されているかを確認します。

このデモを実行するには、その前に、アクセス・システム・コンソールを使用していくつかのアクションを構成しておく必要があります。認証アクションとユーザー認証の構成の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。このサンプル・アプリケーションの完全なリストは、例4–5の他にファイルaccess_test_java.javaにもあります。このファイルは、SDK_install_dir\Samplesディレクトリにあります。このコードの注釈付きバージョンが、このリストの後にあります。

例4-5 access_test_java.java

import java.util.*;
import java.util.Enumeration;
import java.util.StringTokenizer;
import com.oblix.access.*;

public class access_test_java {

  public static void main(String[] arg) {
    String userid, password, method, url, configDir, type, location;
    ObResourceRequest res;
    Hashtable parameters = null;
    Hashtable cred = new Hashtable();
    if (arg.length < 5) {
      System.out.println("Usage: EXPECTED: userid password Type HTTP-method
          URL [Installdir [authz-parameters] [location]]]");
      return;
    } else {
      userid    = arg[0];
      password  = arg[1];
      type      = arg[2];
      method    = arg[3];
      url      = arg[4];
    }
    if (arg.length >= 6) {
      configDir = arg[5];
    } else {
      configDir = null;
    }
    if (arg.length >= 7 && arg[6] != null) {
      parameters = new Hashtable();
      StringTokenizer tok1 = new StringTokenizer(arg[6], "&");
      while (tok1.hasMoreTokens()) {
        String nameValue = tok1.nextToken();
        StringTokenizer tok2 = new StringTokenizer(nameValue, "=");
        String name = tok2.nextToken();
        String value = tok2.hasMoreTokens() ? tok2.nextToken() : "";
        parameters.put(name, value);
      }
    }
    location = arg.length >= 8 ? arg[7] : null;
    try {
      if (configDir != null) {
        ObConfig.initialize(configDir);
      } else {
        ObConfig.initialize();
      }
    } catch (ObAccessException ie) {
      System.out.println("Access Server SDK Initialization failed");
      ie.printStackTrace();
      return;
    }
    cred.put("userid", userid);
    cred.put("password", password);
    try {
      res = new ObResourceRequest(type, url, method);
      if (res.isProtected()) {
        System.out.println("Resource " + type + ":" + url + " protected");
      } else {
        System.out.println("Resource " + type + ":" + url + " unprotected");
      }
    } catch (Throwable t) {
      t.printStackTrace();
      System.out.println("Failed to created new resource request");
      return;
    }
    ObUserSession user = null;
    try {
      user = new ObUserSession(res, cred);
    } catch (Throwable t) {
      t.printStackTrace();
      System.out.println("Failed to create new user session");
      return;
    }
    if (user.getStatus() == ObUserSession.LOGGEDIN) {
      if (location != null) user.setLocation(location);
      System.out.println("user status is " + user.getStatus());
      try {
        if (parameters != null ? user.isAuthorized(res, parameters) :
              user.isAuthorized(res)) {
          System.out.println("Permission GRANTED");
          System.out.println("User Session Token =" +
              user.getSessionToken());
          if (location != null) {
            System.out.println("Location = " + user.getLocation());
          }
        } else {
          System.out.println("Permission DENIED");
          if (user.getError() == ObUserSession.ERR_NEED_MORE_DATA) {
            int nParams = res.getNumberOfAuthorizationParameters();
            System.out.print("Required Authorization Parameters (" +
                nParams + ") :");
            Enumeration e = res.getAuthorizationParameters().keys();
            while (e.hasMoreElements()) {
              String name = (String) e.nextElement();
              System.out.print(" " + name);
            }
            System.out.println();
          }
        }
      }
 catch (ObAccessException obe) {
        System.out.println("Failed to get user authorization");
      }
    }
 else {
      System.out.println("user status is " + user.getStatus());
    }
    String[] actionTypes = user.getActionTypes();
    for(int i =0; i < actionTypes.length; i++) {
      Hashtable actions = user.getActions(actionTypes[i]);
      Enumeration e = actions.keys();
      int item = 0;
      System.out.println("Printing Actions for type " + actionTypes[i]);
      while(e.hasMoreElements()) {
        String name = (String)e.nextElement();
        System.out.println("Actions[" + item +"]: Name " + name + " value " + 
           actions.get(name));
        item++;
      }
    }
    ObAuthenticationScheme auths;
    try {
      auths = new ObAuthenticationScheme(res);
    }
 catch (ObAccessException ase) {
      ase.printStackTrace();
      return;
    }
  if (auths.isBasic()) {
      System.out.println("Auth scheme is Basic");
    }
 else {
      System.out.println("Auth scheme is NOT Basic");
    }
    try {
      ObResourceRequest resNew = (ObResourceRequest) res.clone();
      System.out.println("Clone resource Name: " + resNew.getResource());
    }
 catch (Exception e) {
      e.printStackTrace();
    }
    res = null;
    auths = null;
    ObConfig.shutdown();
  }
}

4.6.6.1 注釈付きコード

基本ユーティリティ、列挙およびトークン処理機能を実装する標準のJavaライブラリをインポートします。

import java.util.*;
import java.util.Enumeration;
import java.util.StringTokenizer;

Access Manager APIライブラリをインポートします。

import com.oblix.access.*;

このサーブレットにaccess_test_javaという名前を付けます。

public class access_test_java {

argという名前の配列で渡される値を格納する、7つの変数文字列を宣言します。

public static void main(String[] arg) {
   String userid, password, method, url, configDir, type, location;

現在のObResourceRequestをresに設定します。

ObResourceRequest res;

まだ空になっていない可能性を考慮して、ハッシュテーブル・パラメータをNULLに初期化します。

Hashtable parameters = null;

credという名前の新規のハッシュテーブルを作成します。

Hashtable cred = new Hashtable();

argという名前の配列に含まれている文字列が5個未満の場合、コマンドライン入力で予期している構文と内容を報告します。これは順序が指定された5個の必須引数、およびオプションの変数であるconfigDir、authz-parametersおよびlocationです。

if (arg.length < 5) {
  System.out.println("Usage: EXPECTED: userid password type
    HTTP-method URL [configDir [authz-parameters] [location]]]");

最初に指定された引数が5個未満の場合、メイン・メソッドを終了することで事実上プログラムの実行を終了します。

 return;
} else {

argという名前の配列に5個以上の文字列がある場合は、最初の5個の引数(arg[0]からarg[4])をuserid、password、type、method、urlの変数に代入します。

  userid = arg[0];
  password = arg[1];
  type = arg[2];
  method = arg[3];
  url = arg[4];
}

argに6個以上の引数がある場合は、配列内の6番目の文字列をconfigDir変数に代入します。

if (arg.length >= 6)
  configDir = arg[5];

argに6個以上の引数がない場合、つまり、5個未満ではないことをすでに確認し、ちょうど5個の引数があることがわかっている場合は、configDirをNULLに設定します。

else
  configDir = null;

argに7個以上の文字列があり、arg[6](authz-parameters変数に暗黙のうちに割り当てられる)が空ではない場合、parametersという名前の新規のハッシュテーブルを作成します。authz-parameters文字列の構文は、「p1=v1&p2=v2&...」の形式です。

if (arg.length >= 7 && arg[6] != null) {
  parameters = new Hashtable();

デリミタとしてアンパサンド文字(&)を使用して、tok1という名前の文字列トークン化関数を作成し、arg[6]を解析します。この関数は、arg[6]を「pn=vn」という形式を持ったトークンの配列に分解します。ここで、nはトークンの順序番号です。

 StringTokenizer tok1 = new StringTokenizer(arg[6], "&");

tok1内のすべての項目について、直後のトークンをnameValue変数として戻します。このようにして、nameValueにはpn=vnの文字列が割り当てられます。ここでnはトークンのシリアル番号です。

while (tok1.hasMoreTokens()) {
  String nameValue = tok1.nextToken();

デリミタとして等記号(=)を使用して、tok2という名前の文字列トークン関数を作成し、nameValueを解析します。このようにして、pn=vnをpnとvnのトークンに分解します。

 StringTokenizer tok2 = new StringTokenizer(nameValue, "=");

最初のトークンをname変数に代入します。

 String name = tok2.nextToken();

2番目のトークンをvalueに代入します。tok2に他のトークンが残っている場合は、直後のトークンを戻し、これをvalueに代入します。残っていない場合は、空文字列をvalueに代入します。

 String value = tok2.hasMoreTokens() ? tok2.nextToken() : "";

parametersハッシュテーブルにnameとvalueを挿入します。

    parameters.put(name, value);
  }
}

arg内に8個以上の引数がある場合は、arg[7]をlocation変数に代入します。ない場合は、locationを空にします。

location = arg.length >= 8 ? arg[7] : null;

configDirが空ではない場合、configDirの現行値を使用してAccess Manager APIを初期化します。

try {
  if (configDir != null)
    ObConfig.initialize(configDir);

空の場合は、configDirのロケーションを明示的に指定せずに、Access Manager APIを初期化します。

else
  ObConfig.initialize();
}

初期化の試行によりエラーが発生した場合は、トレースバックとともに標準エラー・ストリームに当該のエラー・メッセージ(ie)を報告します。

catch (ObAccessException ie) {
  System.out.println("Initialize failed");
  ie.printStackTrace();

メイン・メソッドを終了することで、事実上プログラムを終了します。

 return;
}

各変数、ユーザーIDおよびパスワードをcredという名前のハッシュテーブルに読み取ります。

 cred.put("userid", userid);
cred.put("password", password);

アクセス・サーバーにある変数型、URL、メソッドの値を戻す、resという名前のObResourceRequestオブジェクトを作成します。

try {
res = new ObResourceRequest(type, url, method);

リクエストしたリソースresが保護されているかどうかを確認して、該当するメッセージを表示します。

if (res.isProtected())
  System.out.println("Resource " + type ":" + url + " protected");
else
  System.out.println("Resource " + type + ":" + url + " unprotected");
}

ObResourceRequest構造体を作成できなかった場合は、エラー・メッセージtとともに障害を報告します。

catch (Throwable t) {
  t.printStackTrace();
  System.out.println("Failed to create new resource request");

メイン・メソッドを終了することで、事実上プログラムを終了します。

  return;
}

ObUserSessionパラメータのuserを空に設定します。

ObUserSession user = null;

ObResourceRequest構造体のresとObAuthenticationScheme構造体のcredの値を戻す、userという名前のObUserSession構造体を作成します。

try
  user = new ObUserSession(res, cred);

ObUserSession構造体を作成できなかった場合は、エラー・メッセージtとともに障害を報告します。

catch (Throwable t) {
  t.printStackTrace();
  System.out.println("Failed to create new user session");

メイン・メソッドを終了することで、事実上プログラムを終了します。

 return;
}

ユーザーが現在ログインしているかどうか、つまりこのユーザーの認証が成功しているかどうかを確認します。

if (user.getStatus() == ObUserSession.LOGGEDIN) {

ユーザーがログインしている場合は、location変数が空でないかどうかを確認します。locationが空でない場合は、ObConfigのlocationパラメータにこのlocation変数の値を設定し、アクセス・サーバーが戻すステータス・コードとともに、ユーザーがログインしていることを報告します。

if (location != null) user.setLocation(location);
System.out.println("user status is " + user.getStatus());

認証を確認します。これを行うには、parametersが存在するかどうかを確認します。存在する場合は、parametersに格納されているパラメータを入力引数として付けたときにターゲット・リソースへのアクセスがユーザーに認可されるかどうかを確認します。parametersが存在しない場合は、ターゲット・リソースへのアクセスがユーザーに認可されているかどうかを引数なしで確認します。

try {
  if (parameters != null ? user.isAuthorized(res, parameters) :
    user.isAuthorized(res)) {

存在するすべてのパラメータを指定したときにユーザーがリソースへのアクセスを認可される場合は、権限が付与されたことを報告します。

System.out.println("Permission GRANTED");

さらに、ユーザー・セッション・トークンをシリアル番号付きで表示します。

System.out.println("User Session Token =" + user.getSessionToken());

location変数が空でない場合は、その値を報告します。

if (location != null) {
  System.out.println("Location = " + user.getLocation());
}

リソースへのアクセスをユーザーが認可されなかった場合は、権限が拒否されたことを報告します。

} else {
System.out.println("Permission DENIED");

ObUserSessionがERR_NEED_MORE_DATAを戻す場合は、nParams変数を認可に必要なパラメータの数に設定し、その数値をユーザーに報告します。

if (user.getError() == ObUserSession.ERR_NEED_MORE_DATA) {
  int nParams = res.getNumberOfAuthorizationParameters();
  System.out.print("Required Authorization Parameters (" +
    nParams + ") :");

resという名前のObResourceRequestオブジェクトのgetAuthorizationParametersメソッドによって戻されるハッシュテーブルのkeysパラメータの値として、eを設定します。

 Enumeration e = res.getAuthorizationParameters().keys();

eに含まれているすべての要素の名前を報告します。

while (e.hasMoreElements()) {
  String name = (String) e.nextElement();
  System.out.print(" " + name);
}
System.out.println();
}

そうでない場合は、次の文に進みます。

    else
  }
}

エラーが発生した場合は、認可の試行が失敗したことを報告します。

  catch (ObAccessException obe)
  System.out.println("Failed to get user authorization");
}

ユーザーがログインできなかった場合は、現在のユーザー・ステータスを報告します。

else
  System.out.println("user status is " + user.getStatus());

次に、現在のユーザー・セッションに設定されている現行アクションをすべて報告します。このためには、getActionTypesメソッドが戻す各文字列からactionTypesという名前の配列を作成します。次に、actionTypes内の各文字列をactionsという名前のハッシュテーブルに読み取ります。actionsに含まれている各キーの名前と値を報告します。

String[] actionTypes = user.getActionTypes();
for(int i =0; actionTypes[i] != null; i++){
  Hashtable actions = user.getActions(actionTypes[i]);
  Enumeration e = actions.keys();
  int item = 0;
  System.out.println("Printing Actions for type " + actionTypes[i]);
  while(e.hasMoreElements()) {
String name = (String)e.nextElement();
System.out.println("Actions[" + item +"]: Name " + name + " value " +
  actions.get(name));
item++;
  }
}

ObResourceRequestオブジェクトのresに対するauthsという名前のObAuthenticationSchemeオブジェクトの作成を試みます。

ObAuthenticationScheme auths;
try
  auths = new ObAuthenticationScheme(res);

ObAuthenticationSchemeが作成できなかった場合は、エラー・メッセージaseによって障害を報告します。

catch (ObAccessException ase) {
  ase.printStackTrace();

メイン・メソッドを終了することで、事実上プログラムを終了します。

  return;
}

認可スキームがBasicかどうかを確認します。

if (auths.isBasic())

Basicの場合は、そのことを報告します。

System.out.println("Auth scheme is Basic");

Basicではない場合は、そのことを報告します。

else
  System.out.println("Auth scheme is NOT Basic");

コピー・コンストラクタを使用して、元オブジェクトresからresNEWという名前の新規のObResourceRequestオブジェクトを作成します。

try {
  ObResourceRequest resNew = (ObResourceRequest) res.clone();

新しくクローニングしたオブジェクトの名前を報告します。

 System.out.println("Clone resource Name: " + resNew.getResource());

なんらかの理由によりObResourceRequestオブジェクトがクローニングできなかった場合は、対応するトレースバックによって障害を報告します。

}
catch (Exception e) {
  e.printStackTrace();
}

ObResourceRequestオブジェクトresとObAuthenticationSchemeオブジェクトauthsをNULLに設定し、Access Manager APIを切断します。

    res = null;
    auths = null;
    ObConfig.shutdown();
  }
}

4.6.7 複数の機能を実装したC++の例: access_test_cplus.cpp

Access Manager APIのC++実装で作成されたAccess_test_cplus.cppでは、アクセス・ゲートの広範囲にわたる使用可能な機能をデモできます。各コード・セクションは、サンプル・プログラムのaccess_test_java.javaとほぼ同じですが、構文、I/O、例外処理はC++に準拠しています。

後続の項目には、アプリケーションの概要、注釈なしの完全なリストをリストします。このリストは、C++開発環境にコピーして、編集およびコンパイルできます。このリストの後には、このコードの各行に対する注釈があります。

このプログラムはAccess Manager APIメソッドをコールして、セッション・トークンかユーザーIDとパスワードのいずれかを使用して、ユーザー・セッションを作成します。次に、リクエスト先HTTPリソースへのアクセス権限をユーザーに付与するかどうかを決定します。

2つの操作モードがあります。

  • コマンドライン: 単一のトランザクションを実行する場合は、コマンドライン引数を使用します。

  • 対話型: コマンドライン引数を使用しないかわりに、stdinから複数のトランザクションを読み込みます。

トランザクション・タイプには次のものがあります。

  • ユーザーID/パスワード/メソッド/URL: 指定されたチャレンジ・メソッドを使用して、ユーザー認証を行い、リクエスト先URLへのアクセス権限を付与するかどうかを決定します。

  • トークン/メソッド/URL: シリアル・トークンからユーザー情報を取得し、指定されたチャレンジ・メソッドを使用して、リクエスト先URLへのアクセス権限を付与するかどうかを決定します。

  • メソッド/URL(対話型モードのみ): 直前のログインからユーザー情報を取得し、指定されたチャレンジ・メソッドを使用して、リクエスト先URLへのアクセス権限を付与するかどうかを決定します。

リクエスト先リソースへのURLは、次の形式を取ります。

[resourceType:][//host[:port]]/resource[?p1=v1&p2=v2...]

デフォルトのresourceTypeはHTTPです。

J.Smith 84CharingXRd GET /example/resource:

このコマンドライン入力では、パスワード84CharingXRdを使用してユーザーJ. Smithのログインを行い、URLの/example/resourceへのGETアクセスを確認します。

GET /a/b.cgi?a=1&b=2:

このコマンドライン入力は、既存セッション上にトランザクションを読み込み、パラメータa=1とb=2を使用して、URLの/a/b.cgiへの認可を判定するためGETアクセスをチェックします。

例4-6 Access_test_cplus.cpp

#ifdef _WIN32
#pragma warning(disable : 4995)
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#ifdef _WIN32
#   include <sys/timeb.h>
#else
#   include <time.h>
#endif
#include <obaccess_api_cplus.h>
const char *sessionToken = NULL;

void parseUrl(char *urlCopy, const char **resourceType, const char **resource,
    ObMap &parameters) {
  char *colon   = strstr(urlCopy, ":");
  char *slashes = strstr(urlCopy, "//");
  if (colon != NULL && (slashes == NULL || colon < slashes)) {
    *resourceType = strtok(urlCopy, ":");
    *resource     = strtok(NULL,    "?");
  } else {
    *resourceType = "http";
    *resource     = strtok(urlCopy, "?");
  }
  char *name, *val;
  for (name = strtok(NULL, "="); name != NULL; name = strtok(NULL, "=")) {
    val = strtok(NULL, "&");
    if (val != NULL) parameters.put(name, val);
  }
}

void isAuthorized(ObUserSession &user, ObResourceRequest &res, const char
    *authzParmString){
  ObBoolean_t authz = ObFalse;
  if (authzParmString != NULL) {
    ObMap authzParameters;
    char *authzParms = strdup(authzParmString);
    char *name, *val;
    for (name = strtok(authzParms, "="); name != NULL; name = strtok(NULL,
        "=")) {
      val = strtok(NULL, "&");
      if (val != NULL) authzParameters.put(name, val);
    }
    authz = user.isAuthorized(res, authzParameters);
  } else {
    authz = user.isAuthorized(res);
  }
  if (authz) {
    cout << "GRANTED\n";
  } else {
    cout << "DENIED\n";
    cout << "ERROR: " << user.getErrorMessage() << "\n";
    if (user.getError() == ObUser_ERR_NEED_MORE_DATA) {
      ObMap *pRequiredParameters = res.getAuthorizationParameters();
      cout << "EXPECTED PARAMETERS:";
      ObMapIterator iter(*pRequiredParameters);
      while (iter.hasMore()) {
        const char *name = NULL, *value = NULL;
        iter.next(&name, &value);
        cout << " " << name;
      }
      cout << "\n";
      delete pRequiredParameters;
    }
  }
  cout << "ACTIONS:";
  const char **actionTypes = user.getActionTypes();
  for (int i = 0; actionTypes[i] != NULL; i++) {
    const ObMap &actions = user.getActions(actionTypes[i]);
    ObMapIterator iter(actions);
    while (iter.hasMore()) {
      cout << "\n";
      const char *name = NULL, *value = NULL;
      iter.next(&name, &value);
      cout << actionTypes[i] << ": " << name << "=" << value;
    }
  }
}

void testLogin(const char *userid, const char *password, const char *method,
    const char *url, const char *location, const char *authzParmString) {
  char *urlCopy            = strdup(url);
  const char *resourceType = NULL;
  const char *resource     = NULL;
  ObMap parameters;
  parseUrl(urlCopy, &resourceType, &resource, parameters);
  ObResourceRequest res(resourceType, resource, method, parameters);
  if (res.isProtected()) {
    ObAuthenticationScheme authnScheme(res);
    if (authnScheme.isBasic()) {
      cout << "BASIC REALM : " << authnScheme.getChallengeParameter("realm")
        << "\n";
      ObMap credentials;
      credentials.put("userid", userid);
      credentials.put("password", password);
      ObUserSession user(res, credentials, location);
      if (user.getStatus() == ObUser_LOGGEDIN) {
        if (sessionToken != NULL) free((void *) sessionToken);        
            sessionToken = strdup(user.getSessionToken());        
            cout << "SESSION TOKEN : " << sessionToken << "\n";
            isAuthorized(user, res, authzParmString);      } 
        else {
               cout << "LOGIN FAILED: " << user.getErrorMessage() << "\n";
        }
    } else {
    cout << "RESOURCE SCHEME NOT BASIC";
    }
   } else {
     cout << "NOT PROTECTED";
  }  free(urlCopy);
}
void testToken(const char *token, const char *method, const char *url) {
  if (sessionToken != NULL) free((void *) sessionToken);
  sessionToken = token;
  char *urlCopy = strdup(url);
  const char *resourceType = NULL;
  const char *resource     = NULL;
  ObMap parameters;
  parseUrl(urlCopy, &resourceType, &resource, parameters);
  ObResourceRequest res(resourceType, resource, method, parameters);
  if (res.isProtected()) {
    ObUserSession user(sessionToken);
    if (user.getStatus() == ObUser_LOGGEDIN) {
      cout << "USER: " << user.getUserIdentity() << "\n";
      if (user.getLocation() != NULL) {
        cout << "LOCATION: " << user.getLocation() << "\n";
      } else {
        cout << "LOCATION: (none)\n";
      }
      isAuthorized(user, res, NULL);
    } else {
       cout << "BAD TOKEN";
    }
   } else {
     cout << "NOT PROTECTED";
   }
  free(urlCopy);
}
void setLocation(const char *location) {
  ObUserSession user(sessionToken);
  user.setLocation(location);
  sessionToken = strdup(user.getSessionToken());
}
void showConfig() {
  cout <<
 "CONFIGURATION:\n";
  cout <<
 "The current version of SDK is " << ObConfig::getSDKVersion() << "\n";
  cout <<
 "The current version of NAP is " << ObConfig::getNAPVersion() << "\n";
  ObMapIterator iter(ObConfig::getAllItems());
  while (iter.hasMore()) {
    const char *name, *val;
    iter.next(&name, &val);
    cout << name << ": "
 << (val != NULL ? val : "(none)") << "\n";
  }
}
void help() {
  cout << "EXPECT ONE OF\n";
  cout << "<userid> <password>
 <method> <url>
 [<location> [<authz-parameters>]]
      (sets sessionToken)\n";
  cout << "<sessionToken>
 <method> <url>
      (sets sessionToken)\n";
  cout <<
 "<method> <url>
                     (uses prior sessionToken)\n";
  cout << "setLocation <newLocation>
          (uses prior sessionToken)\n";
  cout << "showconfig\n";
  cout << "quit\n";
  cout << "exit\n";
}
int innerMain(int argc, char *argv[]) {
  float timeMilliSec;#ifdef _WIN32  struct _timeb startTime;
  struct _timeb stopTime;
  _ftime(&startTime);
#else
  struct timeval startTime;
  struct timeval stopTime;
  gettimeofday(&startTime, NULL);
#endif
  try {
    if (argc == 2) {
      if (strcmp(argv[1], "quit") == 0 || strcmp(argv[1], "exit") == 0) {
        return 1;
      } else
       if (strcmp(argv[1], "showconfig") == 0) showConfig();
    } else if (argc == 3) {
      if (sessionToken != NULL) {
        if (strcmp(argv[1], "setLocation") == 0) {
          setLocation(argv[2]);
        } else {
          testToken(strdup(sessionToken), argv[1], argv[2]);
        }
      } else {
        cout << "NO PRIOR LOGIN";
      }
    } else if (argc == 4) {
      testToken(argv[1], argv[2], argv[3]);
    } else if (argc == 5) {
      testLogin(argv[1], argv[2], argv[3], argv[4], NULL, NULL);
    } else if (argc == 6) {
      testLogin(argv[1], argv[2], argv[3], argv[4], argv[5], NULL);
    } else if (argc == 7) {
      testLogin(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
    } else {
      help();
    }
  }

例4-7 Access_test_cplus.cpp(続き)

  catch (ObAccessException *e) {
     cout << "EXCEPTION: "
 << e->toString();
    delete (e);  }
#ifdef _WIN32
  _ftime(&stopTime);
  timeMilliSec = ((float) (stopTime.time    - startTime.time) * 1000) + 
   (float) (stopTime.millitm - startTime.millitm);#else  gettimeofday(&stopTime, NULL);
  timeMilliSec = (((float) (stopTime.tv_sec - startTime.tv_sec) * 1000) +
     ((float) (stopTime.tv_usec - startTime.tv_usec) / 1000));
#endif
  cout << "\nTIME : " << timeMilliSec << " milliseconds";
  return 0;
}
int main(int argc, char *argv[]) {
  try {
    ObConfig::initialize();
    if (argc == 1)
 {
#      define MAX_ARGS 6
#      define MAX_INPUT_CHARS 1000
      int   ac;
      char *av[MAX_ARGS];
      char inputString[MAX_INPUT_CHARS];
      char *arg;
      help();
       int stop = 0;
      while (stop == 0) {
        cout << "\n>";
        cin.getline(inputString, MAX_INPUT_CHARS);
        av[0] = (char *) "access_test_cplus";
        ac = 1;
        for (arg = strtok(inputString, " ");
          arg != NULL && ac <= MAX_ARGS;
          arg = strtok(NULL, " ")) {
          av[ac] = arg;
          ac++;
        } 
       if (ac > 1) {
          stop = innerMain(ac, av);
          cout << "\n";
        }
      }
    }
 else {
      innerMain(argc, argv);
    }
    cout << "\n";
    if (sessionToken != NULL) free((void *) sessionToken);
    ObConfig::shutdown();
  }
  catch (ObAccessException *e) {
    cout << "EXCEPTION: " << e->toString();    delete (e);
  }
  return 0;
}

4.6.7.1 注釈付きコード

アクセス・ゲートのホスト・マシンがWin32プラットフォーム上で稼働している場合は、古いI/Oストリームの非推奨に関する警告を無効にします。

#ifdef _WIN32
#pragma warning(disable : 4995)
#endif

複数の標準C++ライブラリをインクルードします。これらのライブラリは、基本機能の他に、入出力、文字列、ストリームもカバーしています。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream.h>

アクセス・ゲートをホストするマシンで使用されているオペレーティング・システム・プラットフォーム(Win32またはその他)に適合する時間処理ライブラリをインポートします。

#ifdef _WIN32
# include <sys/timeb.h>
#else
# include <time.h>
#endif

Access Manager APIのC++実装をインクルードします。

#include <obaccess_api_cplus.h>

現行セッション・トークンへのポインタをNULLに設定します。

const char *sessionToken = NULL;

parseURLメソッドにより、urlCopyの文字列が次のような構成要素に分解されます。

[resourceType:][//host[:port]]/resource

urlCopyには、次の形式で、オプションのパラメータ・セットを含めることもできます。

[?p1=v1&p2=v2...]

ここでpはパラメータの名前、vはそのパラメータ名に対する値です。いずれの場合も、urlCopyはオプションです。

void parseUrl(char *urlCopy, const char **resourceType, const char **resource,
  ObMap &parameters) {

urlCopy内に最初のコロン(:)とダブル・スラッシュ(//)へのポインタを作成し、それぞれの名前をcolonとslashesにします。

char *colon = strstr(urlCopy, ":");
char *slashes = strstr(urlCopy, "//");

urlCopyに、コロンはあるがダブル・スラッシュがないかどうか、またはダブル・スラッシュの前にコロンがあるかどうかを確認します。

if (colon != NULL && (slashes == NULL || colon < slashes)) {

前述の文のどちらかがtrueの場合、urlCopyはresourceType:[//host[:port]]/resource[?p1=v1&p2=v2...]の形式を取っているとみなせます。

この場合、トークンresourceTypeへのポインタを戻す必要があります。このトークンには、文字列urlCopy内でデリミタのコロン(:)の前にあるすべてが含まれます。

*resourceType = strtok(urlCopy, ":");

strtokメソッドを起動するたびに、デリミタがNULLに変更されます。このため、文字列urlCopy内の2番目のトークンを取得するには、開始点をNULL、終了デリミタを疑問符(?)に指定します。これにより、リクエスト先リソースのURLが戻されます。

*resource = strtok(NULL, "?");

前述のif文内のどちらかの部分がtrueではない場合、urlCopyは[//host[:port]]/resource[?p1=v1&p2=v2...]の形式を取るものとみなせます。

この場合は、resourceTypeをHTTPに設定し、トークンresourceへのポインタを設定します。このトークンには、urlCopy内でデリミタの疑問符(?)の前にあるすべてが含まれます。

} else {
  *resourceType = "http";
  *resource = strtok(urlCopy, "?");
}

次に、urlCopy文字列のオプションのパラメータ部分を解析します。このためには、NULL(以前のデリミタは疑問符)と新規の終了デリミタである等記号(=nameが空ではない場合にかぎり、新規の終了デリミタとしてアンパサンド(&)を使用した場合の、直後のトークンをvalに代入します。nameがNULLとして戻されるまで、このプロセスを繰り返します。NULLが戻された場合は、urlCopy文字列の末尾に到達したことを意味します。

  char *name, *val;
  for (name = strtok(NULL, "="); name != NULL; name = strtok(NULL, "=")) {
    val = strtok(NULL, "&");
    if (val != NULL) parameters.put(name, val);
  }
}

isAuthorizedメソッドは、特定のリソースについて、リクエストを発行したユーザーがアクセス権限を持っているかどうかを判定します。

void isAuthorized(ObUserSession &user,ObResourceRequest &res, const char
  *authzParmString) {

ブール変数authzをfalseに初期設定します。

ObBoolean_t authz = ObFalse;

オプションの文字列authzParmStringが存在するかどうかを確認します。

 if (authzParmString != NULL) {

p1=v1&p2=v2....という書式のauthzParmStringが存在する場合は、構成要素として名前と値のペアに分解します。このためには、strtokメソッドを起動して、authzParametersという名前のObMap構造体に、各パラメータの名前と値の要素を読み取ります。トークンのnameにNULL値が戻されて、リストの末尾に到達したことが示されるまで、authzParametersへの名前と値のペアの読取りを続けます。

ObMap authzParameters;
char *authzParms = strdup(authzParmString);
char *name, *val;
for (name = strtok(authzParms, "="); name != NULL; name = strtok(NULL,
    "=")) {
  val = strtok(NULL, "&");
  if (val != NULL) authzParameters.put(name, val);
}

ObUserSessionオブジェクトのuserに指定されたユーザーが、authzParmStringに指定した資格証明を提供して、ObResourceRequestオブジェクトのresへのアクセスを認可されるかどうかを確認します。

  authz = user.isAuthorized(res, authzParameters);
}

ObUserSessionオブジェクトのuserが、オプションのauthzParmString変数を指定していない場合にリクエスト先リソースへのアクセスを認可されるかどうかを、ObResourceRequest構造体のresを使用して確認します。

else {
  authz = user.isAuthorized(res);
}

ユーザーが認可された場合は、アクセス権限が付与されたことを報告します。

if (authz) {
  cout << "GRANTED\n";

認可されなかった場合は、アクセスが拒否されたことを、戻されたエラー・メッセージとともに報告します。

} else {
  cout << "DENIED\n";
  cout << "ERROR: " << user.getErrorMessage() << "\n";

ERR_NEED_MORE_DATAが戻された場合は、resで指定されたリソースに必要とされる認可パラメータを取得します。各パラメータの名前と値のポインタを、pRequiredParametersによって指し示されるObMap構造体内に配置します。必須パラメータの名前(対応する値ではなく)を1行に1つずつ報告します。

if (user.getError() == ObUser_ERR_NEED_MORE_DATA) {
  ObMap *pRequiredParameters = res.getAuthorizationParameters();
  cout << "EXPECTED PARAMETERS:";
  ObMapIterator iter(*pRequiredParameters);
  while (iter.hasMore()) {
    const char *name = NULL, *value = NULL;
    iter.next(&name, &value);
    cout << " " << name;
  }
  cout << "\n";

pRequiredParametersが使用していたメモリーが不要になるので、これを解放するためdeleteを起動します。

    delete pRequiredParameters;
  }
}

ObUserSessionオブジェクトのuserに対して実行するアクションをObMapオブジェクトのactionsに入れます。ObMapIteratorを使用して、それぞれのアクションに関連付けられた名前と値を報告します。

  cout << "ACTIONS:";
  const char **actionTypes = user.getActionTypes();
  for (int i = 0; actionTypes[i] != NULL; i++) {
    const ObMap &actions = user.getActions(actionTypes[i]);
    ObMapIterator iter(actions);
    while (iter.hasMore()) {
      cout << "\n";
      const char *name = NULL, *value = NULL;
      iter.next(&name, &value);
      cout << actionTypes[i] << ": " << name << "=" << value;
    }
  }
}

testLoginメソッドは、アクセス・ゲートのログイン機能をテストします。最初に、必要な変数と定数を初期化または取得します。

void testLogin(const char *userid, const char *password, const char *method,
    const char *url, const char *location, const char *authzParmString) {
  char *urlCopy            = strdup(url);
  const char *resourceType = NULL;
  const char *resource     = NULL;
  ObMap parameters;
  parseUrl(urlCopy, &resourceType, &resource, parameters);
  ObResourceRequest res(resourceType, resource, method, parameters);

ObResourceRequestオブジェクトのresによって指定されているリソースが保護されているかどうかを確認します。

 if (res.isProtected()) {

リソースが保護されている場合、resに関連付けられた認証スキームがBasicチャレンジ・メソッドを使用するかどうかを確認します。

ObAuthenticationScheme authnScheme(res);
if (authnScheme.isBasic()) {

認証スキームがBasicチャレンジ・メソッドを使用する場合は、そのことを報告するとともに、realmの値を添えます。realmの値は、通常は認証ドメインの名前です(たとえば、LDAPディレクトリ)。

cout << "BASIC REALM : " << authnScheme.getChallengeParameter("realm")
  << "\n";

「credentials」という名前のObMapリストを作成し、現行ユーザー・セッションについて提供されたユーザーIDとパスワードをそこに入れます。

ObMap credentials;
credentials.put("userid", userid);
credentials.put("password", password);
ObUserSession user(res, credentials, location);

ユーザーがログインしているかどうか、つまりこのユーザーの認証が成功しているかどうかを確認します。

if (user.getStatus() == ObUser_LOGGEDIN) {

ユーザーが現在認証されている場合は、sessionToken変数が存在するかどうかを確認します。存在する場合は、sessionTokenオブジェクトが使用しているメモリーの割当てを解除して、失効データが発生しないようにします。

if (sessionToken != NULL) free((void *) sessionToken);

userに関連付けられたセッション・トークンのコピーを取得して、これをsessionToken変数に代入します。

sessionToken = strdup(user.getSessionToken());

配列に格納されたセッション・トークンの内容を報告します。これは、ユーザーIDとパスワードがエンコードされたASCII文字列です。

cout << "SESSION TOKEN : " << sessionToken << "\n";

authzParmStringを介して渡された資格証明を使用して、リソースへのアクセスをユーザーが認可されているかどうかをチェックします。

 isAuthorized(user, res, authzParmString);

ユーザーが認証に失敗している場合は、そのことを該当のエラー・メッセージとともに報告します。

} else {
  cout << "LOGIN FAILED: " << user.getErrorMessage() << "\n";
}

チャレンジ・メソッドがBasicではない場合は、そのことを報告します。

} else {
  cout << "RESOURCE SCHEME NOT BASIC";
}

リソースが保護されていない場合は、そのことを報告します。

 } else {
cout << "NOT PROTECTED";
}

urlCopy変数が使用しているメモリーの割当てを解除します。

free(urlCopy);
}

testTokenメソッドは、既存セッション・トークンによって認証が成功するかどうかをテストします。

void testToken(const char *token, const char *method, const char *url) {

sessionToken変数が存在する場合は、この変数に割り当てられているメモリーの割当てを解除して、失効セッション・データが発生しないようにします。

 if (sessionToken != NULL) free((void *) sessionToken);

必要な変数と定数を初期化または取得します。

sessionToken = token;
char *urlCopy = strdup(url);
const char *resourceType = NULL;
const char *resource = NULL;
ObMap parameters;
parseUrl(urlCopy, &resourceType, &resource, parameters);
ObResourceRequest res(resourceType, resource, method, parameters);

ObResourceRequest構造体のresによって指定されているリソースが保護されているかどうかを確認します。

if (res.isProtected()){

リソースが保護されている場合、ユーザーがログインしているかどうか(つまり認証が成功しているかどうか)を確認します。

ObUserSession user(sessionToken);
if (user.getStatus() == ObUser_LOGGEDIN) {

ユーザーが認証されている場合は、LDAPディレクトリに存在するユーザーのDN(識別名)を報告します。

 cout << "USER: " << user.getUserIdentity() << "\n";

ユーザーにIPアドレスが設定されているかどうかを確認します。IPアドレスが存在する場合は、それを報告します。ない場合は、IPアドレスを(none)として報告します。

if (user.getLocation() != NULL) {
  cout << "LOCATION: " << user.getLocation() << "\n";
} else {
  cout << "LOCATION: (none)\n";
}
isAuthorized(user, res, NULL);

ユーザーが認証されていない場合は、トークンが無効であることを報告します。

} else {
  cout << "BAD TOKEN";
}

リソースが保護されていない場合は、そのことを報告します。

} else {
  cout << "NOT PROTECTED";
}

urlCopy変数が使用しているメモリーを割当て解除してクリーンアップします。

  free(urlCopy);
}

ユーザーのマシンのIPアドレスを設定します。

void setLocation(const char *location) {

既存トークンを使用してセッションを作成します。

ObUserSession user(sessionToken);

setLocationメソッドが戻すIPアドレスを使用して、セッション・トークンを更新します。

  user.setLocation(location);
  sessionToken = strdup(user.getSessionToken());
}

showConfigメソッドは、アクセス・ゲートについて現在設定されている構成情報を報告します。これには、構成ファイルObAccessClient.xmlにあるすべての構成パラメータが含まれます。すなわち、使用中のAccess Manager SDKのバージョン、使用中のアクセス制御プロトコルのバージョンが必ず含まれる他、場合により、キャッシュ可能なリソース・リクエスト・オブジェクトの最大数、ユーザーの再認証が必要となるまでの最大秒数、アクセス・ゲートがアクセス・サーバーと接続中であることを確認する周期が含まれます。

void showConfig() {
  cout << "CONFIGURATION:\n";
  cout << "The current version of SDK is " << ObConfig::getSDKVersion() << "\n";
  cout << "The current version of NAP is " << ObConfig::getNAPVersion() << "\n";
  ObMapIterator iter(ObConfig::getAllItems());
  while (iter.hasMore()) {
    const char *name, *val;
    iter.next(&name, &val);
    cout << name << ": " << (val != NULL ? val : "(none)") << "\n";
  }
}

helpメソッドは、このアプリケーションで使用可能なコマンドライン構文とオプションを報告します。

void help() {
  cout << "EXPECT ONE OF\n";
  cout << "<userid> <password> <method> <url> [<location> [<authz-parameters>]]
      (sets sessionToken)\n";
  cout << "<sessionToken> <method> <url>      (sets sessionToken)\n";
  cout << "<method> <url>                     (uses prior sessionToken)\n";
  cout << "setLocation <newLocation>          (uses prior sessionToken)\n";
  cout << "showconfig\n";
  cout << "quit\n";
  cout << "exit\n";
}

次に示すinnerMainメソッドでは、プログラムを実行するために、提供されたコマンドライン引数を使用することも、あるいは使用しないこと(対話型モード)も可能です。innerMainメソッドには、単一操作を実行するためのコードが含まれています。すなわち、innermainは、mainメソッドが複数の操作を読み取った後、mainメソッドによってコールされます。

int innerMain(int argc, char *argv[]) {

アプリケーションの実行時間を測定するための変数を設定します。

 float timeMilliSec;

アクセス・ゲートを実行するホスト・マシン・プラットフォームに対する時間書式をコンパイラで適切に設定します。

#ifdef _WIN32
  struct _timeb startTime;
  struct _timeb stopTime;
  _ftime(&startTime);
#else
  struct timeval startTime;
  struct timeval stopTime;
  gettimeofday(&startTime, NULL);
#endif
  try {

argcという名前の配列にちょうど2つの文字列がある場合、2番目の文字列(arg[1])がquitかexitかを確認します。ユーザーがquitまたはexitを入力していた場合は、このメソッドを終了します。

if (argc == 2) {
   if (strcmp(argv[1], "quit") == 0 || strcmp(argv[1], "exit") == 0) {
      return 1;

ユーザーがquitまたはexitを入力していない場合は、配列argvの2番目の文字列がshowconfigになっているかどうかを確認します。showconfigになっている場合は、showConfigメソッドを起動します。

} else if (strcmp(argv[1], "showconfig") == 0) showConfig();

argcにちょうど3つの文字列がある場合は、入力が<method> <URL>の形式になっていると考えられます。このため、セッション・トークンが存在するかどうかを確認します。

} else if (argc == 3) {
  if (sessionToken != NULL) {

セッション・トークンが存在する場合は、ユーザーがsetLocationを入力したかどうかを確認します。setLocationが入力されていた場合は、setLocationメソッドを起動します。

if (strcmp(argv[1], "setLocation") == 0) {
  setLocation(argv[2]);

入力文字列内の2番目の要素としてユーザーがsetLocationを入力していない場合は、argc内の2番目と3番目の引数をパラメータとして使用して、testTokenメソッドを起動します。

} else {
  testToken(strdup(sessionToken), argv[1], argv[2]);
}

セッション・トークンが存在しない場合は、ユーザーが現在認証されていていないことを報告します。

} else {
  cout << "NO PRIOR LOGIN";
}

argcにちょうど4つの文字列がある場合は、入力が<sessionToken> <method> <URL>の形式になっていると考えられます。このため、argc内の2番目から4番目の文字列をパラメータとして使用して、testTokenメソッドを起動します。

} else if (argc == 4) {
  testToken(argv[1], argv[2], argv[3]);

argcにちょうど5つの文字列がある場合は、入力が<userid><password> <method> <URL>の形式になっていると考えられます。このため、argc内の2番目から5番目の文字列をパラメータとして使用して、testLoginメソッドを起動します。さらに、testLoginの最後の2つの引数をNULLに設定します。

} else if (argc == 5) {
  testLogin(argv[1], argv[2], argv[3], argv[4], NULL, NULL);

argcにちょうど6つの文字列がある場合は、入力が<userid><password> <method> <URL><location>の形式になっていると考えられます。このため、argc内の2番目から6番目の文字列をパラメータとして使用して、testLoginを起動します。さらに、testLoginの最後の引数をNULLに設定します。

} else if (argc == 6) {
  testLogin(argv[1], argv[2], argv[3], argv[4], argv[5], NULL);

argcにちょうど7つの文字列がある場合は、入力が<userid><password> <method> <URL><location><authzParameters>の形式になっていると考えられます。このため、argc内の2番目から6番目の文字列をパラメータとして使用して、testLoginを起動します。

} else if (argc == 7) {
  testLogin(argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
} else {

argc内の文字列の数が1つであるかまたは7つを超える場合は、helpメソッドを起動して、アプリケーションのコマンドライン構文を表示します。これにより、ユーザーはどの種類の情報をどのような形式で入力するのが正しいかを理解できます。

 help();
}

innerMainメソッドのメイン部分でエラーが発生した場合は、エラー・メッセージeを付けて、そのことを報告します。

} catch (ObAccessException *e) {
  cout << "EXCEPTION: " << e->toString();

eが使用していたメモリーが不要になるので、これを解放するためdeleteを起動します。

  delete (e);
}

コンパイラで、使用中のプラットフォームに適する時間関連機能を設定します。

#ifdef _WIN32
  _ftime(&stopTime);
  timeMilliSec = ((float) (stopTime.time    - startTime.time) * 1000) +
    (float) (stopTime.millitm - startTime.millitm);
#else
  gettimeofday(&stopTime, NULL);
  timeMilliSec = (((float) (stopTime.tv_sec - startTime.tv_sec) * 1000) +
    ((float) (stopTime.tv_usec - startTime.tv_usec) / 1000));
#endif

アプリケーションの実行経過時間を報告します。

  cout << "\nTIME : " << timeMilliSec << " milliseconds";
  return 0;
}

次のmainメソッドは、すべてをまとめます。

int main(int argc, char *argv[])
{
  try {

Com.Oblix.Access.ObConfigに定義されているinitializeメソッドをスコープ解決演算子で確実にコールして、Access Manager SDKを初期化します。

ObConfig::initialize();

argcに単一の文字列が含まれているかどうかを確認します。

if (argc == 1) {

単一の文字列が含まれている場合は、対話型モードになっています。この場合、コンパイラでは、最大6個(スペース区切り)の引数に編成された1,000文字以下の入力行を受け付けます。

# define MAX_ARGS 6
# define MAX_INPUT_CHARS 1000

各変数を初期化します。acは、入力文字列内の引数の数を管理します。inputStringには、コマンドラインから取得した入力を、長さが1,000文字を超えないかぎり、格納します。解析されてinputStringに格納された各引数を、argに出力、格納します。avという名前の配列には、解析されてinputStringに格納された各引数をスペース区切りで出力、格納します。

 int ac;
char *av[MAX_ARGS];
char inputString[MAX_INPUT_CHARS];
char *arg;

helpメソッドを起動して、コマンドライン入力で要求される構文と許容範囲をユーザーに通知します。

help();
int stop = 0;

最大許容長を超えていないかぎり、inputStringという名前のコマンドライン入力文字列を取得します。inputStringには、入力を終了する改行文字は取得されません。

while (stop == 0) {
  cout << "\n>";
  cin.getline(inputString, MAX_INPUT_CHARS);

文字列access_test_plusへのポインタを、avという名前の配列の最初の要素に代入します。ここで、文字列access_test_cplusはconst char *であるのに対して、配列avはchar *と宣言する必要があるため、キャスティングが必要になります。

 av[0] = (char *) "access_test_cplus";

デリミタとして空白文字列( )を使用して、inputString内の最初の引数を戻し、これをav内の2番目の引数(av[1])に代入します。inputString内に部分文字列が残っているかぎり、またavに許容される引数の最大数を超えないかぎり、この手順を繰り返します。

ac = 1;
for (arg = strtok(inputString, " ");
   arg != NULL && ac <= MAX_ARGS;
   arg = strtok(NULL, " ")) {
  av[ac] = arg;
  ac++;
}

inputStringから抽出する部分文字列がなくなったら、inputString内の部分文字列がすべて配列avに割り当てられたかどうかを確認します。すべて割り当てられた場合は、avとacをinnermainメソッドに渡して処理し、戻りステータスを変数stopに格納します。

    if (ac > 1) {
      stop = innerMain(ac, av);
      cout << "\n";
    }
  }
}

それ以外の場合は、argcとargvの現在の値をそれぞれ入力引数としてinnerMainメソッドを起動します。セッション・トークンが存在する場合は、使用されているメモリーの割当てを解除し、Access Manager APIを停止します。

  else {
    innerMain(argc, argv);
  }
  cout << "\n";
  if (sessionToken != NULL) free((void *) sessionToken);
  ObConfig::shutdown();
  }

mainメソッド内のいずれかの場所でエラーが発生した場合、当該のエラー・メッセージを報告します。

catch (ObAccessException *e) {
  cout << "EXCEPTION: " << e->toString();

eが使用していたメモリーが不要になるので、これを解放するためdeleteを起動します。

  delete (e);
}

アプリケーションを終了します。

  return 0;
}

4.6.8 証明書ベース認証の実装の例

次のコードの抜粋では、X.509証明書を処理するアクセス・ゲートのJavaでの実装例を示しています。この抜粋は、管理者がアクセス・システムに証明書ベースの認証を構成する場合に適しています。

証明書は、Base 64でエンコードされている必要があります。また、アクセス・サーバーでは、ルート証明書や有効期間などの項目が検証されない点に注意してください。アクセス・サーバーは、項目をユーザーにマップするのみです。

// cert must point to a valid java.security.cert.X509Certificate instance.
    X509Certificate cert = ...

// Convert the certificate into a byte array
    byte[] encodecCert = cert.getEncoded();

// Encode the byte array using Base 64-encoding and convert it into a string
    String base64EncodedCert = new String(Codecs.base64Encode(encodedCert));

// Create hashtable to hold credentials
    Hashtable creds = new Hashtable();

// Store the Base 64-encoded under the key "certificate"
    cred.put("certificate", base64EncodedCert);

// Create ObResourceResource request object including all information about the // // resource being accessed
    ObResourceRequest resourceRequest = new ObResourceRequest(resourceType, resourceUrl, operation);

// Create a ObUserSession with the requestRequest and the cred hashtable
    ObUserSession userSession = new ObUserSession(resourceRequest, creds);

// The above statement will throw an exception if the certificate cannot be mapped // to a valid user by the Access Server.

この抜粋に関連するインポート文を次に示します。

     import HTTPClient.Codecs;
     import com.cfluent.ccore.message.SOAPMessage;
     import com.cfluent.ccore.util.logging.ILogger;
     import com.cfluent.ccore.util.logging.Level;
     import com.cfluent.ccore.util.logging.LogManager;
     import com.cfluent.pipelineengine.container.MessageContext;
     import com.cfluent.pipelineengine.container.SecCredentials;
     import com.cfluent.policysteps.Constants;
     import com.cfluent.policysteps.sdk.Fault;
     import com.oblix.access.ObAccessException;
     import com.oblix.access.ObResourceRequest;
     import com.oblix.access.ObUserSession;
     import java.security.Principal;
     import java.security.cert.X509Certificate;
     import java.util.ArrayList;
     import java.util.Enumeration;
     import java.util.HashMap;
     import java.util.Hashtable;
     import java.util.Iterator;
     import java.util.StringTokenizer;
     import javax.xml.soap.Name;
     import javax.xml.soap.SOAPElement;
     import javax.xml.soap.SOAPException;
     import javax.xml.soap.SOAPFactory;
     import javax.xml.soap.SOAPHeader;
     import javax.xml.soap.SOAPHeaderElement;
     import org.apache.axis.Message;
     import org.apache.axis.message.MessageElement;
     import org.apache.axis.message.SOAPEnvelope;

4.7 C++実装の詳細

この項では、Access Manager APIのC++実装のクラス、コンストラクタ、メソッドおよびパラメータについて説明します。Access Manager APIのクラスの概要については、「Access Manager APIの概要」を参照してください。ヘッダー・ファイルのobaccess_api_cplus.hにも、APIのC++実装に関する情報が含まれています。このファイルは、次のロケーションにあります。

SDK_install_dir\include

Access Manager APIのC++実装には、表4-16に記載のクラスが用意されています。

表4-16 ObAccess(C++)に属するクラスの概要

クラス 説明

ObMap

名前と値のペアのリストを作成したり、それとやり取りできます。

ObMapIterator

リスト内の項目を順次実行できるようにします。リスト内の項目数を確認したり、リスト内の特定の位置にある名前と値のペアを取得できます。

ObAuthenticationScheme

ユーザーの認証に使用する認証スキームを表す構造体を作成したり、その構造体とやり取りできるようにします。

ObResourceRequest

ユーザーのリソース・アクセス・リクエストを表す構造体を作成したり、その構造体とやり取りできるようにします。

ObUserSession

認証に成功したユーザーのセッションを表す構造体を作成したり、その構造体とやり取りできるようにします。

ObConfig

アプリケーションでアクセス・サーバーを初期化したり停止できるようにします。アクセス・サーバーからアクセス・ゲート構成データを取得することもできます。

ObAccessException

Access Manager APIがエラーに呼応してスローしたエラー・メッセージ文字列全体を抽出できるようにします。あるいは、エラー・メッセージ内の埋込み部分文字列を任意数またはすべて(最多は5つ)抽出できます。



注意:

Access Manager APIのC++実装では、不要になった構造体をクリーンアップするにはdeleteメソッドを起動する必要があります。「メモリー管理の概要」を参照してください。

4.7.1 ObMap

ObMapは、名前と値のペアを書き込めるリスト構造体を用意して、Access Manager APIデータを格納できるようにします。このクラスには、リストからの情報の取得、リスト内の項目数の確認、およびリストのコピーができるメソッドもあります。ObMapの概要については、「ObMap」を参照してください。

ObMapのC++実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.7.1.1 コンストラクタ(ObMap、C++)

表4-17に、ObMapクラスのコンストラクタが記載および説明されています。

表4-17 ObMapコンストラクタ(C++)

主なパラメータ 詳細

NULL

ObMap()は、名前と値のペアを格納するための空リストを作成します。このリストの名前は、ユーザーがこのオブジェクトを表す変数を宣言するときに指定します。

otherMap

ObMap(const ObMap &otherMap)は、既存リストのコピーを作成します。新規のリストの名前はユーザーが指定します。

パラメータ:

OtherMap: コピー元リストの名前。

戻り: 名前と値のペアが格納されたリスト。


4.7.1.2 メソッド(ObMap、C++)

表4-18に、ObMapのメソッドと関連パラメータをリストします。

表4-18 ObMapのメソッド(C++)

メソッド 詳細

get

const char *get(const char *name) constは、指定された名前に対応する文字型の値をリストから戻します。

パラメータ:

name: 名前と値のペアの名前部分。これに対応する値が戻されます。

戻り: 名前と値のペアの値部分。リスト内に名前が見つからなかった場合、メソッドはNULLを戻します。

put

void put(const char *name, const char *val)は、リスト内に名前と値のペアを格納します。リストに名前がすでにある場合は、その値が置換されます。ない場合は、名前と値のペアがリストに追加されます。名前は、必ずただ1つの値にのみマップできるようになっています。

パラメータ:

name: 格納する名前を示す文字列。

val: 格納する値を示す文字列。

size

int size()constは、リストに含まれる名前と値のペアの合計数を戻します。

copy

ObMap *copy() constです。ObMapのコピーを作成します。

戻り: コピーへのポインタ。


4.7.2 ObMapIterator

ObMapIteratorは、ObMapで作成されたリスト内の項目をすべて実行したり、リスト内の特定の位置にある名前と値のペアを抽出できるようにします。また、ObMapIteratorのポインタを使用すると、リストの末尾に到達したことを確認することもできます。ObMapIteratorの概要については、「ObMapIterator」を参照してください。

ObMapIteratorのC++実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.7.2.1 コンストラクタ(ObMapIterator、C++)

表4-19に、ObMapIteratorのコンストラクタの詳細をリストします。

表4-19 ObMapIteratorのコンストラクタ(C++)

主なパラメータ 詳細

map

ObMapIterator(const ObMap &map)は、指定されたObMapリスト内を指すイテレータ(ポインタ)を作成します。このポインタは、ObMapIterator(next)とともに使用します。

パラメータ:

map: リストの名前。

other

ObMapIterator(const ObMapIterator &other)は、指定されたObMapリストのコピー内を指すイテレータ(ポインタ)を作成します。このポインタは、ObMapIterator(next)とともに使用します。

パラメータ:

other: コピー元リストの名前。


4.7.2.2 メソッド(ObMapIterator、C++)

表4-20に、ObMapIteratorのメソッドとその詳細をリストします。

表4-20 ObMapIteratorのメソッド(C++)

メソッド 詳細

next

void next(const char **name, const char **val)。リスト内の現在位置にある名前と値のペアを戻し、さらに、イテレータを次のペアに移動します。

戻り: 次の名前と値のペアのテキスト文字列。

hasMore

ObBoolean_t hasMore() const。リスト末尾に到達しないかを監視します。マップ内に名前と値のペアが残っている場合は、ObTrueを戻します。リストの末尾に到達すると、ObFalseを戻します。


4.7.3 ObAuthenticationScheme

ObAuthenticationSchemeを使用すると、アクセス・ゲートがユーザーの認証に使用するチャレンジ・メソッドなどのパラメータを定義する構造体を作成したり、その構造体とやり取りできます。ObAuthenticationSchemeの概要については、「ObAuthenticationScheme」を参照してください。

ObAuthenticationSchemeのC++実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.7.3.1 コンストラクタ(ObAuthenticationScheme、C++)

表4-21に、ObAuthenticationSchemeのコンストラクタの詳細をリストします。

表4-21 ObAuthenticationSchemeのコンストラクタ(C++)

主なパラメータ 詳細

resource

public ObAuthenticationScheme(const ObResourceRequest &resource)は、指定されたObResourceRequestに対してObAuthenticationSchemeオブジェクトを作成します。

パラメータ:

resource: 認証スキーム・オブジェクトの作成対象となるリソースのリクエスト。

戻り: 認証スキーム・オブジェクトを格納する構造体。

presource

ObAuthenticationScheme(const ObResourceRequest *presource)は、指定されたObResourceRequestに対してObAuthenticationSchemeオブジェクトを作成します。

パラメータ:

resource: 認証スキーム・オブジェクトの作成対象となるリソースのリクエスト。

戻り: 認証スキーム・オブジェクトを格納する構造体。

other

ObAuthenticationScheme(const ObAuthenticationScheme &other)は、このクラスのコピー・コンストラクタです。

パラメータ:

other: コピー元となる既存の認証スキーム・オブジェクト。

戻り: オブジェクトのコピーを格納する構造体。


4.7.3.2 メソッド(ObAuthenticationScheme、C++)

表4-22に、ObAuthenticationSchemeのメソッドとその詳細をリストします。

表4-22 ObAuthenticationSchemeメソッド(C++)

メソッド 詳細

getName

const char *getName() constは、構成中に認証スキームに割り当てられた表示名を戻します。

getMask

int getMask() constは、セキュリティ・レベルを定義するマスク・バイトを戻します。

requiresSecureTransport

ObBoolean_t requiresSecureTransport() constは、スキームによりSSLクライアント接続が要求されている場合はObTrueを戻します。要求されていない場合はObFalseを戻します。戻りフラグがObTrueの場合は、redirectUrlが必要になります。

isBasic

ObBoolean_t isBasic() constは、認証スキームにより要求されるものがユーザーIDとパスワードのチャレンジ・メソッドのみかどうかを示すフラグを戻します。

戻り: スキームがBasicの場合はObTrue、それ以外の場合はObFalseを戻します。

isCertificate

ObBoolean_t isCertificate() constは、スキームによりデジタル証明が要求されている場合はObTrueを戻し、要求されていない場合はObFalseを戻します。

isForm

ObBoolean_t isForm() constは、認証スキームがHTMLログイン・フォーム内のカスタマ定義の資格証明フィールドを使用するフォーム・ベース認証の場合、ObTrueを戻します。そうでない場合はObFalseを戻します。

isNone

ObBoolean_t isNone() constは、認証で資格証明が要求されない場合にはObTrueを戻し、要求される場合にはObFalseを戻します。

getLevel

int getLevel() constは、認証スキーム構成中に指定されたセキュリティ・レベルの数値表示を戻します。

getRedirectUrl

const char *getRedirectUrl() constは、認証のためにクライアントのリダイレクト先となるURLを示す文字列を戻します。この文字列は構成中に指定されたものです。

getChallengeParameter

const char *getChallengeParameter(const char *parameterName) constは、構成中に名前指定されたチャレンジ・パラメータの値を戻します。このパラメータは、認証スキームのcredsチャレンジ・パラメータ内にあるコンテキスト・リクエストのスペース区切りのリストを取得するときに使用できます。個別のパラメータ名を取得するには、コール元がリストを解析する必要があります。

パラメータ:

parameterName: チャレンジ・パラメータの名前。

戻り: チャレンジ・パラメータの名前に対する値。

getAllChallengeParameters

const ObMap &getAllChallengeParameters() constは、所定の認証スキームについて構成中に指定されたすべてのチャレンジ・パラメータを戻します。

戻り: 名前と値のペアからなるObMapリスト。

getNumberOfChallengeParameters

int getNumberOfChallengeParameters() constは、認証スキームに構成中に割り当てられたチャレンジ・パラメータの合計数を戻します。


4.7.4 ObResourceRequest

ObResourceRequestは、ユーザーのリソース・アクセス・リクエストを表す構造体を作成したり、その構造体とやり取りできます。ObResourceRequestの概要については、「ObResourceRequest」を参照してください。

ObResourceRequestのC++実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.7.4.1 コンストラクタ(ObResourceRequest、C++)

表4-23で、ObResourceRequestのコンストラクタについて説明します。

表4-23 ObResourceRequestのコンストラクタ(C++)

主なパラメータ 詳細

operation

ObResourceRequest(const char *resType,const char *resource,const char *operation)は、ObResourceRequestオブジェクトを作成します。parametersは、NULL値のままにしておきます。

パラメータ:

resType: リソース・タイプ(resTypeがNULLの場合は、HTTPがデフォルトとして使用されます)。

resource: リソースの名前。

operation: 実行する操作。

戻り: ObResourceRequestオブジェクトを格納する構造体。

parameters

ObResourceRequest(const char *resType, const char *resource, const char *operation, const ObMap &parameters)は、ObResourceRequestオブジェクトを作成します。パラメータ・リストは、NULL値のままにしておきます。

パラメータ:

resource: リソースの名前。operation: 実行する操作。

parameters: コンテキスト・データ(認証パラメータ)のリストへのポインタ。

resType: リソース・タイプ。(resTypeがNULLの場合は、HTTPがデフォルトとして使用されます。)

戻り: リクエスト先リソース・オブジェクトを格納する構造体。

other

ObResourceRequest(const ObResourceRequest &other)は、このクラスのコピー・コンストラクタです。

パラメータ:

other: コピー元となる既存のObResourceRequest構造体の名前。

戻り: オブジェクトのコピーを格納する構造体。


4.7.4.2 メソッド(ObResourceRequest、C++)

表4-24で、ObResourceRequestのメソッドについて説明します。

表4-24 ObResourceRequestのメソッド(C++)

メソッド 詳細

getResourceType

const char *getResourceType() constは、リクエストのリソース・タイプを戻します。

getResource

const char *getResource() constは、リクエストのリソース名を戻します。

getOperation

const char *getOperation() constは、リクエストされた操作の名前を戻します。

getParameters

const ObMap &getParameters() constは、名前と値のペアの集合として提供されたパラメータのリストにある最初の名前と値のペアへのポインタを戻します。

getNumberOfParameters

int getNumberOfParameters() constは、リスト内のペアの件数を戻します。

isProtected

ObBoolean_t isProtected()は、リソースがアクセス・システムのポリシーで保護されている場合にObTrueを戻し、保護されていない場合はObFalseを戻します。

getAuthorizationParameters

ObMap *getAuthorizationParameters() const。ObUserSession.IsAuthorizedメソッドへのレスポンスに、外部ソースにある必要なデータ・ポイントのリストが含まれている場合、isAuthorizedコールにより指定されたObResourceRequestオブジェクト内にこのリストをキャッシュします。アクセス・ゲートは、getAuthorizationParametersメソッドを使用してこのリストを取得します。アクセス・ゲートは、必要な値を追加して、ObMapを後続のisAuthorizedコールに渡します。コール元は、getAuthorizationParametersが戻したObMapオブジェクトの割当てを解除するには、deleteメソッドを使用する必要があります。

戻り: 名前と値(NULL値)のペアのリスト。

getNumberOfAuthorizationParameters

int getNumberOfAuthorizationParameters() constは、必要なコンテキスト・データ項目の数を戻します。


4.7.5 ObUserSession

ObUserSessionを使用すると、認証に成功したユーザーのセッションを表す構造体を作成したり、その構造体とやり取りできます。ObUserSessionの概要については、「ObUserSession」を参照してください。

ObUserSessionのC++実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.7.5.1 コンストラクタ(ObUserSession、C++)

表4-25に、ObUserSessionのコンストラクタとその詳細をリストします。

表4-25 ObUserSessionのコンストラクタ(C++)

主なパラメータ 詳細

sessionToken

ObUserSession(const char *sessionToken)は、ユーザー・セッション・オブジェクトを作成します。セッション情報を即時ロードするコールに使用します。

パラメータ:

sessionToken: 認証の結果を得るために解析されるASCIIテキスト文字列。具体的には、ユーザーのDNと使用される認証スキームのレベル。

戻り: ユーザー・セッション・オブジェクトを格納する構造体。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはsessionToken値がNULLの場合、ObAccessExceptionをスローします。

lazyload

ObUserSession(const char* sessionToken, bool lazyload)は、ユーザー・セッションをリクエスト・ベースで作成します。

パラメータ:

lazyload: このフラグは、trueの場合、セッション・トークンを即時ロードしないことを指定します。sessionTokenの情報が無効の場合、getUserIdentity()、getLocation()、getLevel()、getStartTime()およびgetEndTime()の各関数に基づいてコールを行い、トークンをリクエスト・ベースでロードします。

戻り: ユーザー・セッション・オブジェクト。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはresourceオブジェクトがNULLの場合、ObAccessExceptionをスローします。

resource

ObUserSession(const ObResourceRequest &resource, const ObMap &credentials, const char *location = NULL)は、「ObUserSession」の説明にあるように、ユーザー・セッション・オブジェクトを作成します。

パラメータ:

resource: ユーザーを認証するリソース・オブジェクト。

credentials: ユーザーの資格証明。

location: ユーザーのロケーション(指定が必要な場合)。ユーザー・マシンのロケーションを指定するには、有効なDNS名またはIPアドレスを使用できます。

戻り: ユーザー・セッション・オブジェクトを格納する構造体。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはresourceオブジェクトがNULLの場合、ObAccessExceptionをスローします。

presource

ObUserSession(const ObResourceRequest *presource, const ObMap &credentials, const char *location = NULL)は、ユーザー・セッション・オブジェクトを作成します。

パラメータ:

presource: リソースの名前。

credentials: ユーザーの資格証明。

location: ユーザーのロケーション(指定が必要な場合)。ユーザー・マシンのロケーションを指定するには、有効なDNS名またはIPアドレスを使用できます。

戻り: ユーザー・セッション・オブジェクト。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはresourceオブジェクトがNULLの場合、ObAccessExceptionをスローします。

&other

ObUserSession(const ObUserSession &other)は、ユーザー・セッション・オブジェクトのコピーを作成します。

パラメータ:

other: コピー元となる既存のユーザー・セッション・オブジェクト。

戻り: ユーザー・セッション・オブジェクトのコピー。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはリソース・オブジェクトがNULLの場合、ObAccessExceptionをスローします。


4.7.5.2 メソッド(ObUserSession、C++)

表4-26に、ObUserSessionのメソッドとその詳細をリストします。

表4-26 ObUserSessionのメソッド(C++)

メソッド 詳細

getUserIdentity

const char *getUserIdentity() constは、ユーザー・ディレクトリ内にあるユーザーのプロファイル・エントリのDNを戻します。

getLocation

const char *getLocation() constは、ユーザーのWebブラウザのIPアドレスを戻します。

getAction

const char *getAction(const char *actionType, const char *name) constは、指定されたアクションの名前とタイプに対応するアクションを戻します。

パラメータ:

actionType: 戻すアクションのタイプ。これをNULLのままにしておくと、デフォルトはheaderVarになります。

name: 戻すアクションの名前。

getActions

const ObMap &getActions(const char *actionType)constは、指定されたアクション・タイプに対応する、複数のアクションの名前と値からなるObMapリストを戻します。

パラメータ:

actionType: リストを戻すアクションのタイプ。これをNULLのままにしておくと、デフォルトはheaderVarになります。

getActionTypes

const **getActionTypes() constは、すべてのアクション・タイプを文字列へのポインタの配列として戻します。この配列はNULLポインタで終了します。

getNumberofActions

int getNumberOfActions(const char *actionType) constは、ユーザー・セッションに関連付けられたアクションのうち、指定アクション・タイプのアクションの合計数を戻します。

パラメータ:

actionType: アクションの件数を戻す必要があるアクション・タイプの名前。これをNULLのままにしておくと、デフォルトはheaderVarになります。

getLevel

int getLevel() constは、ユーザーの認証に使用する認証スキームのレベルを示す数値を戻します。

getStartTime

int getStartTime() constは、ユーザーが認証された時間を戻します。この値は、セッションの期限がいつ切れるかを計算するときに使用されます。

戻り: 1970年1月1日午前0時から、ユーザーが認証された時間までの秒数。

getLastUseTime

int getLastUseTime() constは、最後にユーザーが認証された時間を戻します。この値は、アイドル・セッションの期限がいつ切れるかを計算するときに使用されます。

戻り: 1970年1月1日午前0時から、ユーザー・リクエストが最後に認可された時間までの秒数。

getStatus

ObUserStatus_t getStatus() constは、現在のセッション・ステータスを示します。

戻り: LOGGEDOUT、LOGGEDIN、LOGINFAILED、EXPIREDなど、ObUserStatus_tの値。

getError

ObUserError_t getError() constは、最後の認証または認可により判定されたObUserError_t型エラー値のいずれかを戻します。

getErrorMessage

const char *getErrorMessage(int err) constは、認証または認可の失敗について詳細なエラー・メッセージを戻します。このメッセージのテキストは、Access APIから取得し、ユーザーが変更することはできません。

パラメータ:

err: 認証または認可の失敗に対応する数値のエラー・コード。

getSessionToken

const char *getSessionToken() constは、ユーザー・セッションを示す、保存されている暗号化ASCII文字列を戻します。

getUserIdentity

const char *getUserIdentity() constは、ユーザー・ディレクトリ内にあるユーザーのプロファイル・エントリの識別名を戻します。

setLocation

void setLocation(const char *location)は、ユーザーのブラウザのロケーションを設定します。

isAuthorized

(resource)

ObBoolean_t isAuthorized() const ObResourceRequest &resource)は、特定のリソースについてユーザーが操作の実行を認可されている場合はObTrueを戻し、認可されていない場合はObFalseを戻します。

パラメータ:

resource: 認可チェック対象とするリソース・オブジェクト。

スローする例外: なんらかの理由により認可チェックで失敗した場合に、ObAccessExceptionをスローします。

isAuthorized

(presource)

ObBoolean_t isAuthorized(const ObResourceRequest *presource)は、特定のリソースについてユーザーが操作をリクエストすることが認可される場合にObTrueを戻し、認可されない場合はObFalseを戻します。

パラメータ:

presource: 認可チェック対象とするリソース・オブジェクト。

スローする例外: なんらかの理由により認可チェックで失敗した場合に、ObAccessExceptionをスローします。

isAuthorized (...res, parameters)

ObBoolean_t isAuthorized(const ObResourceRequest &res [const ObMap &parameters])は、特定のリソースについてユーザーが操作をリクエストすることが認可される場合にObTrueを戻し、認可されない場合はObFalseを戻します。

パラメータ:

res: 認可チェック対象とするリソース・オブジェクト。

ObMap &parameters: Access Manager APIが認可を求めてアクセス・サーバーにリクエスト・コンテキスト・オブジェクトに入れて送信する、名前と値のペアからなるリスト。このparameter引数はオプションです。指定すると、parameters内の名前と値のペアが認可を求めてアクセス・サーバーに渡されます。

スローする例外: なんらかの理由により認可チェックで失敗した場合に、ObAccessExceptionをスローします。

isAuthorized (...pRes, parameters)

ObBoolean_t isAuthorized(const ObResourceRequest &pRes [const ObMap &parameters])は、特定のリソースについてユーザーが操作をリクエストすることが認可される場合にObTrueを戻し、認可されない場合はObFalseを戻します。

パラメータ:

pRes: 認可チェック対象とするリソース・オブジェクト。

ObMap &parameters: Access Manager APIが認可を求めてアクセス・サーバーにリクエスト・コンテキスト・オブジェクトに入れて送信する、名前と値のペアからなるリスト。このparameter引数はオプションです。指定すると、parameters内の名前と値のペアが認可を求めてアクセス・サーバーに渡されます。

スローする例外: なんらかの理由により認可チェックで失敗した場合に、ObAccessExceptionをスローします。

logoff

void logoff()は、認証済のユーザーをログオフして、セッションを終了します。


4.7.6 ObConfig

ObConfigを使用すると、アプリケーションは、アクセス・サーバーの初期化や停止、あるいはアクセス・サーバーからのアクセス・ゲート構成データの取得を行うことができます。ObConfig.getItemおよびObConfig.getAllItemsが戻すアクセス・ゲート構成パラメータのリストについては、「構成パラメータ」を参照してください。

ObConfigの概要については、「ObAccessException」を参照してください。

ObAccess.ObConfigクラスのC++実装には、コンストラクタはありません。

ObConfigのC++実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.7.6.1 メソッド(ObConfig、C++)

表4-27で、ObConfigのメソッドについて説明します。

表4-27 ObConfigのメソッド(C++)

メソッド 詳細

initialize

static void initialize(const char *installDir = NULL) initializesは、アクセス・ゲートを初期化し、すべてのアクセス・ゲート構成パラメータをObConfig構造体に読み取ります。「構成パラメータ」を参照してください。

パラメータ:

installDir: このパラメータ用に用意されているコード化された内部値、あるいは環境変数OBACCESS_INSTALL_DIRの値。

スローする例外: ユーザー・セッション・オブジェクトを作成できない場合、またはOBACCESS_INSTALL_DIRが無効の場合、ObAccessExceptionをスローします。

shutdown

static void shutdown()は、アクセス・ゲートをアクセス・サーバーから切断し、メモリーやその他のリソースを解放します。

getAllitems

static ObMap &getAllItems()は、すべての構成変数を構成ファイルからObMapの名前と値のリストに読み取ります。「構成パラメータ」を参照してください。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionがスローされます。

getSDKVersion

static const char *getSDKVersion()は、APIが認識できる内部値としてのSDKバージョンを戻します。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionがスローされます。

getNAPVersion

static const char *getNAPVersion()は、APIで使用するアクセス制御プロトコルのバージョンを、APIが認識できる内部値として戻します。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionがスローされます。

getNumberOf

Items

static int getNumberOfItems()は、構成ファイルから抽出可能な項目の合計数を戻します。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionがスローされます。

getItem

static const char *getAction(const char* name)は、「構成パラメータ」に記載されている構成項目の名前を示す文字列を戻します。

パラメータ:

name: 構成項目の名前。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionがスローされます。


4.7.7 ObAccessException

ObAccessExceptionクラスを使用すると、Access Manager APIとの関係で生成されたエラーを捕捉できます。ObAccessExceptionのC++実装を使用すると、エラー・コードに対応する完全なエラー・メッセージを戻したり、最後に生成されたエラー・コードの場合は、完全メッセージから最大5個の部分文字列を戻してカスタム・エラー・メッセージ・テキストに埋め込むことができます。

4.7.7.1 コンストラクタ(ObAccessException、C++)

表4-28に、ObAccessExceptionクラスのC++実装のコンストラクタをリストします。

表4-28 ObAccessExceptionのコンストラクタ(C++)

主なパラメータ 詳細

code

ObAccessException(ObAccessExceptionCode_t code, const char *p1 = NULL, const char *p2 = NULL, const char *p3 = NULL, const char *p4 = NULL, const char *p5 = NULL)は、エラー・コードに対応する例外を作成します。

パラメータ:

code: 発生したエラーのエラー番号。

p1からp5: メッセージ文字列に挿入可能なパラメータ(メッセージ文字列内に変数の値を挿入できる場合)。パラメータは、内部処理でのみ使用されます。

other

ObAccessException(const ObAccessException &other)は、既存の例外をコピーします。

パラメータ:

other: 既存の例外の名前。


4.7.7.2 メソッド(ObAccessException、C++)

表4-29に、ObAccessExceptionクラスのC++実装のメソッドをリストします。

表4-29 ObAccessExceptionのメソッド(C++)

パラメータ 詳細

getCode

ObAccessExceptionCode_t getCodeは、Access Manager API内で最後に生成されたエラー・コードの値を戻します。(このエラー・コードは、APIが作成した例外にも表示されます)。

getParameter

const char *getParameter(int index)は、通常の完全エラー・メッセージ内で%indexの位置に表示される部分文字列を戻します。この部分文字列は、作成したカスタム・メッセージ文字列に挿入できます。

パラメータ:

index: 部分文字列が、APIにより生成される通常の完全エラー・メッセージ内で表示される位置のインデックス番号。

toString

const char *toString()は、API内で最後に生成されたエラー・コードに対応する完全エラー・メッセージ文字列(該当するすべての部分文字列が挿入済)を戻します。このため、メッセージの報告を可能にするには、戻り値を解放しないでください。

getCodeString

const char *getCodeString(ObAccessExceptionCode_t code)は、指定されたObAccessExceptionCode_t型エラー・コードに対応するエラー・メッセージを戻します。

エラー・コードを指定しているので、これがAPIで最後に生成されたエラー・メッセージである必要はありません。

ただし、ObAccessGate.msgファイルの文字列がそのまま戻され、このファイルではすべての部分文字列がNULLに設定されているため、文字列には部分文字列p1からp5の現在の値は挿入されません。

このため、メッセージの報告を可能にするには、戻り値を解放しないでください。

パラメータ:

code: ObAccessGate.msgを使用して戻すエラー・メッセージのObAccessExceptionCode_t型エラー・コード。


4.7.8 ObDiagnostic(C++)

ObDiagnosticクラスを使用すると、アクセス・サーバーの名前、ポート、ロケーション、アクセス・ゲートとアクセス・サーバーの接続数といった診断情報を表示できます。このクラスは、アクセス・サーバーに関連付けられているディレクトリの診断情報も表示します。

例:

class ObDiagnostic {
public:
 OBDLLEXPORT static const ObMap* getServerDiagnosticInfo() ;
 OBDLLEXPORT static const ObMap* getDirectoryDiagnosticInfo() ;
 OBDLLEXPORT static const ObMap* getClientDiagnosticInfo() ;
 };

4.7.8.1 メソッド(ObDiagnostic、C++)

表4-30に、ObDiagnosticのC++実装のメソッドをリストします。

表4-30 ObDiagnosticのメソッド(C++)

パラメータ 詳細

getServerDiagnosticInfo()

このパラメータは、ObMap構造体上の次の項目を戻します。

  • アクセス・サーバーのホスト名

  • アクセス・サーバーのポート

  • 現在のWebGateによって確立されたアクセス・サーバーとの接続数

  • アクセス・サーバーの状態(起動中または停止中)

  • アクセス・サーバー・インストールの作成日時

  • アクセス・サーバーのインストール・ディレクトリ

  • このアクセス・サーバーに許容されるスレッドの最大数

getDirectoryDiagnosticInfo()

このパラメータは、ObMap構造体内の次の項目を戻します。

  • ディレクトリ・タイプ(Config、User、Policy)

  • ディレクトリのホスト

  • ディレクトリのポート

  • ディレクトリの状態(起動中または停止中)

  • 優先度(プライマリまたはセカンダリ)

  • モード(openまたはSSL)

  • サイズ制限(検索結果の最大数)

  • 時間制限(タイムアウトしきい値)

  • ログインDN

  • 作成日時(アクセス・サーバーがDirectory Serverとの接続を確立した時間)。(どちらかのサーバーを再起動すると、作成日時は変更されます。)


4.8 C実装の詳細

Access Manager APIのC実装内の「疑似クラス」に属する関数には、ベースとなるAccess Manager APIのC++実装で使用するネーミング規則と並行的な体系を持つ名前が付けられています。たとえば、C関数のObMap_getはC++メソッドのObMap.getに対応し、CのObUser_isAuthorizedはC++のObUserSession.isAuthorizedに対応します。実は、C実装のクラス・メンバー関数は、C++実装においては、メソッドへの単なる不透明なポインタに相当します。

ヘッダー・ファイルobaccess_api_c.hには、Access Manager APIのC実装に属する「疑似クラス」のメンバーの詳細が記述されています。このファイルは、次のロケーションにあります。

SDK_install_dir\include.

Access Manager APIの実装間の比較については、「Access Manager APIの概要」を参照してください。


注意:

C言語によるAccess Manager APIの実装では、不要になった構造体に対して該当の_free関数を起動してクリーンアップを行う必要があります。「メモリー管理の概要」を参照してください。

4.8.1 ObMap_t

ObMap_t疑似クラスは、Access Manager APIが使用する様々な名前と値のペアのセットを格納するリスト構造体を提供します。このような構造体を作成できる他、これらの構造体への書込みやこれらの構造体からの情報の取得、構造体内の項目ペア数の確認、構造体の内容のコピーができます。リスト構造体が使用するメモリーの割当て解除を行える関数がもう1つあります。リストが不要になった場合は、メモリー・リークを防止するため、このデストラクタを使用してください。

ObMapクラスの概要については、「ObMap」を参照してください。

ObMap_tのC実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.8.1.1 関数(ObMap_t、C)

表4-31で、ObMap_tクラスの関数について説明します。

表4-31 ObAccess.ObMap_t疑似クラスの関数(C)

関数 詳細

ObMap_new

ObMap_t ObMap_new()は、ユーザーが指定した名前の空リストを作成します。(この関数は、この疑似クラスのコンストラクタとして機能します)。

戻り: 名前と値のペアが格納されたリスト。

ObMap_get

const char *ObMap_get(ObMap_t map, const char *name)は、指定されたリストから、指定された名前に対する文字型の値を戻します。

パラメータ:

map: リストへのポインタ。

name: 指定されたリストにある名前と値のペアの名前部分。これに対応する値が戻されます。

ObMap_put

void ObMap_put(ObMap_t map, const char *name, const char *val)は、指定されたリスト内に名前と値のペアを格納します。リスト内に名前がすでに存在する場合は、その名前の値が置換されます。

パラメータ:

map: リストの名前。

name: 格納する項目の名前を示す文字列。

val: 格納する値を示す文字列。

ObMap_size

int ObMap_size(ObMap_t map)は、指定されたリストに含まれる名前と値のペアの合計数を戻します。

パラメータ:

map: リストの名前。

ObMap_copy

ObMap_t ObMap_copy(ObMap_t map)は、指定されたリストのコピーを作成します。

パラメータ:

map: リストの名前。

戻り: コピーへのポインタ。

ObMap_free

void ObMap_free(ObMap_t *pMap)は、指定されたリストが専有するメモリーを解放します。(この関数は、この疑似クラスのデストラクタとして機能します)。

パラメータ:

pMap: リスト内の位置へのポインタ。


4.8.2 ObMapIterator_t

ObMapIterator_t疑似クラスは、リスト構造体内にポインタを配置するための関数を提供し、これによりリスト内の項目数をカウントできます。また、他の関数では、リスト内のポインタを項目間で移動することによる、リスト内のすべての項目の実行、リスト末尾に到達したことの確認、ポインタが使用するメモリーの割当て解除ができます。

ObMapIteratorクラスの概要については、「ObMapIterator」を参照してください。

ObMapIterator_tのC実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.8.2.1 関数(ObMapIterator_t、C)

表4-32で、ObMapIterator_tクラスの関数について説明します。

表4-32 ObAccess.ObMapIterator_t疑似クラスの関数(C)

関数 詳細

ObMapIterator_ new

ObMapIterator_t ObMapIterator_new(ObMap_t map)は、指定されたリストに対するイテレータを作成し、当初はイテレータにリスト内の最初の名前と値のペアをポイントさせます。(この関数は、この疑似クラスのコンストラクタとして機能します)。

パラメータ:

map: リストの名前。

戻り: リストへのポインタ。

ObMapIterator_ hasMore

ObBoolean_t ObMapIterator_hasMore(ObMapIterator_t iter)は、リストの末尾に到達しないかを監視して、イテレータの現在位置より後に名前と値のペアが残っている場合はObTrueを戻します。イテレータがリストの末尾に到達するとObFalseを戻します。

パラメータ:

iter: リスト内の次の項目へのポインタ。

ObMapIterator_ next

void ObMapIterator_next(ObMapIterator_t iter, const char **name, const char **val)は、リスト内の現在のイテレータ位置にある名前と値のペアを示すテキスト文字列を戻します。この関数は、その後イテレータを次のペアに移動します。技術的には、const char **の付く各パラメータは、文字列へのポインタに設定される変数へのポインタです。

パラメータ:

iter: リスト内の次の項目へのポインタ。

name: nameで示される文字列へのポインタが代入される変数のアドレス。

val: valで示される文字列へのポインタが代入される変数のアドレス。

ObMapIterator_free

void ObMapIterator_free(ObMapIterator_t *pIter)は、リストが使用するメモリーを解放します。(この関数は、この疑似クラスのデストラクタとして機能します)。

パラメータ:

pIter: リスト内の位置へのポインタ。


4.8.3 ObAuthenticationScheme_t

ObAuthenticationScheme疑似クラスを使用すると、ユーザーの認証に使用する構造体を作成したり、その構造体とやり取りできます。ObAuthenticationSchemeの概要については、「ObAuthenticationScheme」を参照してください。

ObAuthenticationScheme_tのC実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.8.3.1 関数(ObAuthenticationScheme_t、C)

表4-33で、ObAuthenticationScheme_tに属する関数について説明します。

表4-33 ObAccess.ObAuthenticationScheme_tの関数(C)

関数 詳細

ObAuthn_new

ObAuthnScheme_t ObAuthn_new(ObResourceRequest_t resource)は、ObAuthenticationSchemeオブジェクトを作成し、認証に必要なチャレンジ・メソッドなど、指定されたObResourceRequest上の情報を戻します。

パラメータ:

resource: 認証スキーム・オブジェクトの作成対象となるリソースのリクエスト。

ObAuthn_ getName

const char *ObAuthn_getName(ObAuthnScheme_t scheme)は、構成中に認証スキームに割り当てられた表示名を戻します。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_getMask

int ObAuthn_getMask(ObAuthnScheme_t scheme)は、認証チャレンジ・メソッドを示すとともに、資格証明の送信にセキュア接続を使用する必要があるかどうかを示す、マスク・バイトを戻します。マスク・バイトの詳細は、「ObAuthenticationScheme」を参照してください。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_requiresSecureTransport

ObBoolean_t ObAuthn_requiresSecureTransport (ObAuthnScheme_t scheme)は、指定された認証スキームで資格証明の送信にセキュア接続(SSLまたはTLS)が必要とされている場合はObTrueを戻します。不要な場合はObFalseを戻します。セキュア接続が必要とされている場合は、認証スキームを構成する際にredirectUrlを指定する必要があります。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_isBasic

ObBoolean_t ObAuthn_isBasic(ObAuthnScheme_t scheme)は、指定された認証スキームのチャレンジ・メソッドがHTTP BASICの場合にObTrueを戻します。(すなわち、この認証スキームに必要な資格証明がユーザーIDとパスワードのみ、という場合です)。そうでない場合はObFalseを戻します。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_isCertificate

ObBoolean_t ObAuthn_isCertificate(ObAuthnScheme_t scheme)は、認証スキームによりデジタル・セキュリティ証明が要求されている場合はObTrueを戻し、要求されていない場合はObFalseを戻します。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_isForm

ObBoolean_t ObAuthn_isForm(ObAuthnScheme_t scheme)は、認証スキームでHTMLログイン・フォームのカスタマ定義の資格証明フィールドを要求する場合はObTrueを戻し、要求しない場合はObFalseを戻します。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_isNone

ObBoolean_t ObAuthn_isNone(ObAuthnScheme_t scheme)は、認証に資格証明が要求されない場合にObTrueを戻します。資格証明が要求される場合はObFalseを戻します。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_getLevel

int ObAuthn_getLevel(ObAuthnScheme_t scheme)は、認証スキーム構成中に指定された認証強度を示す数値を戻します。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_getRedirectUrl

const char *ObAuthn_getRedirectUrl(ObAuthnScheme_t scheme)は、セキュア認証の実行対象とされているロケーションを示すURLを戻します。指定された認証スキームにセキュア認証が不要な場合は、この値はNULLに設定されます。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_getChallengeParameter

const char *ObAuthn_getChallengeParameter (ObAuthnScheme_t scheme, const char *parameterName)は、指定された認可スキームの指定されたチャレンジ・パラメータの値を戻します。

パラメータ:

scheme: 認証スキームへのポインタ。

parameterName: チャレンジ・パラメータの名前。

ObAuthn_getAllChallengeParameters

ObMap_t ObAuthn_getAllChallengeParameters (ObAuthnScheme_t scheme)は、指定された認証スキームに指定されているすべてのチャレンジ・パラメータが含まれた、名前と値のリストを戻します。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_getNumberOfChallengeParameters

int ObAuthn_getNumberOfChallengeParameters (ObAuthnScheme_t scheme)は、指定された認証スキームに割り当てられているチャレンジ・パラメータの数を戻します。

パラメータ:

scheme: 指定する認証スキームのポインタ。

ObAuthn_free

void ObAuthn_free(ObAuthnScheme_t *pScheme)は、指定された認証スキームが使用するメモリーを解放し、ポインタの値をNULLに設定します。

パラメータ:

pScheme: 指定する認証スキームのポインタ。


4.8.4 ObResourceRequest_t

ObResourceRequest_t疑似クラスを使用すると、ユーザーのリソース・アクセス・リクエストを表す構造体を作成したり、その構造体とやり取りできます。ObResourceRequestの概要については、「ObResourceRequest」を参照してください。

ObResourceRequest_tのC実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.8.4.1 関数(ObResourceRequest_t、C)

表4-34で、ObResourceRequest_tクラスの関数について説明します。

表4-34 ObAccess.ObResourceRequest_t疑似クラスの関数(C)

関数 詳細

ObResourceRequest_new

ObResourceRequest_t ObResourceRequest_new(const char *resType, const char *resource, const char *operation, ObMap_t parameters)は、指定されたリソース・タイプ、リソース名、操作、パラメータを使用して、ObResourceRequestを作成します。

パラメータ:

resType: リソース・タイプ。(resTypeがNULLの場合は、HTTPがデフォルトとして使用されます。)

resource: リソースへのポインタ。

operation: リソースに対して実行する操作。

parameters: リソース・リクエストに関連付けるパラメータのリストへのポインタ。

戻り: リクエスト先リソース・オブジェクトを格納する構造体へのポインタ。

ObResource_getResourceType

const char *ObResource_getResourceType (ObResourceRequest_t resource)は、指定されたリクエスト先リソースのリソース・タイプを戻します。

パラメータ:

resource: リクエストするリソースのポインタ。

ObResource_getResource

const char *ObResource_getResource (ObResourceRequest_t resource)は、指定されたリソース・リクエストを使用して、リクエストされたリソースの名前を戻します。

パラメータ:

resource: リクエストするリソースのポインタ。

ObResource_getOperation

const char *ObResource_getOperation (ObResourceRequest_t resource)は、指定されたリソース・リクエストを使用して、リソースに対して起動される操作の名前を戻します。

パラメータ:

resource: リクエストするリソースのポインタ。

ObResource_getParameters

const ObMap_t ObResource_getParameters (ObResourceRequest_t resource)は、指定されたリソース・リクエストに関連付けられているパラメータの名前と値のリストへのポインタを戻します。

パラメータ:

resource: リクエストするリソースのポインタ。

ObResource_getNumberOfParameters

int ObResource_getNumberOfParameters (ObResourceRequest_t resource)は、指定されたリソース・リクエストに関連付けられているパラメータの名前と値のリストに含まれる項目数を戻します。

パラメータ:

resource: リクエストするリソースのポインタ。

ObResource_isProtected

ObBoolean_t ObResource_isProtected (ObResourceRequest_t resource)は、リソースがアクセス・システム・ポリシーにより保護されている場合には、ObTrueを戻します。そうでない場合はObFalseを戻します。

パラメータ:

resource: リクエストするリソースのポインタ。

ObResource_free

ObBoolean_t isCertificate() const ObResourceRequest_t *resource)は、リソース・オブジェクトが使用しているメモリーを解放し、指定されたリソース・リクエストに関連付けられたパラメータのリストへのポインタをNULLに設定します。

パラメータ:

resource: リクエストするリソースのポインタ。

ObResource_getAuthorizationParameters

ObMap_t ObResource_getAuthorizationParameters (ObResourceRequest_t res)は、指定されたリソース・リクエストに関連付けられている、特定認可スキームについてのパラメータのリストを戻します。すべてのパラメータ名が、値をNULLに設定されて戻されます。戻り値を使用する必要がなくなった場合は、ObMap_free()を使用して、getAuthorizationParameters()で戻されたObMap_tオブジェクトの割当てを解除する必要があります。

戻り: 必要な資格証明のリスト。

ObResource_getNumberOfParameters

int ObResource_getNumberOfAuthorizationParameters (ObResourceRequest_t res)は、指定されたリソース・リクエストに必要となるコンテキスト・パラメータの数を戻します。

ObResource_free

void ObResource_free(ObResourceRequest_t *pRes)は、指定されたObResourceRequest構造体のメモリーの割当てを解除します。


4.8.5 ObUserSession_t

ObUserSession_t疑似クラスを使用すると、アクセス・システムに認証されたユーザーのセッションを表す構造体を作成したり、その構造体とやり取りできます。ObUserSessionの概要については、「ObUserSession」を参照してください。

ObUserSession_tのC実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.8.5.1 関数(ObUserSession、C)

表4-35で、ObUserSessionクラスの関数について説明します。

表4-35 ObAccess.ObUserSession_t疑似クラスの関数(C)

関数 詳細

ObUserSession_authenticate

ObUserSession_t ObUserSession_authenticate (ObResourceRequest_t resource, ObMap_t credentials, const char *location)は、ユーザー・セッション・オブジェクトを作成します。

パラメータ:

resource: リクエスト先リソース・オブジェクト。このリソースに対してユーザーを認証します。

credentials: ユーザーの資格証明。

location: ユーザーのロケーション(指定が必要な場合)。ユーザー・マシンのロケーションを指定するには、有効なDNS名またはIPアドレスを使用できます。

戻り: ユーザー・セッション・オブジェクト。

例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはresourceオブジェクトがNULLの場合、内部生成されたObAccessExceptionをスローします。

ObUserSession_fromToken

ObUserSession_t ObUserSession_fromToken(const char *sessionToken)は、ユーザー・セッション・オブジェクトを作成します。セッション・トークンをただちに必要とする場合に使用します。

パラメータ:

sessionToken: 関連する資格証明とユーザー・ロケーション情報を取得するために解析されるセッション・トークン。

戻り: ユーザー・セッション・オブジェクト。

例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはsessionTokenがNULLの場合、内部生成された ObAccessExceptionをスローします。

ObUserSession_fromTokenwithLazyLoad

ObUserSession_t ObUserSession_fromTokenwithLazyLoad(const char *sessionToken,bool lazyload)は、リクエスト・ベースでユーザー・セッションを作成します。

パラメータ:

lazyload: このフラグは、trueの場合、セッション・トークンを即時ロードしないことを指定します。sessionTokenの情報が無効の場合、getUserIdentity()、getLocation()、getLevel()、getStartTime()およびgetEndTime()の各関数に基づいてコールを行い、トークンをリクエスト・ベースでロードします。

戻り: ユーザー・セッション・オブジェクト。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはsessionTokenがNULLの場合、内部生成されたObAccessExceptionをスローします。

ObUser_getUserIdentity

const char *ObUser_getUserIdentity(ObUserSession_t user)

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

ObUser_getLocation

const char *ObUser_getLocation(ObUserSession_t user)は、ユーザーのWebブラウザのIPアドレスを戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

戻り: ユーザーのWebブラウザのIPアドレス。

ObUser_getAction

const char *ObUser_getAction(ObUserSession_t user, const char *actionType, const char *name)は、指定されたユーザー・セッションの指定されたアクション名とアクション・タイプに対応する値を戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

actionType: アクションのタイプ。これに対応する値が戻されます。(これをNULLのままにしておくと、デフォルトはheaderVarになります)。

name: アクションの名前。これに対応する値が戻されます。

ObUser_getActions

const ObMap_t ObUser_getActions(ObUserSession_t user, const char *actionType)は、指定されたユーザー・セッションの指定アクション・タイプに対応するアクションの名前と値のペアからなるリストへのポインタを戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

actionType: リストを戻すアクションのタイプ。actionTypeをNULLのままにしておくと、デフォルトはheaderVarになります。

ObUser_getActionTypes

const **getActionTypes(ObUserSession_t user)は、文字列へのポインタの配列を戻します。この配列は、NULLポインタで終了し、指定されたユーザー・セッションに関連付けられているすべてのアクション・タイプを表します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

ObUser_getNumberofActions

int getNumberOfActions(ObUserSession_t user, const char *actionType)は、指定されたユーザー・セッションに関連付けられた指定タイプのアクションの数を戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

actionType: アクションの件数を戻す必要があるアクション・タイプの名前。これをNULLのままにしておくと、デフォルトはheaderVarになります。

ObUser_getLevel

int ObUser_getLevel(ObUserSession_t user)は、指定されたユーザー・セッションの認証スキームの認証レベルを示す数値を戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

ObUser_getStartTime

int ObUser_getStartTime(ObUserSession_t user)は、1970年1月1日午前0時から、指定セッションでユーザーが認証された最初の時間までの秒数を戻します。この値は、セッションの有効期限を計算するときに使用されます。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

ObUser_getLastUseTime

int ObUser_getLastUseTime(ObUserSession_t user)は、1970年1月1日午前0時から、指定セッションでユーザーが最後に認証された時間までの秒数を戻します。この値は、アイドル・セッションの有効期限を計算するときに使用されます。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

戻り: 当該の時間を示す数値。

ObUser_getStatus

ObUserStatus_t ObUser_getStatus(ObUserSession_t user)は、セッションのステータスを示すObUserStatus_t型の値(LOGGEDOUT、LOGGEDIN、LOGINFAILED、EXPIRED)の1つを戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

ObUser_getError

ObUserError_t ObUser_getError(ObUserSession_t user)は、指定ユーザー・セッションにおいて、最後の認証失敗または認可失敗で判定されたObUserError_t型エラー値の1つを戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

ObUser_getErrorMessage

const char *ObUser_getErrorMessage(ObUserSession_t user)は、指定ユーザー・セッションにおける最後の認証失敗または認可失敗の詳細エラー・メッセージを戻します。このメッセージのテキストは、Access APIから取得し、ユーザーが変更することはできません。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

ObUser_isAuthorized

ObBoolean_t ObUser_isAuthorized(ObUserSession_t user, ObResourceRequest_t resource)は、特定のリソースについてユーザーが操作をリクエストすることが認可されている場合はObTrueを戻し、認可されていない場合はObFalseを戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

resource: 認可チェック対象とするリクエスト先リソース・オブジェクトの名前。

ObUser_isAuthorizedWithParameters

ObBoolean_t ObUser_isAuthorizedWithParameters (ObUserSession_t user, ObResourceRequest_t res, ObMap_t parameters)は、特定のリソースについてユーザーが操作をリクエストすることが認可されている場合はObTrueを戻します。そうでない場合はObFalseを戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

resource: 認可チェック対象とするリクエスト先リソース・オブジェクトの名前。

parameters: リソース・リクエストに関連付ける任意のデータ。このパラメータはオプションです。

ObUser_getSessionToken

const char *ObUser_getSessionToken(ObUserSession_t user)は、ユーザーのハード・ディスク上に保存されているセッション・トークンから、指定ユーザー・セッションについての情報を含んだASCII文字列を戻します。

パラメータ:

user: ユーザー・セッション・オブジェクトの名前。

ObUser_setLocation

void ObUser_setLocation(ObUserSession_t user, const char *location)は、ユーザーのブラウザのロケーションを設定します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

location: ユーザーのブラウザのロケーションを示すDNSまたはIPアドレス。

ObUser_logoff

void ObUser_logoff(ObUserSession_t user)は、認証済のユーザーをログオフして、指定ユーザー・セッションを終了します。

パラメータ:

user: ユーザー・セッション・オブジェクトへのポインタ。

ObUser_free

void ObUser_free(ObUserSession_t *puser)は、リストに割り当てられたメモリーを解放し、リスト・ポインタをNULLに設定します。

パラメータ:

puser: ユーザー・セッション・オブジェクトへのポインタ。


4.8.6 ObConfig_t

ObConfig_t疑似クラスを使用すると、アプリケーションでアクセス・サーバーを初期化したり停止できます。アクセス・サーバーからアクセス・ゲート構成データを取得することもできます。「構成パラメータ」を参照してください。

ObConfigの概要については、「ObConfig」を参照してください。

ObConfig_tのC実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.8.6.1 関数(ObConfig、C)

表4-36に、ObConfig疑似クラスの関数と詳細をリストします。

表4-36 ObAccess.ObConfig_t疑似クラスの関数(C)

関数 詳細

ObConfig_initialize

void ObConfig_initialize(const char *installDir)は、Access Manager APIを初期化します。初期化作業には、「構成パラメータ」に記載されているすべての構成パラメータの読込みも含まれます。

パラメータ:

installDir: Access Manager APIインストールのルート。コード化済の値をこのパラメータに指定しない場合は、環境変数OBACCESS_INSTALL_DIRの値が使用されます。

スローする例外: なんらかの理由で構成オブジェクトを作成できない場合、またはOBACCESS_INSTALL_DIRが無効の場合、内部生成されたObAccessExceptionをスローします。

ObConfig_shutdown

void ObConfig_shutdown()は、アクセス・ゲートをアクセス・サーバーから切断し、アクセス・ゲートとAccess Manager APIが使用するメモリーやその他のリソースを解放します。

ObConfig_getAllitems

ObMap_t ObConfig_getAllItems()は、「構成パラメータ」に記載のすべてのアクセス・ゲート構成項目のリストへのポインタを戻します。

スローする例外: Access Manager SDKの初期化が成功する前にこのメソッドを起動しようとすると、内部生成されたObAccessExceptionがスローされます。

ObConfig_getNumberOfItems

int ObConfig_getNumberOfItems()は、アクセス・ゲート構成ファイル内の項目数を戻します。

スローする例外: Access Manager SDKの初期化が成功する前にこのメソッドを起動しようとすると、内部生成されたObAccessExceptionがスローされます。

ObConfig_getItem

const char *ObConfig_getItem(const char* name)は、アクセス・ゲート構成項目リストから、指定された名前に対応する値を戻します。

パラメータ:

name: 値を抽出する項目の名前。

スローする例外: Access Manager SDKの初期化が成功する前にこのメソッドを起動しようとすると、内部生成されたObAccessExceptionがスローされます。

ObConfig_getSDKVersion

const char *ObConfig_getSDKVersion()は、APIが認識できる内部値としてのAccess Manager SDKのバージョンを戻します。


4.8.7 ObAccessException_t

アクセス・サーバーに接続できないなど、予期外のリカバリ不能な問題をAccess APIが検出すると、ObAccessの例外が生成されます。ObAccessExceptionの概要については、「ObAccessException」を参照してください。

4.8.7.1 C言語のエラー・ハンドラ

Access Manager APIのC実装を使用して作成したアクセス・ゲートには、ObAccessExceptionが発生したときにコールするObAccessExceptionHandler_t関数を作成する必要があります。これを作成しない場合、APIのC実装で例外が捕捉できなくなるだけです。したがって、CのAPIを使用してオブジェクトを作成する際に例外が発生すると、例外を報告したり空でオブジェクトを戻さないように処理する例外ハンドラが存在しないため、そのオブジェクトは空で戻されます。


注意:

コール元プログラムをC++で作成すると、例外ハンドラのない、Cで作成されたアクセス・ゲートでなく、コール元プログラムが例外を捕捉することがあります。

バージョン6よりも前のCバージョンのObAccessExceptionHandler_tは、例外コードのみを戻し、完全な例外を戻さないため、お薦めしません。したがって、ObAccessException_getCodeStringは、例外メッセージに例外パラメータ・データを挿入することはできません。

アクセス・ゲートの新バージョンの例外ハンドラでは、Access Manager APIのC実装を使用します。この新バージョンの例外ハンドラであるObAccessExceptionHandler2_tは完全な例外を戻すため、ObAccessException_toStringは、埋込みパラメータも挿入した例外メッセージを表示できます。アクセス・ゲートを作成する場合、以前のバージョンではなく、必ずObAccessExceptionHandler2_tを使用してください。

例外ハンドラの最善の作成方法を次に示します。

void myExceptionHandler(ObAccessException e){
  printf("EXCEPTION: %s\n", ObAccessException_toString(e));
  exit(1);
}

次の行は、APIに例外の名前を通知します(つまり、コールバック関数を登録します)。

 ObAccessException_setHandler2(myExceptionHandler);

4.8.7.2 関数(ObAccessException、C)

表4-37に、ObAccessExceptionクラスのC実装の関数と詳細をリストします。

表4-37 ObAccess.ObAccessException_t疑似クラスの関数(C)

パラメータ 詳細

ObAccessExceptionHandler2_t

typedef void (*ObAccessExceptionHandler2_t) (ObAccess ExceptionCode_t exception)。これは実際には関数ではありません。正確には、API内部で使用されるC++関数へのポインタを定義するものです。この定義の実装には、独自のコードを使用します。「C言語のエラー・ハンドラ」を参照してください。

パラメータ:

なし。正確には、指定したポインタ名がObAccessException_setHandler2関数に渡され、例外が発生したときに他の関数によって自動的に使用されます。この関数にあるexception引数には、APIによって生成される例外が入ります。

ObAccessException_setHandler2

void ObAccessException_setHandler(ObAccessException Handler2_t handler)は、ユーザーが自分で作成する例外ハンドラに組み込んだ任意のアクティビティに、例外処理を接続します。

パラメータ:

handler: ユーザー作成の例外ハンドラ関数へのポインタ。

ObAccessException_getCode

ObAccessExceptionCode_t ObAccessException_getCode (ObAccessException_t e)は、APIによって生成される完全な例外に対応するエラー・コードを戻します。

パラメータ:

e: APIによって戻される例外。

ObAccessException_getParameter

const char *ObAccessException_getParameter (ObAccessException_t e, int which)は、指定された例外および部分文字列のインデックス(1から5)に対応するテキスト部分文字列を戻します。

パラメータ:

e: APIによって戻される例外。

which: 相当するテキスト文字列が必要なパラメータのインデックス(1から5)。

ObAccessException_toString

const char *ObAccessException_toString(ObAccessException_t e)は、API内で最後に生成されたエラー・コードに対応する完全エラー・メッセージ文字列(該当するすべての部分文字列が挿入済)を戻します。このため、メッセージの報告を可能にするには、戻り値を解放しないでください。

パラメータ:

e: APIによって戻される例外。


4.8.8 ObDiagnostic(C)

ObDiagnosticクラスを使用すると、アクセス・サーバーの名前、ポート、ロケーション、アクセス・ゲートとアクセス・サーバーの接続数といった診断情報を表示できます。このクラスは、アクセス・サーバーに関連付けられているディレクトリの診断情報も表示します。

例:

OBDLLEXPORT const ObMap_t ObDiagnostic_getServerDiagnosticInfo();
OBDLLEXPORT const ObMap_t ObDiagnostic_getDirectoryDiagnosticInfo();
OBDLLEXPORT const ObMap_t ObDiagnostic_getClientDiagnosticInfo();

4.8.8.1 メソッド(ObDiagnostic、C)

表4-38に、ObDiagnosticのC実装のメソッドをリストします。

表4-38 ObDiagnosticのメソッド(C)

パラメータ 詳細

getServerDiagnosticInfo()

このパラメータは、ObMap構造体上の次の項目を戻します。

  • アクセス・サーバーのホスト名

  • アクセス・サーバーのポート

  • 現在のWebGateによって確立されたアクセス・サーバーとの接続数

  • アクセス・サーバーの状態(起動中または停止中)

  • アクセス・サーバー・インストールの作成日時

  • アクセス・サーバーのインストール・ディレクトリ

  • このアクセス・サーバーに許容されるスレッドの最大数

getDirectoryDiagnosticInfo()

このパラメータは、次の項目を戻します。

  • ディレクトリ・タイプ(Config、User、Policy)

  • ディレクトリのホスト

  • ディレクトリのポート

  • ディレクトリの状態(起動中または停止中)

  • 優先度(プライマリまたはセカンダリ)

  • モード(openまたはSSL)

  • サイズ制限(検索結果の最大数)

  • 時間制限(タイムアウトしきい値)

  • ログインDN

  • 作成日時(アクセス・サーバーがDirectory Serverとの接続を確立した時間)。(どちらかのサーバーを再起動すると、作成日時は変更されます。)


4.9 C#実装の詳細

次の各項では、Access Manager APIのC#(.NET)マネージ・コード実装について説明します。

大部分に関しては、C#版の各クラスは、Access Manager APIのJava実装で確立されたパターンを踏襲しています。ただし、C#版は、次のような重要な点でJavaパラダイムから逸脱しています。

このドキュメントに記載のリストは、ヘッダー・ファイルのobaccess_api_mgd.hにもあります。このファイルは次のロケーションにあります。

SDK_install_dir/include

Access Manager APIとポリシー・マネージャAPIの両者に共通のクラスは、obaccess_api_common_mgd.hファイルにリストされています。このファイルもSDK_install_dir/includeディレクトリにあります。

4.9.1 ObDictionary

ObDictionaryは、キーと値のペア(Javaハッシュテーブルに含まれる名前と値のペアに対する.NET版の等価物)を書き込めるハッシュテーブルを提供します。このクラスには、ディクショナリ・ハッシュテーブルから情報の取得、そのリスト内の項目数の確認、およびリストのコピーができるメソッドもあります。

ObDictionaryクラスは.NET IDictionaryクラスから導出され、Access Manager APIのJavaとC++実装のObMapクラスに対応しています。Access Manager APIのC実装のObMap_t疑似クラスにも対応しています。ObMapクラスの概要については、「ObMap」を参照してください。

ObDictionaryのC#実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.9.1.1 コンストラクタ(ObDictionary、C#)

表4-39で、ObDictionaryのコンストラクタについて説明します。

表4-39 ObDictionaryのコンストラクタ(C#)

主なパラメータ 詳細

(なし)

ObDictionary()

map

ObDictionary(const ObMap &map)は、ユーザーが指定する名前を使用して、既存リストのコピーをObDictionaryオブジェクトの形式で作成します。

パラメータ:

map: コピー元リストの名前。


4.9.1.2 メソッド(ObDictionary、C#)

表4-40に、ObDictionaryメソッドとその詳細を示します。

表4-40 ObDictionaryのメソッド(C#)

メソッド 詳細

get_Item

__property virtual System::Object *get_Item(System::Object *key)は、指定された名前に対応する、ディクショナリ・リスト内の文字型の値を戻します。リスト内に名前が見つからなかった場合、NULLが戻されます。この項目は、ベース・クラス・オブジェクトとして戻されます。ユーザーは、この項目を該当の型にキャストする必要があります。

パラメータ:

key: ディクショナリ・リスト内のキー(または名前)。これに対応する値が戻されます。

add

virtual void Add (System::Object *key, System::Object *value)は、キーと値のペアをリストに格納します。リストに名前がすでにある場合は、その値が置換されます。ない場合はペアが追加されます。

パラメータ:

key: ディクショナリに格納する項目の名前部分。

value: 格納する項目の値部分。

get_Count

__property int get_Count()は、リストに含まれるキーと値のペアの合計数を戻します。

Clone

Object *Clone()は、ObDictionaryのコピーを作成します。

戻り: コピーへのポインタ。


4.9.2 ObDictionaryEnumerator

ObDictionaryEnumeratorクラスは、ディクショナリ・ハッシュテーブルにおけるエントリの位置を確認するために使用します。そのリスト内の項目数を確認したり、リスト内の特定の位置にあるキーと値のペアを取得することもできます。

C++管理クラス・バージョンのAccess Manager APIのObMapIteratorクラスは、.NET Frameworkクラス・ライブラリ内のIDictionaryEnumeratorクラスから導出されるObDictionaryEnumeratorクラスとして実装されています。Javaハッシュテーブルには名前と値のペアがあるのに対して、ObDictionaryEnumeratorディクショナリにはキーと値のペアがあります。

ObMapIteratorクラスの概要については、「ObMapIterator」を参照してください。

ObDictionaryEnumeratorのC#実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.9.2.1 コンストラクタ(ObDictionaryEnumerator、C#)

表4-41で、ObDictionaryEnumeratorのコンストラクタについて説明します。

表4-41 ObDictionaryEnumeratorのコンストラクタ(C#)

主なパラメータ 詳細

dictionary

ObDictionaryEnumerator(ObDictionary *dict)は列挙子を作成します。この列挙子は、当初は、指定されたObDictionaryハッシュテーブル内の最初の項目をポイントします。MoveNextなど、ObDictionaryEnumeratorのメソッドがこの構造体を利用します。

パラメータ:

dict: ObDictionaryハッシュテーブルの名前。このテーブル内の項目を順次ポイントしていきます。


4.9.2.2 メソッド(ObDictionaryEnumerator、C#)

表4-42に、ObDictionaryEnumeratorのメソッドとその詳細をリストします。

表4-42 ObDictionaryEnumeratorのメソッド(C#)

メソッド 詳細

MoveNext

bool MoveNext()は、リスト末尾に到達していないかどうかを監視します。ディクショナリ・リストにキーと値のペアが残っている場合は、ObTrueを戻します。リストの最後の項目に到達するとObFalseを戻します。

get_Current

__property Object *get_Current()は、列挙子によって現在参照されているディクショナリ・エントリを示すオブジェクトを戻します。

get_Entry

__property DictionaryEntry get_Entry()は、現在のディクショナリ・エントリのキーと値のペアを戻します。

get_Key

__property Object *get_Key()は、現在のディクショナリ・エントリのキー(名前)値を戻します。ユーザーは、戻されたオブジェクトを正しいクラスにキャストする必要があります。

get_Value

__property Object *get_Value()は、現在のディクショナリ・エントリの値を戻します。ユーザーは、戻されたオブジェクトを正しいクラスにキャストする必要があります。

Reset

void Reset()を実行すると、列挙子はディクショナリ・リストの最初のエントリをポイントするようにリセットされます。


4.9.3 ObAuthenticationSchemeMgd

ObAuthenticationSchemeMgd構造体を使用すると、ユーザーは認証スキームに関連する情報を格納、引渡し、取得できます。つまり、認証スキームで、一連の資格証明をユーザーに要求する方法を指定するのです。ObAuthenticationSchemeクラスの概要については、「ObAuthenticationScheme」を参照してください。

ObAuthenticationSchemeMgdのC#実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.9.3.1 コンストラクタ(ObAuthenticationSchemeMgd、C#)

表4-43で、ObAuthenticationSchemeMgdのコンストラクタについて説明します。

表4-43 ObAuthenticationSchemeMgdのコンストラクタ(C#)

主なパラメータ 詳細

pRes

ObAuthenticationSchemeMgd(ObResourceRequestMgd *pRes)は、指定されたObResourceRequestに対してObAuthenticationSchemeオブジェクトを作成します。

パラメータ:

pRes: 認証スキーム・オブジェクトの作成対象となるリクエスト先リソースへのポインタ。

戻り: リクエスト先リソース・オブジェクトを格納する構造体。


4.9.3.2 メソッド(ObAuthenticationSchemeMgd、C#)

表4-44に、ObAuthenticationSchemeMgdクラスのメソッドとその詳細をリストします。

表4-44 ObAuthenticationSchemeMgdのメソッド(C#)

メソッド 詳細

get_Name

__property System::String *get_Name()は、認証スキームに割り当てられている表示名を戻します。

get_Mask

__property int get_Mask()は、認証スキームのセキュリティ・レベルを定義するマスク・バイトを戻します。

get_RequiresSecureTransport

__property bool get_RequiresSecureTransport()は、認証スキームによりSSLクライアント接続が要求されている場合はObTrueを戻します。要求されていない場合はObFalseを戻します。戻りフラグがObTrueの場合、SSLを実現するにはredirectUrlが必要です。

get_IsBasic

__property bool get_IsBasic()は、認証スキームによりHTTP Basicチャレンジ・メソッドのみが要求されている場合(つまりユーザーIDとパスワードのみが要求されている場合)はObTrueを戻します。それ以外の場合はObFalseを戻します。

get_IsCertificate

__property bool get_IsCertificate()は、認証スキームによりデジタル・セキュリティ証明が要求されている場合はObTrueを戻し、要求されていない場合はObFalseを戻します。

get_IsForm

property bool get_IsForm()は、認証スキームでHTMLフォームのログインが使用される場合(つまり、カスタマ定義の資格証明フィールドを使用する場合)はObTrueを戻し、そうでない場合はObFalseを戻します。

get_IsNone

__property bool get_IsNone()は、認証で資格証明が要求されない場合にObTrueを戻します。資格証明が要求される場合はObFalseを戻します。

get_Level

__property int get_Level()は、認証スキーム構成中に指定された認証強度のレベルを示す数値を戻します。

get_RedirectUrl

__property System::String *get_RedirectUrl()は、SSL認証を行うためのクライアントのリダイレクト先URLを示す文字列を戻します。

getChallengeParameter

System::String *getChallengeParameter(System::String *parameterName)は、現在のチャレンジ・メソッドのパラメータの値を戻します。たとえば、「フォーム」チャレンジ・メソッドのcredsパラメータは、コンテキスト依存ログイン・リクエストのスペース区切りリストを取得します。個別のパラメータ名を取得するには、このリストを解析する必要があります。

パラメータ:

parameterName: 現在のチャレンジ・メソッドのパラメータの名前。

get_AllChallengeParameters

__property ObDictionary *get_AllChallengeParameters()は、認証スキームに割り当てられている各チャレンジ・パラメータのキーと値のペアが含まれたObDictionaryリストを戻します。

get_NumberOfChallengeParameters

__property int get_NumberOfChallengeParameters()は、認証スキームに構成中に割り当てられたチャレンジ・パラメータの合計数を戻します。

Clone

Object *Clone()は、指定された認証スキーム構造体のコピーを作成します。


4.9.4 ObResourceRequestMgd

ObResourceRequestMgdクラスのコンストラクタとメソッドを使用すると、ユーザーのリソース・アクセス・リクエストを表す構造体を作成したり、その構造体とやり取りできます。ObResourceRequestクラスの概要については、「ObResourceRequest」を参照してください。

ObResourceRequestMgdのC#実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.9.4.1 コンストラクタ(ObResourceRequestMgd、C#)

表4-45に、ObResourceRequestMgdのコンストラクタとその詳細をリストします。

表4-45 ObResourceRequestMgdのコンストラクタ(C#)

主なパラメータ 詳細

op

ObResourceRequestMgd(System::String *resType, System::String *res, System::String *op)は、ObResourceRequestオブジェクトを作成します。

パラメータ:

resType: リソース・タイプ。(resTypeがNULLの場合は、HTTPがデフォルトとして使用されます。)

res: リソースの名前。

op: 実行する操作。

戻り: ObResourceRequestオブジェクトを表す構造体。

parameters

ObResourceRequestMgd(System::String *resType, System::String *res, System::String *op, ObDictionary *parameters)は、ObResourceRequestオブジェクトを作成します。

パラメータ:

resType: リソース・タイプ。(resTypeがNULLの場合は、HTTPがデフォルトとして使用されます。)

res: リソースの名前。

op: 実行する操作。

parameters: 使用するパラメータ・リストへのポインタ。

戻り: ObResourceRequestオブジェクトを表す構造体。


4.9.4.2 メソッド(ObResourceRequestMgd、C#)

表4-46に、ObResourceRequestMgdのメソッドとその詳細をリストします。

表4-46 ObResourceRequestMgdのメソッド(C#)

メソッド 詳細

get_ResourceType

__property System::String *get_ResourceType()は、リクエストのリソース・タイプを示す文字列を戻します。

get_Resource

__property System::String *get_Resource()は、リクエストのリソース名を戻します。

get_Operation

__property System::String *get_Operation()は、リクエストされた操作の名前を戻します。

get_Parameters

__property ObDictionary *get_Parameters()は、パラメータ・リスト内にある最初のキーと値のペアへのポインタを戻します。

get_NumberOfParameters

__property int get_NumberOfParameters()は、リスト内にあるペアの数を戻します。

get_IsProtected

__property bool get_IsProtected()は、リソースがアクセス・システムのポリシーで保護されている場合はObTrueを戻し、保護されていない場合はObFalseを戻します。

スローする例外: アクセス・サーバーとの接続障害など致命的エラーが発生した場合は、ObAccessExceptionをスローします。

get_AuthorizationParameters

__property ObDictionary *get_AuthorizationParameters()。必要なコンテキスト・データのリストがIsAuthorizedへのレスポンスに含まれている場合、このリストが、isAuthorized()コールに指定するObResourceRequestオブジェクトにキャッシュされます。アクセス・ゲートは、get_AuthorizationParametersメソッドを使用して、このリストを取得できます。アクセス・ゲートは該当の値を追加して、ObDictionaryを後続のisAuthorizedコールに渡します。コール元は、get_AuthorizationParametersが戻したObDictionaryオブジェクトの割当てを解除するには、deleteを使用する必要があります。

戻り: キーと値(NULL値)のペアのリスト。

get_NumberOfAuthorizationParameters

__property int get_NumberOfAuthorizationParameters()は、必要なコンテキスト・データ項目の数を戻します。


4.9.5 ObUserSessionMgd

ObUserSessionを使用すると、認証に成功したユーザーのセッションを表す構造体を作成したり、その構造体とやり取りできます。ObUserSessionの概要については、「ObUserSession」を参照してください。

ObUserSessionMgdのC#実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.9.5.1 コンストラクタ(ObUserSessionMgd、C#)

表4-47で、ObUserSessionMgdのコンストラクタについて説明します。

表4-47 ObUserSessionMgdのコンストラクタ(C#)

主なパラメータ 詳細

sessionToken

UserSessionMgd(System::String *sessionToken)は、ユーザー・セッション・オブジェクトを即時に作成します。

パラメータ:

sessionToken: 資格証明とロケーション情報を取得するために解析されるASCIIテキスト文字列。

戻り: ユーザー・セッション・オブジェクトを格納する構造体。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはsessionToken値がNULLの場合、ObAccessExceptionをスローします。

lazyload

ObUserSessionMgd::ObUserSessionMgd(string sessionToken, bool lazyload)は、ユーザー・セッションをリクエスト・ベースで作成します。

パラメータ:

lazyload: このフラグは、trueの場合、セッション・トークンを即時ロードしないことを指定します。sessionTokenの情報が無効の場合、getUserIdentity()、getLocation()、getLevel()、getStartTime()およびgetEndTime()の各関数に基づいてコールを行い、トークンをリクエスト・ベースでロードします。

戻り: ユーザー・セッション・オブジェクト。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはsessionTokenがNULLの場合、内部生成されたObAccessExceptionMgdをスローします。

credentials

ObUserSessionMgd(ObResourceRequestMgd *pRes, ObDictionary *credentials)は、ユーザー・セッション・オブジェクトを作成します。

パラメータ:

pRes: リクエストするリソース・オブジェクト。

credentials: ユーザーの資格証明。

戻り: ユーザー・セッション・オブジェクトを格納する構造体。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはリソース・オブジェクトがNULLの場合、ObAccessExceptionをスローします。

location

ObUserSessionMgd(ObResourceRequestMgd *pRes, ObDictionary *credentials, System::String *location)は、ユーザー・セッション・オブジェクトを作成します。

パラメータ:

pRes: リソースの名前。

credentials: ユーザーの資格証明。

location: ユーザーのロケーション(指定が必要な場合)。ユーザー・マシンのロケーションを指定するには、有効なDNS名またはIPアドレスを使用できます。

戻り: ユーザー・セッション・オブジェクト。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはリソース・オブジェクトがNULLの場合、ObAccessExceptionをスローします。


4.9.5.2 メソッド(ObUserSessionMgd、C#)

表4-48に、ObUserSessionMgdクラスのメソッドとその詳細をリストします。

表4-48 ObUserSessionMgdのメソッド(C#)

メソッド 詳細

get_UserIdentity

__property System::String *get_UserIdentity()は、ユーザー・ディレクトリ内にあるユーザーのプロファイル・エントリの識別名を戻します。

get_Location

__property System::String *get_Location()は、ユーザーのロケーションを戻します。ユーザー・マシンのロケーションを指定するには、有効なDNS名またはIPアドレスを使用できます。

getAction

System::String *getAction(System::String *actionType, System::String *name)は、指定されたアクションの名前とタイプに対応するアクションを戻します。

パラメータ:

actionType: 戻すアクションのタイプ。これをNULLのままにしておくと、デフォルトはheaderVarになります。

name: アクションの名前。これに対応する値が戻されます。

戻り: アクションを表す文字列。

getActions

ObDictionary *getActions(System::String *actionType)は、指定したアクション・タイプに対して、アクションの名前と値からなるObDictionaryリストを戻します。

パラメータ:

actionType: リストを戻すアクションのタイプ。これをNULLのままにしておくと、デフォルトはheaderVarになります。

get_ActionTypes

__property System::String *get_ActionTypes()は、すべてのアクション・タイプを示す文字列へのポインタからなる配列を戻します。この配列はNULLポインタで終了します。

getNumberOfActions

int getNumberOfActions(System::String *actionType)は、現在のユーザー・セッションに関連付けられたアクションのうち、指定アクション・タイプに属するアクションの合計数を戻します。

パラメータ:

actionType: アクションの件数を戻す必要があるアクション・タイプの名前。これをNULLのままにしておくと、デフォルトはheaderVarになります。

get_Level

_property int get_Level()は、現在の認証スキームのレベルを示す数値を戻します。

get_StartTime

__property int get_StartTime()は、1970年1月1日午前0時から、ユーザーが認証された時間までの秒数を戻します。セッションの有効期限を計算するために使用されます。

get_LastUseTime

__property int get_LastUseTime()は、1970年1月1日午前0時からユーザーのリクエストが認可されたときに設定された時間までの秒数を戻します。アイドル・セッションの有効期限を計算するために使用されます。

get_Status

__property ObUserStatusMgd *get_Status()は、セッションのステータスを示すObUserStatus_t型の値(LOGGEDOUT、LOGGEDIN、LOGINFAILED、EXPIRED)の1つを戻します。

get_Error

__property ObUserError_t get_Error()は、最後の認証または認可により判定されたObUserError_t型エラー値のいずれかを戻します。

get_ErrorMessage

__property System::String *get_ErrorMessage()は、認証または認可の失敗に関する詳細エラー・メッセージを戻します。このメッセージのテキストは、Access APIから取得し、ユーザーが変更することはできません。

IsAuthorized

bool IsAuthorized(ObResourceRequestMgd *pRes)は、ユーザーが特定のリソースに対して操作を実行することが認可されているかどうかを確認します。

パラメータ:

pRes: 認可チェック対象とするリソース・オブジェクト。

戻り: 認可が成功した場合はObTrue、それ以外の場合はObFalse。

スローする例外: なんらかの理由により認可チェックで失敗した場合に、ObAccessExceptionMgdをスローします。

IsAuthorizedWithParameters

bool IsAuthorizedWithParameters(ObResourceRequestMgd *pRes, ObDictionary *parameters)は、ユーザーが特定のリソースに対して操作をリクエストすることが認可されているかどうかを確認します。parameters引数はオプションです。指定すると、parameters内のキーと値のペアがアクセス・サーバーに渡されます。

パラメータ:

pRes: 認可チェック対象とするリソース・オブジェクト。

parameters: リクエスト・コンテキスト・オブジェクトの一部としてアクセス・サーバーに送信するキーと値のペアのリスト。

戻り: 認可が成功した場合はObTrue、それ以外の場合はObFalse。

スローする例外: なんらかの理由により認可チェックで失敗した場合に、ObAccessExceptionをスローします。

get_SessionToken

__property System::String *get_SessionToken()は、暗号化して保存されたユーザー・セッションのASCII表現を戻します。

戻り: ユーザー・セッションを表すASCII文字列。

LogOff

void LogOff()は、認証済のユーザーをログオフして、セッションを終了します。


4.9.6 ObConfigMgd

ObConfigMgdを使用すると、アプリケーションは、アクセス・サーバーの初期化や停止、あるいはアクセス・サーバーからのアクセス・ゲート構成データの取得を行うことができます。

アクセス・ゲート構成項目のリストは、「構成パラメータ」を参照してください。

ObConfigクラスの概要については、「ObConfig」を参照してください。

ObConfigMgdのC#実装がエラーに呼応してスローするメッセージのリストについては、「Cファミリのステータス・メッセージとエラー・メッセージの文字列」を参照してください。

4.9.6.1 コンストラクタ(ObConfigMgd、C#)

このクラスのC++実装には、コンストラクタはありません。

4.9.6.2 メソッド(ObConfigMgd、C#)

表4-49に、ObConfigMgdクラスのメソッドとその詳細をリストします。

表4-49 ObConfigMgdのメソッド(C#)

メソッド 詳細

initialize

static void initialize(System::String *configDir)はアクセス・ゲートを初期化し、「構成パラメータ」に記載の構造体にすべてのパラメータを読み取ります。

パラメータ:

configDir: コード化済の値をこのパラメータに指定しない場合は、環境変数OBACCESS_INSTALL_DIRの値が使用されます。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはOBACCESS_INSTALL_DIRが無効の場合、ObAccessExceptionをスローします。

shutdown

static void shutdown()は、アクセス・ゲートをアクセス・サーバーから切断し、メモリーやその他のリソースを解放します。

getItem

static System::String *getItem(System::String *name)は、ObDictionaryハッシュテーブル内のキーと値のペアから、指定したキーに対応する値を戻します。指定可能な項目のリストは、「構成パラメータ」を参照してください。

パラメータ:

name: ディクショナリ・リスト内の構成項目の名前。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionがスローされます。

get_AllItems

__property static ObDictionary *get_AllItems()は、構成ファイル内のすべての構成変数を、指定されたObDictionaryのキーと値のディクショナリ・リストに読み取ります。指定可能な項目のリストは、「構成パラメータ」を参照してください。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionMgd例外がスローされます。

get_NumberOfItems

__property static int get_NumberOfItems()は、構成ファイルから抽出された項目の合計数を戻します。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionMgd例外がスローされます。

get_SDKVersion

__property static System::String *get_SDKVersion()は、APIが認識できる内部値としてのSDKバージョンを戻します。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionMgd例外がスローされます。

get_NAPVersion

__property static System::String *get_NAPVersion()は、Access Manager APIで使用するアクセス制御プロトコルのバージョンを示す文字列を戻します。これは、APIに認識される内部値です。

スローする例外: 初期化が成功する前にこのメソッドを起動しようとすると、ObAccessExceptionMgd例外がスローされます。


4.9.7 ObAccessExceptionMgd

このクラスを使用すると、Access Manager APIがエラーに呼応してスローしたエラー・メッセージ文字列全体を抽出できます。あるいは、場合により完全エラー・メッセージに埋め込まれる1つ以上(最大5つ)のインデックス付きの部分文字列を、完全エラー・メッセージから抽出することもできます。

ObAccessExceptionクラスの概要については、「ObAccessException」を参照してください。

4.9.7.1 コンストラクタ(obAccessExceptionMgd、C#)

表4-50に、ObAccessExceptionMgdクラスのコンストラクタと関連詳細をリストします。

表4-50 ObAccessExceptionMgdのコンストラクタ(C#)

パラメータ 詳細

ex

ObAccessExceptionMgd(ObAccessException *ex)は、ObAccessExceptionで渡された値を占有し、その値が使用しているメモリーをクリーンアップします。

パラメータ:

ex: ObAccessException。


4.9.7.2 メソッド(ObAccessExceptionMgd、C#)

表4-51で、ObAccessExceptionMgdのメソッドについて詳細をリストします。

表4-51 ObAccessExceptionMgdのメソッド(C#)

メソッド 詳細

get_Code

__property ObAccessExceptionCode_t get_Code()は、APIで最後に生成されたエラー・コードの値を戻します。

getParameter

System::String *getParameter(int index)は、完全エラー・メッセージ内で%indexの位置に表示される部分文字列のみを戻します。これにより、ロギングされるメッセージとして、カスタマイズしたテキストとともに挿入するために大部分の場合使用される、特定の部分文字列を取得できます。

パラメータ:

index: APIによって生成される通常のメッセージにおける部分文字列(パラメータ)の位置。

get_String

__property System::String *get_String()は、APIで最後に生成されたエラー・コードに対応するエラー・メッセージ文字列を戻します。これは、APIによって定義されたメッセージ全体を取得して、そのままエラー・ログに挿入するために使用される場合がほとんどです。このため、戻り値は解放しないでください。

getCodeString

System::String *getCodeString(ObAccessExceptionCode_t code)は、指定されたエラー・コードに対応するエラー・メッセージ文字列を戻します。したがって、これはAPI内で生成された最後のメッセージである必要はありません。部分文字列(パラメータ)のポインタはすべてNULLに設定されるので、部分文字列(パラメータ)が挿入されずにObAccessGate.msgファイルのテキストがそのまま戻されます。このため、戻り値は解放しないでください。

パラメータ:

code: 検索するエラー・メッセージ文字列に対応するエラー番号。

戻り: 指定されたエラーに対応する、ObAccessGate.msgファイル内のテキストそのもの。


4.9.8 ObDiagnostic(C#)

ObDiagnosticクラスを使用すると、アクセス・サーバーの名前、ポート、ロケーション、アクセス・ゲートとアクセス・サーバーの接続数といった診断情報を表示できます。このクラスは、アクセス・サーバーに関連付けられているディレクトリの診断情報も表示します。

例:

public __gc class ObDiagnosticMgd {public: __property static ObDictionary *get_ServerDiagnosticInfo();
__property static ObDictionary *get_DirectoryDiagnosticInfo();__property static ObDictionary *get_ClientDiagnosticInfo(); };

4.9.8.1 メソッド(ObDiagnostic、C#)

表4-52に、ObDiagnosticのC#実装のメソッドをリストします。

表4-52 ObDiagnosticのメソッド(C#)

パラメータ 詳細

getServerDiagnosticInfo()

このパラメータは、ObMap構造体上の次の項目を戻します。

  • アクセス・サーバーのホスト名

  • アクセス・サーバーのポート

  • 現在のWebGateによって確立されたアクセス・サーバーとの接続数

  • アクセス・サーバーの状態(起動中または停止中)

  • アクセス・サーバー・インストールの作成日時

  • アクセス・サーバーのインストール・ディレクトリ

  • このアクセス・サーバーに許容されるスレッドの最大数

getDirectoryDiagnosticInfo()

このパラメータは、次の項目を戻します。

  • ディレクトリ・タイプ(Config、User、Policy)

  • ディレクトリのホスト

  • ディレクトリのポート

  • ディレクトリの状態(起動中または停止中)

  • 優先度(プライマリまたはセカンダリ)

  • モード(openまたはSSL)

  • サイズ制限(検索結果の最大数)

  • 時間制限(タイムアウトしきい値)

  • ログインDN

  • 作成日時(アクセス・サーバーがDirectory Serverとの接続を確立した時間)。(どちらかのサーバーを再起動すると、作成日時は変更されます。)


4.10 Java実装の詳細

Access Manager APIを実装したJavaパッケージは、次で構成されます。

これらのクラスのすべてによりjava.lang.cloneableインタフェースが実装され、ObConfig以外のすべてのクラスとObAccessExceptionにより、対応するCom.Oblix.Accessインタフェースが実装されます。

Access Manager APIのクラスの概要については、「Access Manager APIの概要」を参照してください。


注意:

Java Garbage Collectionは、不要になったAccess Manager APIオブジェクトのメモリーを自動的に割当て解除します。4種類のAccess Manager APIの実装におけるメモリーの管理方法については、「メモリー管理の概要」を参照してください。

4.10.1 インタフェース

Javaプログラミング言語では、インタフェースとは、メソッドが含まれた特別なクラスのことですが、インタフェースにはそれらのメソッドの実装に使用されたコードは含まれていません。インタフェース内には、オブジェクトを作成したり変数をインスタンス化することはできません。そのかわりとして、インタフェース内のメソッドが1つ以上の実装クラスに継承されます。通常、各ベース・クラスがインタフェースからメソッドを継承して実装しますが、メソッドを実装したベース・クラスは兄弟関係のベース・クラスと識別されます。

ただし現在、同一の実装クラスが、Access Manager APIにある3つのインタフェースにそれぞれあります。したがって、Access Manager APIにはポリモフィズムが登場する場面はありません。

各インタフェースの名前は、それを実装した専用の実装クラスの名前の最後に「Interface」を付加したものです。したがって、ObAuthenticationSchemeベース・クラスにより実装されるインタフェースはObAuthenticationSchemeInterfaceとなります。

表4-53に、Access Manager APIにおけるインタフェースとそれに対応するベース・クラスを示します。

表4-53 Com.Oblix.AccessとJavaインタフェース実装の対応

実装クラスであるObAccessベース・クラス 対応するObAccessインタフェース

ObAccessException

なし

ObAuthenticationScheme

ObAuthenticationSchemeInterface

ObConfig

なし

ObResourceRequest

ObResourceRequestInterface

ObUserSession

ObUserSessionInterface


4.10.1.1 ObAuthenticationSchemeInterface

ObAuthenticationSchemeInterfaceには、リソースへのアクセスをリクエストしたユーザーを認証するために使用する構造体を作成および操作するためのメソッドがあります。このインタフェースのメンバー・メソッドは、いずれも直接には起動できません。かわりに、ObAuthenticationSchemeInterfaceを実装するベース・クラスであるObAuthenticationSchemeの対応メンバー・メソッドを起動します。

メソッド

ObAuthenticationSchemeInterfaceには、メソッドとしてgetName()、requiresSecureTransport()、isBasic()、isCertificate()、isForm()、isNone()、getLevel()、getRedirectUrl()、getNumberOfChallengeParameters()、getAllChallengeParameters()およびgetChallengeParameter()が含まれています。「ObAuthenticationScheme」を参照してください。

4.10.1.2 ObResourceRequestInterface

ObResourceRequestInterfaceには、指定リソースへのユーザー・アクセス・リクエストを表す構造体を操作するためのメソッドがあります。このインタフェースのメンバー・メソッドは、いずれも直接には起動できません。かわりに、ObResourceRequestInterfaceを実装するベース・クラスであるObResourceRequestの対応メンバー・メソッドを起動します。

メソッド

ObResourceRequestInterfaceには、メソッドとしてisProtected()、getResourceType()、getResource()、getOperation()、getParameters()およびgetAuthorizationParameters()が含まれています。「ObResourceRequest」を参照してください。

4.10.1.3 ObUserSessionInterface

ObUserSessionInterfaceには、ユーザー・セッションを表す構造体を作成および操作するためのメソッドがあります。このインタフェースのメンバー・メソッドは、いずれも直接には起動できません。かわりに、ObUserSessionInterfaceを実装するベース・クラスであるObUserSessionの対応メンバー・メソッドを起動します。

メソッド

ObUserSessionInterfaceには、メソッドとしてgetUserIdentity()、getLevel()、getLocation()、setLocation()、getStartTime()、getLastUseTime()、getNumberOfActions()、getActions()、getAction()、getActionTypes()、getStatus()、getError()、getErrorMessage()、getSessionToken()およびlogoff()が含まれています。「ObUserSession」を参照してください。

4.10.2(java.util.Hashtable)

Access Manager APIのJava実装には、API関連のパラメータを格納および操作するための独自のクラスは含まれていません。この処理は、APIのC++実装ではObMapとObMapIteratorで行います。C実装でこれを行う等価なクラスは、それぞれObMap_tとObMapIteratorです。C#実装で等価なのは、それぞれObDictionaryとObDictionaryEnumeratorです。

これに対して、Java実装は標準Javaクラスのjava.util.Hastableを使用して、この機能領域に相当する機能を実現します。ObMapとObMapIteratorについては、「実装間の比較」を参照してください。

4.10.2.1 コンストラクタ(java.util.Hashtable、Java)

次に、java.util.Hashtableのコンストラクタを記載します。このコンストラクタは、Com.Oblix.Accessに対応した関連のハッシュテーブル機能を提供します。このテーブルでは、ObMapとObMapIteratorクラスのCファミリ実装のコンストラクタに対応するコンストラクタのみがリストされています。

java.util.Hashtableのコンストラクタ(Java)

Hashtable()は、新規の空のハッシュテーブルを作成します。デフォルトの初期容量は11項目、ロード・ファクタは0.75です。(ハッシュテーブルのサイズは、最大容量の0.75を超えて格納されると自動的に増加します)。

4.10.2.2 メソッド(java.util.Hashtable、Java)

表4-54で、java.util.Hashtableのメソッドについて説明します。これらのメソッドは、Com.Oblix.Accessに対応した関連のハッシュテーブル機能を提供します。この表では、ObMapとObMapIteratorクラスのCファミリ実装のメソッドに対応するメソッドのみが説明されています。

表4-54 java.util.Hashtableのメソッド(Java)

メソッド 詳細

get

get()は、指定されたハッシュテーブル内の指定された項目の名前に対応する値を戻します。

put

put()は、指定されたハッシュテーブルに指定された名前と値のペアを挿入します。

size

size()は、指定されたハッシュテーブル内の項目数を戻します。

(コピー・コンストラクタ)

Hashtable(map_t)は、指定されたハッシュテーブルをコピーします。

パラメータ:

map_t: コピー元のハッシュテーブルの名前。


4.10.3 ObAuthenticationScheme

ObAuthenticationSchemeを使用すると、指定ユーザーがリクエストしたリソースに関連付けられている認証スキームを示す構造体を作成および操作できます。

ObAuthenticationSchemeの概要については、「ObAuthenticationScheme」を参照してください。

ObAuthenticationSchemeのJava実装がエラーに呼応してスローするメッセージのリストについては、「Javaのステータス・メッセージとエラー・メッセージのためのフィールド」を参照してください。

4.10.3.1 コンストラクタ(ObAuthenticationScheme、Java)

表4-55に、ObAuthenticationSchemeのコンストラクタを示します。

表4-55 Com.Oblix.Access.ObAuthenticationSchemeのコンストラクタ(Java)

主なパラメータ 詳細

res

public ObAuthenticationScheme(ObResourceRequest res)は、指定されたObResourceRequestに対してObAuthenticationSchemeオブジェクトを作成します。

パラメータ:

res: 認証スキーム・オブジェクトの作成対象となるリクエスト先リソース・オブジェクト。

スローする例外: オブジェクト作成の試行が失敗した場合、またはリソース・オブジェクトがNULLの場合、ObAccessExceptionをスローします。


4.10.3.2 メソッド(ObAuthenticationScheme、Java)

表4-56で、ObAuthenticationSchemeクラスに属するメソッドの詳細を説明します。cloneメソッドは、java.lang.Clonableインタフェースから対応メソッドを継承して実装したものです。setNativeHandleメソッドは、内部での使用専用として予約されています。ObAuthenticationScheme内のこれら以外のメソッドは、ObAuthenticationSchemeInterfaceまたはObAuthenticationSchemeのスーパークラスであるjava.lang.Objectから対応メソッドを継承して実装したものです。

表4-56 Com.Oblix.Access.ObAuthenticationSchemeのメソッド(Java)

メソッド 詳細

clone

public java.lang.Object clone()は、ObAuthenticationSchemeオブジェクトをクローニングします。

スローする例外: java.lang.CloneNotSupportedException。

getAllChallengeParameters

public java.util.Hashtable getAllChallengeParameters()は、指定の認証スキームに現在設定されているすべてのチャレンジ・パラメータを表す、名前と値のペアが含まれたハッシュテーブルを戻します。

getChallengeParameter

public java.lang.String getChallengeParameter(java.lang.String parameterName)は、指定の認証スキームに指定されているチャレンジ・パラメータ名の値を戻します。

パラメータ:

parameterName: チャレンジ・パラメータの名前。

getLevel

public int getLevel()は、指定の認証スキームに現在設定されている認証レベルを戻します。

getName

public java.lang.String getName()は、指定された認証スキームの表示名を戻します。

getNumberOfChallengeParameters

public int getNumberOfChallengeParameters()は、指定の認証スキームに現在設定されているチャレンジ・パラメータの数を戻します。

getRedirectUrl

public java.lang.String getRedirectUrl()は、セキュア認証のためにユーザーのブラウザがリダイレクトされるURLを戻します。

isBasic

public boolean isBasic()は、指定された認証スキームがBasicの場合(つまり、ユーザーIDとパスワードのみが要求されている場合)はtrueを戻し、それ以外の場合はfalseを戻します。

isCertificate

public boolean isCertificate()は、指定の認証スキームでデジタル証明が要求されている場合はtrueを戻し、要求されていない場合はfalseを戻します。

isForm

public boolean isForm()は、指定の認証スキームでHTTPフォーム・ベース認証が要求されている場合はtrueを戻し、要求されていない場合はfalseを戻します。

isNone

public boolean isNone()は、認証スキームに指定のチャレンジ・メソッドがない場合はtrueを戻します。チャレンジ・メソッドが指定されている認証スキームでリソースが保護されている場合は、falseを戻します。

requiresSecureTransport

public boolean requiresSecureTransport()は、認証スキームでセキュア接続が要求されている場合はtrueを戻し、要求されていない場合はfalseを戻します。

setNativeHandle

public void setNativeHandle(int nativeHandle)。ユーザーは、このメソッドを起動しないでください。このメソッドは、内部での使用専用として予約されています。

equals、getClass、hashCode、notify、notifyAll、toString、wait

左側のセルに記載のメソッドは、すべてスーパークラスjava.lang.ObjectからObAuthenticationSchemeに継承されたものです。


4.10.4 ObResourceRequest

このクラスを使用すると、ユーザーのリソース・アクセス・リクエストを表す構造体を作成、引渡し、取得することができます。ObResourceRequestの概要については、「ObResourceRequest」を参照してください。

ObResourceRequestのJava実装のメンバー・メソッドがエラーに呼応してスローするエラー・メッセージのリストについては、「Javaのステータス・メッセージとエラー・メッセージのためのフィールド」を参照してください。

4.10.4.1 コンストラクタ(ObResourceRequest、Java)

表4-57に、ObResourceRequestクラスのコンストラクタをリストします。

表4-57 Com.Oblix.Access.ObResourceRequestのコンストラクタ(Java)

主なパラメータ コンストラクタ

operation

public ObResourceRequest(java.lang.String resType, java.lang.String resName, java.lang.String operation)は、指定されたリソース・タイプ、名前、操作からなるObResourceRequestオブジェクトを作成します。

パラメータ:

resType: リクエストするリソースのタイプ。HTTP、EBJまたはユーザー定義リソース・タイプのいずれかを指定できます。この値がNULLの場合、デフォルト値はHTTPになります。

res: リクエストするリソースの名前。

operation: リソース・リクエスト・オブジェクトに対して実行する操作。これには、HTTPリソースの場合はGETやPOSTを、EJBリソースの場合はEXECUTEを指定できます。

スローする例外: ネイティブ・オブジェクト作成中にエラーが発生した場合、またはresNameまたはoperationパラメータがNULLの場合、ObAccessExceptionをスローします。

parameters

public ObResourceRequest(java.lang.String resType, java.lang.String resName, java.lang.String operation, java.util.Hashtable parameters)は、指定されたリソース・タイプ、名前、操作からなるObResourceRequestオブジェクトを作成します。parametersを引数として指定する場合には、リソースに現在割り当てられているすべての認可パラメータを含めたハッシュテーブルをコンストラクタに渡すことになります。アクセス・サーバーはこの情報を使用して、適用されるポリシーと認可の可否を判別します。

パラメータ:

resType: リクエストするリソースのタイプ。HTTP、EBJまたはユーザー定義リソース・タイプのいずれかを指定できます。この値がNULLの場合、デフォルト値はHTTPになります。

res: リクエストするリソースの名前。

operation: リソース・リクエスト・オブジェクトに対して実行する操作。これには、HTTPリソースの場合はGETやPOSTを、EJBリソースの場合はEXECUTEを指定できます。

parameters: リソースに現在割り当てられているすべての認可パラメータを含めたハッシュテーブル。

スローする例外: ネイティブ・オブジェクト作成中にエラーが発生した場合、またはresNameまたはoperationパラメータがNULLの場合、ObAccessExceptionをスローします。


4.10.4.2 メソッド(ObResourceRequest、Java)

表4-58に、ObResourceRequestクラスのメソッドと詳細をリストします。cloneメソッドは、Java.lang.Cloneableインタフェースから対応メソッドを継承して実装したものです。getNativeHandleメソッドは、内部での使用専用として予約されています。ObResourceRequest内のこれら以外のメソッドは、ObResourceRequestInterfaceインタフェースから、またはObResourceRequestのスーパークラスであるjava.lang.Objectから、対応メソッドを継承して実装したものです。

表4-58 Com.Oblix.Access.ObResourceRequestのメソッド(Java)

メソッド 詳細

isProtected

public boolean isProtected()は、ObResourceRequest構造体で指定されているリソースが保護されている場合はtrueを戻し、保護されていない場合はfalseを戻します。

getResourceType

public java.lang.String getResourceType()は、指定リソースのリソース・タイプを戻します。

getResource

public java.lang.String getResource()は、指定されたリソース・リクエスト・オブジェクトに含まれるリソースの名前を戻します。

getOperation

public java.lang.String getOperation()は、指定されたリソース・リクエスト・オブジェクトに含まれているリソースに対して実行される操作(HTTPの場合はGETやPOSTなど)の名前を戻します。

getParameters

public java.util.Hashtable getParameters()は、指定のリソース・リクエスト・オブジェクトに含めるリソースを定義するために設定されたすべてのパラメータの名前と値のペアが含まれたハッシュテーブルを戻します。

getAuthorizationParameters

public java.util.Hashtable getAuthorizationParameters()は、ハッシュテーブルを戻します。このハッシュテーブルは、指定のリソース・リクエスト・オブジェクトに含まれる、リソースの認可に必要とされるパラメータから構成されます。これらのパラメータの名前と値のペアの値部分は、すべてNULLに設定されています。つまり、ハッシュテーブルには、パラメータの名前のみが含まれています。

getNumberOfAuthorizationParameters

public int getNumberOfAuthorizationParameters()は、指定のリソース・リクエスト・オブジェクトに含まれる、リソースの認可に必要なパラメータの数を戻します。この合計数は、getAuthorizationParametersメソッドが戻すハッシュテーブルに含まれる項目数と等しくなります。

clone

public java.lang.Object clone()は、ObResourceRequestオブジェクトをクローニングします。

スローする例外: java.lang.CloneNotSupportedException。

equals、getClass、hashCode、notify、notifyAll、toString、wait

左側のセルに記載のメソッドは、すべてObResourceRequestのスーパークラスであるjava.lang.Objectから継承されたものです。


4.10.5 ObUserSession

ObUserSessionを使用すると、認証に成功したユーザーのセッションを表す構造体を作成したり、その構造体とやり取りできます。ObUserSessionの概要については、「ObUserSession」を参照してください。

続いて、次の項に、エラーに呼応してObUserSessionメソッドがスローするエラー・メッセージのリストを示します。

4.10.5.1 Javaのステータス・メッセージとエラー・メッセージのためのフィールド

次の表に、ObUserSessionクラスのコンストラクタとメソッドによりエラー発生時にスローされる、自己記述的なフィールド名をリストします。これらのフィールドを宣言するための構文は次のとおりです。

public static final int fieldname

ここで、fieldnameは、指定するステータス・メッセージ文字列を示します。

次の表に、ObUserSessionクラスのJava実装に関連するフィールドをリストします。最初の5個の定数フィールドはセッション状態に関するフィールド、残りはエラーに関するフィールドです。

次は、Com.Oblix.Access.ObUserSessionのフィールドです(Java)。

AWAITINGLOGIN
LOGGEDIN
LOGGEDOUT
LOGINFAILED
EXPIRED
OK
ERR_UNKNOWN
ERR_NO_USER
ERR_USER_REVOKED
ERR_WRONG_PASSWORD
ERR_INVALID_CERTIFICATE
ERR_AUTHN_PLUGIN_DENIED
ERR_INSUFFICIENT_LEVEL
ERR_NOT_LOGGED_IN
ERR_SESSION_TIMEOUT
ERR_IDLE_TIMEOUT
ERR_DENY
ERR_PASSWORD_EXPIRED
ERR_PASSWORD_CHANGE_ON_RESET
ERR_USER_LOCKED_OUT
ERR_NEED_MORE_DATA
ERR_INCONCLUSIVE
AWAITINGLOGIN = 0 SessionExpired SessionInvalid
DIAGNOSTICS_FAILED
UNKNOWN_CLIENT_ID
MODUSER_FAILED

次のステータス・コードは、セッションの期限が切れたことをクライアントに示すときに使用されます。

ObAAAStatus_SessionExpired = 70

次のステータス・コードは、セッションが無効であることをクライアントに示すときに使用されます。

SessionInvalid = 71,
SessionIdle = 72,
SessionTimeout = 73,
ModUserFailed = 74,
DBInfoUnavailable = 75

4.10.5.2 コンストラクタ(ObUserSession、Java)

表4-59に、ObUserSessionのコンストラクタ、そのパラメータおよび詳細をリストします。

表4-59 Com.Oblix.Access.ObUserSessionのコンストラクタ(Java)

パラメータ 詳細

NULL

public ObUserSession()は、ObUserSessionオブジェクトのデフォルト・コンストラクタです。

sessionToken

public ObUserSession(java.lang.String sessionToken)は、指定のセッション・トークンを使用してObUserSessionオブジェクトをただちに作成します。

パラメータ:

sessionToken: ユーザー・セッションの配列表現。

スローする例外: オブジェクトの作成が失敗した場合、またはセッション・トークンがNULLの場合は、ObAccessExceptionをスローします。

lazyload

public ObUserSession(java.lang.String sessionToken, boolean lazyload)は、ユーザー・セッションをリクエスト・ベースで作成します。

パラメータ:

lazyload: このフラグは、trueの場合、セッション・トークンを即時ロードしないことを指定します。sessionTokenの情報が無効の場合、getUserIdentity()、getLocation()、getLevel()、getStartTime()およびgetEndTime()の各関数に基づいてコールを行い、トークンをリクエスト・ベースでロードします。

戻り: ユーザー・セッション・オブジェクト。

スローする例外: なんらかの理由によりユーザー・セッション・オブジェクトを作成できない場合、またはsessionTokenがNULLの場合、内部生成されたObAccessExceptionをスローします。

location

public ObUserSession(ObResourceRequest res, java.util.Hashtable Credentials, java.lang.String location)は、指定されたリソースと資格証明を使用してユーザー・セッション・オブジェクトを作成します。

パラメータ:

res: リクエスト先リソース・オブジェクト。このリソースに対してユーザーを認証します。

credentials: ユーザー資格証明。ハッシュテーブル内で名前と値のペアという書式になっています。

location: ユーザーのロケーション(指定が必要な場合)。ユーザー・マシンのロケーションを指定するには、有効なDNS名またはIPアドレスを使用できます。

スローする例外: オブジェクトの作成が失敗した場合、またはセッション・トークンがNULLの場合は、ObAccessExceptionをスローします。

credentials

public ObUserSession(ObResourceRequest res, java.util.Hashtable Credentials)は、指定されたリソースと資格証明を使用して、ユーザー・セッション・オブジェクトを作成します。

パラメータ:

res: リソース・オブジェクト。このリソースに対してユーザーを認証します。

credentials: ユーザーの資格証明を示す名前と値のペアが含まれたハッシュテーブルの名前。

スローする例外: オブジェクトの作成が失敗した場合、またはセッション・トークンがNULLの場合は、ObAccessExceptionをスローします。


4.10.5.3 メソッド(ObUserSession、Java)

表4-60に、ObUserSessionクラスのJava実装に含まれるメソッドと詳細をリストします。cloneメソッドは、java.lang.Cloneインタフェースから対応メソッドを継承して実装したものです。setNativeHandleメソッドは、内部での使用専用として予約されています。ObUserSession内のこれら以外のメソッドは、ObUserSessionInterfaceから、またはObUserSessionのスーパークラスであるjava.lang.Objectから、対応メソッドを継承して実装したものです。

表4-60 Com.Oblix.Access.ObUserSessionのメソッド(Java)

メソッド 詳細

clone

public java.lang.Object clone()は、ObUserSessionオブジェクトをクローニングします。

スローする例外: java.lang.CloneNotSupportedException。

getAction

public java.lang.String getAction(java.lang.String actionType, java.lang.String name)は、指定されたアクションのタイプに対応するアクションの名前を戻します。

パラメータ:

actionType: 名前を戻すアクションのアクション・タイプ。たとえば、HTTPリソースの場合は、アクション・タイプにcookieやheaderVarを指定できます。このアクション・タイプを指定しない場合、デフォルトのタイプはheaderVarになります。

actionName: 指定されたアクション・タイプに関連付けられたアクションの名前。

getActions

public java.util.Hashtable getActions(java.lang.String actionType)は、指定されたユーザー・セッションに現在設定されている指定アクション・タイプのすべてのアクションの名前を戻します。

パラメータ:

actionType: アクション・タイプ。指定されたユーザー・セッションに設定されているアクションの中から、このタイプのアクションを戻します。たとえば、HTTPリソースの場合は、アクション・タイプにはcookieやheaderVarを指定できます。このアクション・タイプを指定しない場合、デフォルトのタイプはheaderVarになります。

getActionTypes

public java.lang.String[] getActionTypes()は、指定ユーザー・セッションのアクション・タイプの配列を戻します。

getError

public int getError()は、最後の認証または認可で発生したエラーの番号を戻します。

getErrorMessage

public java.lang.String getErrorMessage()は、認証または認可の失敗について詳細なエラー・メッセージを戻します。

getLastUseTime

public int getLastUseTime()は、1970年1月1日から、ユーザー・リクエストが認可された時間までの秒数を戻します。この値は、アイドル・セッションの期限がいつ切れるかを計算するときに使用されます。

getLevel

public int getLevel()は、リソース・リクエストを行うユーザーの認証に使用する認証スキームのレベルを戻します。

getLocation

public java.lang.String getLocation()は、ユーザーのロケーションを戻します。ユーザー・マシンのロケーションを指定するには、有効なDNS名またはIPアドレスを使用できます。

getNumberOfActions

public int getNumberOfActions(java.lang.String actionType)は、指定されたアクション・タイプに現在設定されているアクションの数を戻します。

パラメータ:

actionType: アクションのタイプ。たとえば、HTTPリソースの場合は、アクション・タイプにはcookieやheaderVarを指定できます。このアクション・タイプを指定しない場合、デフォルトのタイプはheaderVarになります。

getSessionToken

public java.lang.String getSessionToken()は、ユーザー・セッションの配列表現を戻します。

getStartTime

public int getStartTime()は、ユーザーが認証された時間を戻します。セッションの有効期限を計算するために使用されます。

getStatus

public int getStatus() は、LOGGEDOUT、LOGGEDIN、LOGINFAILED、EXPIREDなど、指定セッションのステータスを戻します。

getUserIdentity

public java.lang.String getUserIdentity()は、現在のLDAPディレクトリ内にある認証済ユーザーのプロファイル・エントリの識別名を戻します。

isAuthorized

public boolean isAuthorized(ObResourceRequest res)は、指定リソースに指定されている操作をユーザーがリクエストすることが認可される場合にtrueを戻します。認可されない場合はfalseを戻します。

パラメータ:

res: 認可チェック対象とするリソース・オブジェクト。

スローする例外: 操作が失敗した場合は、ObAccessExceptionをスローします。

isAuthorized(parameters)

public boolean isAuthorized(ObResourceRequest res, java.util.Hashtable parameters)は、追加パラメータ・セットが指定された場合に、指定リソースに対して指定されている操作をユーザーがリクエストすることが認可される場合、trueを戻します。認可されない場合はfalseを戻します。

パラメータ:

res: 認可チェック対象とするリソース・オブジェクト。

parameters: パラメータの名前と値からなるハッシュテーブル。

スローする例外: 操作が失敗した場合は、ObAccessExceptionをスローします。

logoff

public void logoff()は、認証済のユーザーをログオフして、セッションを終了します。

setLocation

public void setLocation(java.lang.String location)は、ユーザーのロケーションを設定します。ユーザー・マシンのロケーションを指定するには、有効なDNS名またはIPアドレスを使用できます。

setNativeHandle

public void setNativeHandle(int nativeHandle)。このメソッドは起動しないでください。内部での使用専用として予約されています。

equals、getClass、hashCode、notify、notifyAll、toString、wait

左側のセルに記載のメソッドは、すべてObUserSessionのスーパークラスであるjava.lang.Objectから継承されたものです。


4.10.6 ObConfig

ObConfigクラスを使用すると、アクセス・ゲート構成情報を格納、引渡し、取得および変更できます。

4.10.6.1 コンストラクタ(ObConfig、Java)

次の表で、ObConfigクラスのコンストラクタについて説明します。

public ObConfig()は、ObConfigオブジェクトのデフォルト・コンストラクタです。

4.10.6.2 メソッド(ObConfig、Java)

表4-61に、ObConfigクラスのメソッドを示します。

表4-61 Com.Oblix.Access.ObConfigのメソッド(Java)

メソッド 詳細

getAllItems

public static java.util.Hashtable getAllItems()は、アクセス・ゲート構成ファイルに現在あるすべての構成パラメータを表している名前と値のペアが含まれたハッシュテーブルを戻します。

スローする例外: Access Manager APIの初期化が成功する前にこのメソッドを起動すると、ObAccessExceptionをスローします。

getItem

public static java.lang.String getItem(java.lang.String itemName)は、指定された構成パラメータに対する値を戻します。

パラメータ:

itemName: 値をリクエストする構成パラメータの名前。

スローする例外: Access Manager APIの初期化が成功する前にこのメソッドを起動すると、ObAccessExceptionをスローします。

getNAPVersion

public static java.lang.String getNAPVersion()は、使用中のOracle Access Protocolのバージョンを戻します。

getNumberOfItems

public static int getNumberOfItems()は、アクセス・ゲートに現在設定されている構成項目の数を戻します。

スローする例外: Access Manager APIの初期化が成功する前にこのメソッドを起動すると、ObAccessExceptionをスローします。

getSDKVersion

public static java.lang.String getSDKVersion()は、使用中のアクセス・サーバーSDKのバージョンを戻します。

initialize(installDir)

public static void initialize(java.lang.String installDir)は、ルートがinstallDirのAccess Manager SDKを使用して、アクセス・ゲートを初期化します。(アクセス・ゲートをサポートするSDKインスタンスのロケーションを指定すると便利なことがあります。これは特に、同じホスト・マシン上に複数のサーバー・インスタンスがインストールされていて、それぞれが異なるアクセス・ゲートまたはWebGateで保護されている場合に便利です。)

パラメータ:

installDir: Access Manager SDKがインストールされているアクセス・ゲート・ホスト・マシン上のディレクトリ。

スローする例外: 初期化が失敗した場合は、ObAccessExceptionをスローします。

initialize

public static void initialize()は、UNIXまたはWindowsのホスト・マシン上で稼働するアクセス・ゲートの環境変数であるOBACCESS_INSTALL_DIRを使用して、アクセス・ゲートを初期化します。

スローする例外: 初期化が失敗した場合は、ObAccessExceptionをスローします。

shutdown

public static void shutdown()は、アクセス・ゲートをアクセス・サーバーから切断します。


4.10.7 ObAccessException

ObAccessExceptionのJava実装がこれに対応するCファミリの実装と異なるのは、Java環境では、エラー・メッセージ文字列全体のみを抽出でき、Cファミリ実装で抽出可能な個別のインデックス付き部分文字列は抽出できない、という点です。ObAccessExceptionの概要については、「ObAccessException」を参照してください。

アクセス・ゲートとアクセス・サーバーの間で予期外のリカバリ不能なエラーが発生すると、Access Manager APIがObAccessExceptionをスローします。

4.10.7.1 コンストラクタ(ObAccessException、Java)

表4-62に、ObAccessExceptionクラスのコンストラクタを示します。

表4-62 Com.Oblix.Access.ObAccessExceptionのコンストラクタ(Java)

主なパラメータ 詳細

NULL

public ObAccessException()は、ObAccessExceptionを作成します。

message

public ObAccessException(java.lang.String message)は、指定メッセージが含まれたObAccessExceptionを作成します。

パラメータ:

message: 例外メッセージの文字列。


4.10.7.2 継承メソッド(ObAccessException、Java)

ObAccessExceptionのJava実装には、独自のネイティブ・メソッドはありません。表4-63に、java.lang.Throwableとjava.lang.Objectから継承されたObAccessExceptionのクラスを示します。

表4-63 Com.Oblix.Access.ObAccessExceptionに継承されたメソッド(Java)

継承されたメソッド 継承元

fillInStackTrace、getLocalizedMessage、getMessage、printStackTrace、toString

左側のセルに記載のメソッドは、すべてObAccessExceptionのスーパークラスであるjava.lang.Throwableから継承されたものです。

equals、getClass、hashCode、notify、notifyAll、wait

左側のセルに記載のメソッドは、すべてObAccessExceptionのスーパークラスであるjava.lang.Objectから継承されたものです。


4.10.8 ObDiagnostic(Java)

ObDiagnosticクラスを使用すると、アクセス・サーバーの名前、ポート、ロケーション、アクセス・ゲートとアクセス・サーバーの接続数といった診断情報を表示できます。このクラスは、アクセス・サーバーに関連付けられているディレクトリの診断情報も表示します。

例:

public class ObDiagnostic{public static Hashtable getServerDiagnosticInfo()
 throws ObAccessExceptionpublic static Hashtable getClientDiagnosticInfo()
 throws ObAccessExceptionpublic static Hashtable getDirectoryDiagnosticInfo()
 throws ObAccessException}

4.10.8.1 メソッド(ObDiagnostic、Java)

表4-64に、ObDiagnosticのJava実装のメソッドをリストします。

表4-64 ObDiagnosticのメソッド(Java)

パラメータ 詳細

getServerDiagnosticInfo()

このパラメータは、ObMap構造体上の次の項目を戻します。

  • アクセス・サーバーのホスト名

  • アクセス・サーバーのポート

  • 現在のWebGateによって確立されたアクセス・サーバーとの接続数

  • アクセス・サーバーの状態(起動中または停止中)

  • アクセス・サーバー・インストールの作成日時

  • アクセス・サーバーのインストール・ディレクトリ

  • このアクセス・サーバーに許容されるスレッドの最大数

getDirectoryDiagnosticInfo()

このパラメータは、次の項目を戻します。

  • ディレクトリ・タイプ(Config、User、Policy)

  • ディレクトリのホスト

  • ディレクトリのポート

  • ディレクトリの状態(起動中または停止中)

  • 優先度(プライマリまたはセカンダリ)

  • モード(openまたはSSL)

  • サイズ制限(検索結果の最大数)

  • 時間制限(タイムアウトしきい値)

  • ログインDN

  • 作成日時(アクセス・サーバーがDirectory Serverとの接続を確立した時間)。(どちらかのサーバーを再起動すると、作成日時は変更されます。)


4.11 Cファミリのステータス・メッセージとエラー・メッセージの文字列

この項では、Access Manager APIのCファミリ実装(C、C++およびC#)のすべてに共通の定数をリストします。ここに記載のリストは、次のディレクトリ内のobaccess_api_defs.hにもあります。

SDK_install_dir/include


注意:

Javaでは、エラーはコード番号ではなく参照により処理されます。たとえば、エラー205のObAccessException_NOT_INITIALIZEDは、ObAccessException.NOT_INITIALIZEとして参照されます。「Javaのステータス・メッセージとエラー・メッセージのためのフィールド」を参照してください。

データの欠落やシステム障害などによりアクセス・サーバーが操作を実行できない場合、次のテーブルにある例外コードがアクセス・サーバーから戻されます。


注意:

次のテーブルにある文字列の前には、すべて文字列ObAccessException_を付加する必要があります。したがって、「OK = 0」は、「ObAccessException_OK = 0」となります。

アクセス・サーバーのエラー・コードを次に示します。

OK = 0
UNKNOWN = 200
BAD_SESSION_TOKEN
NO_SCHEME_ID
NEED_PARAMETERS
NOT_INITIALIZED
CACHE_PROBLEM
NO_CONFIG_FILE
NO_INSTALL_DIR_ENV
NOT_PROTECTED
MISSING_RESOURCE
MISSING_OPERATION
BAD_LOCATION
NO_CLIENT_ID
JNI_ERROR
OUT_OF_MEMORY
MISSING_ITEM
NO_MSG_CAT
CLIENT_NOT_IN_DIR
OBERROR
DIAGNOSTICS_FAILED
UNKNOWN_CLIENT_ID
MODUSER_FAILED

データの欠落やシステム障害などによりアクセス・サーバーが操作を実行できない場合、次のテーブルにある例外コードがアクセス・サーバーから戻されます。


注意:

次のテーブルにある文字列の前には、すべて文字列「ObAccessException_」を付加する必要があります。したがって、「AS_UNKNOWN = 300」は、「ObAccessException_AS_UNKNOWN = 30」となります。

アクセス・ゲートのエラー・コードを次に示します。

AS_UNKNOWN = 300
ENGINE_DOWN
NOCODE
NULL_RESOURCE
HOSTPORT_LOOKUP_FAILED
URL_LOOKUP_FAILED
SD_LOOKUP_FAILED
WROR_LOOKUP_FAILED
WROR_AUTHENT_LOOKUP_FAILED
NO_AUTHENT_SCHEME
EXCEPTION
INVALID_SCHEME_ID
INVALID_SCHEME_MAPPING
AS_UNKNOWN = 300
ENGINE_DOWN
INVALID_SCHEME_PARAMETERS
NO_USER
NONUNIQUE_USER
USER_REVOKED
MISSING_OBCRED_PASSWORD
WRONG_PASSWORD
MISSING_PASSWORD
MISSING_CERTIFICATE,
INVALID_CERTIFICATE
INVALID_SELECTION_FILTER
MISSING_AUTHN_PLUGIN
AUTHN_PLUGIN_ABORT
AUTHN_PLUGIN_DENIED
AUTHN_PLUGIN_NO_USER

次のテーブルに、ユーザー・セッションのステータスを示すリターン・コードを示します。


注意:

次のテーブルにある文字列の前には、すべて文字列「ObUser_」を付加する必要があります。したがって、「AWAITINGLOGIN = 0」は、「ObUser_ AWAITINGLOGIN = 0」となります。

セッションのステータス・コードを次に示します。

AWAITINGLOGIN = 0
LOGGEDIN
LOGGEDOUT
LOGINFAILED
EXPIRED

次のテーブルに、ユーザー・セッションのステータスを示すリターン・コードを示します。


注意:

次のテーブルにある文字列の前には、すべて文字列「OAAAStatus_」を付加する必要があります。したがって、「SessionExpired」は、「ObAAAStatus_SessionExpired」となります。

次のステータス・コードは、セッションの期限が切れたことをクライアントに示すときに使用されます。

ObAAAStatus_SessionExpired = 70

次のステータス・コードは、セッションが無効であることをクライアントに示すときに使用されます。

SessionInvalid = 71,
SessionIdle = 72,
SessionTimeout = 73,
ModUserFailed = 74,
DBInfoUnavailable = 75

注意:

次のテーブルにある文字列の前には、すべて文字列「ObUser_」を付加する必要があります。したがって、「AWAITINGLOGIN = 0」は、「ObUser_ AWAITINGLOGIN = 0」となります。

次のテーブルに、認証や認可のプロセスで発生する可能性がある問題の自己記述的コードをリストします。


注意:

次のテーブルにある文字列の前には、すべて文字列「ObUser_」を付加する必要があります。したがって、「OK = 0」は、「ObUser_OK = 0」となります。

認証および認可のエラー・コードを次に示します。

OK = 0
ERR_UNKNOWN = 100
ERR_NO_USER,
ERR_USER_REVOKED
ERR_WRONG_PASSWORD
ERR_INVALID_CERTIFICATE
ERR_AUTHN_PLUGIN_DENIED
ERR_INSUFFICIENT_LEVEL
ERR_NOT_LOGGED_IN
ERR_SESSION_TIMEOUT
ERR_IDLE_TIMEOUT
ERR_DENY

次のテーブルにリストしたコードは、Access Manager API内で具体的にtrueおよびfalseが意味されていることを明確にするために使用されます。

次に示すのは、ObBooleanのリターン・コードです。

ObFalse = 0
ObTrue = 1

4.12 ベスト・プラクティス

この項では、様々な問題を回避する方法や、開発中に頻繁に発生する問題を解決するためのいくつかの方法について説明します。

4.12.1 問題の回避

作成したアクセス・ゲートでの問題発生を回避するための提案を次に示します。

  • アクセス・ゲートが適切なアクセス・サーバーに接続しようとしているかを確認します。

  • アクセス・サーバーについての構成情報とアクセス・ゲートについての構成情報が一致するようにします。アクセス・ゲートの構成情報は、アクセス・サーバー上のOracle構成ディレクトリに格納されており、ここで確認できます。「アクセス・システム・コンソール」に移動し、「アクセス・システム構成」、「アクセス・ゲート構成」の順にクリックして、次に、構成情報を確認するアクセス・ゲートの名前をクリックします。アクセス・ゲートとアクセス・サーバーの構成の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。

  • アクセス・サーバーとの接続や切断をきれいに行うには、ObConfigクラスのinitializeメソッドおよびshutdownメソッドを使用します。

  • アクセス・ゲートをコンパイルおよびリンクできるように、WindowsまたはSolarisのホスト・マシンで環境変数OBACCESS_INSTALL_DIRを設定する必要があります。一般的に、この変数は、アクセス・ゲートを実行する場合にも必ず設定しておく必要があります。

  • 開発中に問題を捕捉したりレポートするには、カスタム・アクセス・ゲート・コードの作成に使用した言語の例外処理機能(try、throwおよびcatch)を使用します。

4.12.1.1 スレッド・セーフ・コード

アクセス・ゲートは、マルチスレッド・アプリケーション全体でただ1つのスレッドとなります。

そうした環境でも安全に操作できるよう、開発者は次のガイドラインを順守することをお薦めします。

  • シングル・スレッド関数ではなく、スレッド・セーフ関数を使用します。たとえば、localtimeでなくlocaltime_rを使用します。

  • マルチスレッド機能がサポートされるよう、適切なビルド環境とコンパイラ・フラグを指定します。たとえば、-D_REENTRANTを使用します。また、Solarisプラットフォームで-mt、Windowsプラットフォームで/MDを使用します。

  • FILEポインタなどのスレッド・セーフ方式の共有ローカル変数は注意して使用してください。

4.12.2 問題の識別と解決

アクセス・ゲートの実行が失敗した場合には、次の事項を確認してください。

  • アクセス・サーバーが稼働していることを確認します。Windowsシステムでこれを確認するには、「コンピュータの管理」、「サービス」、「AccessServer」の順にナビゲートします。

    ここで、「AccessServer」は、アクセス・ゲートを接続するアクセス・サーバーの名前です。

  • コードが想定しているドメイン・ポリシーが正しく存在し、アクセス・システムで有効化されていることを確認します。

  • 作業しているアクセス・システム製品に付属のリリース・ノートをお読みください。

  • アクセス・システムの低位レベルのポリシーが、検査中のポリシーをオーバーライドして、アクセス・ゲートに応答しないようにします。

  • configureAccessGateツールが実行済であることを確認するとともに、実行時に入力エラーがなかったことも確認します。このツールの実行方法については、「configureAccessGateユーティリティの実行」を参照してください。

  • ポリシー・マネージャ内の「アクセス・テスター」を使用すると、特定のリソースにどのポリシーが適用されるかを確認できます。アクセス・テスターの使用方法、およびポリシー・ドメインを使用したリソース保護の詳細は、『Oracle Access Managerアクセス管理ガイド』を参照してください。