Oracle Containers for J2EE
セキュリティ・ガイド
10g(10.1.3.4.0) B50832-01 |
|
OC4Jには、このマニュアルですでに説明したセキュリティ・プロバイダの他に、Webベース・アプリケーションによる異機種サード・パーティのアイデンティティ管理システムの使用を汎用的にサポートするフレームワークもあります。
この章ではこのアイデンティティ管理フレームワークについて説明します。この章の内容は次のとおりです。
ここでは、Webアプリケーションで使用するOC4Jアイデンティティ管理フレームワークの概要を説明します。この項の内容は次のとおりです。
注意
<jazn>
設定のprovider="XML"
は、交換可能なアイデンティティ管理フレームワークで使用されます。
前述のように、Oracle Application Serverには、Oracle Identity Management、Oracle Access Managerなど、セキュリティ・インフラストラクチャが用意されています。両方ともアイデンティティ・リポジトリが含まれています。すでに説明したように、特定の外部LDAPプロバイダ(Active DirectoryとSun Java System Directory Server)もサポートされます。
ただし、以前のリリースでは、他のサード・パーティのアイデンティティ管理システムとセキュリティ・システムをサポートする汎用的なフレームワークはありませんでした。OC4J 10.1.3.1実装には、そのようなフレームワークが追加されました。異機種サード・パーティ・システムをOC4Jに統合できるようになったため、J2EEアプリケーションがこれらのサード・パーティ・システムと相互運用できるようになりました。
ここでは、アイデンティティ管理フレームワークのコンポーネントを紹介し、コンポーネントが連携する仕組みの概要を説明します。(サード・パーティのアイデンティティ管理システムとOC4Jとの統合は、標準のJAASログイン・モジュールに基づきます。)
アイデンティティ管理フレームワークの一般的なモデルでは、コンポーネントが次の図13-1に示すように連携します。
アイデンティティ管理フレームワークにおいては、アサーションとは、アイデンティティ・トークンの解釈機能、トークン内容の検証機能、およびトークンに対応するアイデンティティの設定機能のことです。パスワードや他の資格証明は必ずしも必要ありません。通常、トークンは信頼されたソースから取得されるか、鍵とともに送信されているためです。
トークン・アサータがシングル・サインオン・システムによって認証されたアイデンティティを受け付けることができるため、シングル・サインオン・システムはカスタム・セキュリティ・プロバイダから資格証明を収集し、アイデンティティをOC4Jに渡すことができます。次に、トークン・アサータはアイデンティティを検証し、OC4Jコンテナ内にアイデンティティを設定します。
handle(Callback[])
メソッド(標準的なログイン・モジュール機能)を介してアイデンティティ・コールバック・ハンドラに渡します。ログイン・モジュールは、必要に応じてサード・パーティのアイデンティティ管理システムから情報を取得して、ユーザーが属するロールなど、ユーザーのプリンシパルを収集します。次に、ログイン・モジュールは移入されたサブジェクトをOC4Jに送信します。アイデンティティはすでにトークン・アサータによって検証されているため、ログイン・モジュールで認証を再度実行する必要はありません。また、アイデンティティ管理フレームワークのカスタム・ログイン・モジュールも、アイデンティティ・コールバック・ハンドラを処理できる必要があります。
代替方法: アプリケーションのログイン・モジュールを実装して構成するかわりに、サブジェクトを作成し、getSubject()
メソッドを実装するトークン・アサータを指定して、ログイン・モジュールを使用せずに、(ユーザー・ロールを移入された)サブジェクトを直接OC4Jに返すことができます。この方法を選択する場合、アイデンティティ管理フレームワークのプロパティ(idm.subject.loginmodule.disabled
)を適切に設定する必要があります。
これらのコンポーネントにはJavaインタフェースが提供されており、必要に応じて実装してサード・パーティのアイデンティティ管理システムとOC4Jを統合することができます。
管理者は、使用する実装クラスを参照するようにOC4Jを構成し、ログイン・モジュールを構成する必要があります。
サード・パーティのアイデンティティ管理システムをOracleフレームワークで使用するには、次のプログラムによる手順を使用します。
getSubject()
メソッドを実装する代替方法を使用しない場合)。ログイン・モジュールは、アイデンティティ・コールバック・ハンドラ・インスタンスを適切に処理できる必要があります。
Oracleアイデンティティ管理フレームワークには次の構成が必要です。詳細は、この章で後述します。
jazn.xml
を構成して、トークン・コレクタ実装クラス、トークン・アサータ実装クラス、トークン・タイプ(HTTPヘッダーやCookieなど)などを示す、アイデンティティ管理プロパティを設定します。各プロパティは、<jazn>
要素の<property>
サブ要素に設定されます。
RealmLoginModule
を使用します)。構成は、system-jazn-data.xml
の<jazn-loginconfig>
要素の下に格納されます。
orion-application.xml
ファイル内に認証方式CUSTOM_AUTH
を指定します。OC4J 10.1.3.1実装には、アイデンティティ管理フレームワークを使用する、代替となるJavaシングル・サインオン実装(Java SSO)がパッケージ化されています。Java SSO(詳細は、
第14章「OC4J Javaシングル・サインオン」を参照)は、使用するアイデンティティ管理システムとOC4Jの結合を解除するSSO実装です。Oracle Identity Management(Oracle Single Sign-Onに必要)やOracle Access Manager(Oracle Access Manager SSOに必要)などのような、特定のインフラストラクチャ要件はありません。
Java SSOには、Cookie資格証明を収集し、アイデンティティ・トークンをOC4Jに返すトークン・コレクタ実装、およびトークン内のアイデンティティを検証し、アイデンティティをコールバック・ハンドラでOC4Jに戻すトークン・アサータ実装が含まれています。
ここでは、サード・パーティのアイデンティティ管理システムとOC4Jを統合するためのインタフェース、APIおよびOracle実装について説明します。
通常、ここで説明するメソッドは、OC4Jのアイデンティティ管理フレームワークによってコールされます。
注意
(「ライブラリを共有するためのタスク」を参照してください。)
Oracleは、次のアイデンティティ・トークン・インタフェースを定義しています。
oracle.security.jazn.token.IdentityToken
アイデンティティ・トークン・オブジェクトにユーザー資格証明が格納されています。トークン・オブジェクトは、トークン・コレクタによって返され、トークン・アサータに渡されます。
IdentityToken
インタフェースには、次のメソッドが指定されています。
void setTokenType(String tokenType)
このメソッドが指定するトークン・タイプは次のとおりです。HTTP_COOKIE
、HTTP_HEADER
またはHTTP_REQUEST
。
String getTokenType()
このメソッドは、トークン・タイプを返します。
OC4Jには、次のIdentityToken
実装が用意されています。
oracle.security.jazn.token.HttpCookieIdentityToken
このクラスのインスタンスをトークン・コレクタによって構成するには、Cookieの名前をCookie値へのキーとして格納するMap
インスタンスを指定します。
HttpCookieIdentityToken(java.util.Map Cookies)
アイデンティティ情報を取得する次のメソッドが含まれています。
Map getCookies()
oracle.security.jazn.token.HttpHeaderIdentityToken
このクラスのインスタンスをトークン・コレクタによって構成するには、ヘッダーの名前をヘッダー値へのキーとして格納するMap
インスタンスを指定します。
HttpHeaderIdentityToken(java.util.Map headerValues)
アイデンティティ情報を取得する次のメソッドが含まれています。
Map getHeaderValues()
oracle.security.jazn.token.HttpRequestIdentityToken
このクラスには、次のコンストラクタが含まれています。
HttpRequestIdentityToken(HttpServletRequest request)
アイデンティティ情報を取得する次のメソッドが含まれています。
HttpServletRequest getRequest()
Oracleは、次のトークン・コレクタ・インタフェースを提供しています。
oracle.security.jazn.collector.TokenCollector
このインタフェースの実装を使用して、HTTPベース認証資格証明を受信し、アイデンティティ・トークンを作成します。実装クラスには、次のような機能があります。
トークン・コレクタは次の入力を取得します。
ユーザーが指定したトークンが有効でないか、トークンがないか、その他の想定されるシナリオでユーザーを適切にアサートできない場合、OC4Jはトークン・コレクタfail()
メソッドをコールし、失敗の理由を渡します。こうすると、トークン・コレクタは、必要に応じたアクションを実行できます。fail()
メソッドは、適切な失敗のアクションを実行するように実装されている必要があります(ユーザーをログイン・ページにリダイレクトして戻すなど)。
TokenCollector
インタフェースには、次のメソッドが指定されています。
IdentityToken getToken(String tokenType,
HttpServletRequest request,
List names,
Properties props)
このメソッドはアイデンティティ・トークンをOracle IdentityToken
インスタンスとして返します(前項「アイデンティティ・トークン・インタフェースおよびOracle実装」を参照)。このメソッドは、入力としてトークン・タイプ(HTTP_COOKIE
、HTTP_HEADER
またはHTTP_REQUEST
)、現在のリクエスト・オブジェクト、Cookieまたはヘッダーの名前のリストをHTTPリクエストから受け取ります。これらは、トークンおよび構成できるカスタム・プロパティを構成します。
HTTP_REQUEST
を使用している場合、名前のリストは適用できないため、nullになります。HTTP_COOKIE
を使用している場合、リストはidm.token.collector.cookie.
#
プロパティを使用して構成されているCookie名に対応し、HTTP_HEADER
を使用している場合、リストはidm.token.collector.header.
#
プロパティを使用して構成されているヘッダー名に対応します。#
は、数値(1、2、...、n)に置き換えられます(「アイデンティティ管理フレームワーク・プロパティの構成」を参照)。
プロパティのリストは、トークン・コレクタ実装に固有であり、必要に応じてトークン・コレクタによって使用されます。規約上、このようなプロパティ名の先頭にcustom.
を付ける必要があります(ピリオドを含む)。たとえば、Java SSOプロパティにはcustom.sso.url.login
とcustom.sso.key.alias
が含まれています。
void fail(HttpServletRequest request,
HttpServletResponse response,
int reason)
throws CollectorException
このメソッドは、次のような各種失敗モードでコールされます。
getToken()
メソッドを実行中に、必要なトークンがHTTPリクエスト・オブジェクト内に見つかりません。
整数reason
はOC4Jによって指定されるコードです。これは、失敗が発生した理由を示し、次の値のいずれかになります(クラスoracle.security.jazn.collector.IdmErrorConstants
に定義されている)。
REASON_CHALLENGE_USER
: ユーザーが認証されていませんが、認証を要求できます(ブラウザでは401エラー)。通常、これはBasic認証用です。ブラウザに認証ウィンドウが再度表示されます。この定数の値は1です。
REASON_INVALID_USER
: ユーザーが認証されていません。資格証明が無効である(401エラー)などのためです。この定数の値は1です。
REASON_UNAUTHORIZED
: ユーザーが認証されていますが、保護されたリソースへのアクセスを認可されていません(403エラー)。この定数の値は2です。
REASON_PRECLUDED_ACCESS
: リソースが、ロールを含まないセキュリティ制約によって保護されています(403エラー)。この定数の値は3です。
Oracleは、次のTokenCollector
実装を提供しています。
oracle.security.jazn.collector.oc4j.TokenCollectorImpl
この実装は、アイデンティティ・トークンに対するHTTP CookieまたはHTTPヘッダーの使用をサポートする抽象クラスです。2つのうちいずれかを使用する場合、TokenCollectorImpl
を拡張し、fail()
メソッド内に適切なエラー処理を追加できます(ユーザーをログイン・ページにリダイレクトするなど)。
TokenCollectorImpl
のgetToken()
メソッドは、構成(HttpCookieIdentityToken
またはHttpHeaderIdentityToken
)に基づいて、適切なトークン・タイプを返します。
CookieまたはヘッダーのかわりにHTTPリクエスト・オブジェクト自体を使用するには、カスタム・トークン・コレクタを実装する必要があります。
トークン・コレクタは、適切なアイデンティティ・トークン・クラスのコンストラクタを使用してトークンを作成します。HttpCookieIdentityToken
、HttpHeaderIdentityToken
およびHttpRequestIdentityToken
コンストラクタは、「アイデンティティ・トークン・インタフェースおよびOracle実装」で説明します。
Oracleは、次のトークン・アサータ・インタフェースを提供しています。
oracle.security.jazn.asserter.TokenAsserter
このインタフェースを実装して、OC4Jによって渡されるアイデンティティ・トークンを受け付け、アイデンティティ・コールバック・ハンドラをOC4Jに返します。
OC4Jがトークン・コレクタからアイデンティティ・トークンを正常に受信すると、OC4Jはトークンをトークン・アサータに渡し、アサータはトークンのアイデンティティを検証する必要があります。
アイデンティティが正常に検証されると、ユーザーは認証済とみなされ、アイデンティティがアイデンティティ・コールバック・ハンドラとしてOC4Jに返されます。
オプションでは、トークン・アサータはアイデンティティのすべてのロールまたはグループを取得し、そのサブジェクトを移入することもできます。またはログイン・モジュールに残すこともできます。
TokenAsserter
インタフェースには、次のメソッドが指定されています。
IdentityCallbackHandler assertIdentity(String tokenType,
IdentityToken token,
Properties props)
throws AsserterException
検証が正常に完了すると、メソッドはIdentityCallbackHandler
のインスタンス内でアサートされたアイデンティティを返します(次項「アイデンティティ・コールバック・ハンドラ・インタフェース」を参照)。トークン・タイプは、HTTP_COOKIE
、HTTP_HEADER
またはHTTP_REQUEST
です。トークンは、前述のようにIdentityToken
のインスタンスです。プロパティは、「トークン・コレクタ・インタフェースおよびOracle実装」でgetToken()
メソッドについて説明したプロパティと同じです。
トークン・コレクタのTokenCollectorImpl
を拡張する場合、トークン・アサータが適用可能なアイデンティティ・トークン・メソッドを使用してトークンからアイデンティティ情報を取得する必要があります。HttpCookieIdentityToken
、HttpHeaderIdentityToken
およびHttpRequestIdentityToken
内のこれらのメソッドについては、すでに説明しました。
関連項目
|
アイデンティティ・コールバック・ハンドラは、トークン・アサータとともに使用します。Oracleは、次のアイデンティティ・コールバック・ハンドラ・インタフェースを提供しています。
oracle.security.jazn.callback.IdentityCallbackHandler
アイデンティティ・コールバック・ハンドラは、トークン・アサータによって構成され、アサートされたアイデンティティをOC4Jに渡すために使用されます。これは、通常はログイン・モジュールにも渡されるユーザー・アイデンティティであるため、アイデンティティに対応するサブジェクトに必要に応じてプリンシパルを移入することができます。
IdentityCallbackHandler
インタフェースには、次のメソッドが指定されています。
void setIdentity(String identity) throws AsserterException
このメソッドは、文字列を受け取ってユーザー・アイデンティティを指定します。
String getIdentity()
このメソッドは、ユーザー・アイデンティティとともに文字列を返します。
Subject getSubject()
トークン・アサータによってサブジェクトが移入された場合、アイデンティティ管理フレームワークはこのメソッドを使用してサブジェクトを取得します。それ以外の場合(ログイン・モジュールがサブジェクトを移入する場合)、このメソッドはnull
を返します。
次のような標準のコールバック・ハンドラ・メソッドもあります。
void handle(Callback[] callbacks)
このメソッドは、提供されたコールバック内の情報を処理するために(取得、表示など)、1つ以上のjavax.security.auth.callback.Callback
インスタンスの配列を受け取ります。
Oracleは、次のアイデンティティ・コールバック・ハンドラ実装を提供しています。
oracle.security.jazn.callback.IdentityCallbackHandlerImpl
アイデンティティ管理フレームワークで使用するために、Oracleはoracle.security.jazn.callback
パッケージ内に次のコールバック実装を提供しています。
アイデンティティ管理フレームワークで使用するために、Oracleは次のアイデンティティ・コールバック・クラスを提供しています。
oracle.security.jazn.callback.IdentityCallback
IdentityCallback
インスタンスを使用すると、アイデンティティの認証状態(認証済であるかどうか)および認証に使用される認証方式に加えて、アイデンティティ自体を取得することができます。
コンストラクタにはパラメータはありません。
IdentityCallback()
次に、アイデンティティ・コールバック・ハンドラhandle()
メソッドを使用して、アイデンティティ・コールバックをコールバック・ハンドラ内に設定できます。
// In token asserter: IdentityCallbackHandler ich = new IdentityCallbackHandlerImpl("identity"); ... // In login module: IdentityCallback icb = new IdentityCallback(); Callback[] callback = {icb}; ich.handle(callback);
IdentityCallback
クラスには、次のメソッドがあります。
String getIdentity()
アイデンティティ・コールバックからアイデンティティを文字列として取得します。
boolean isIdentityAsserted()
アイデンティティがアサートされている場合はtrue
を、アサートされていない場合はfalse
を返します。
String getAuthenticationType()
アイデンティティの認証に使用される認証方式を示します(フォームベースやBasicなど)。
HTTP CookieまたはHTTPヘッダーをトークン・タイプとして使用しないアイデンティティ管理フレームワーク実装用に、Oracleは次のHTTPリクエスト・コールバック・クラスを提供しています。
oracle.security.jazn.callback.HttpRequestCallback
HTTPリクエスト・コールバック・インスタンスを使用すると、ログイン・モジュールがリクエスト・オブジェクトから資格証明を取得し、ユーザーを認証し、ユーザーのサブジェクトに移入できます。
コンストラクタにはパラメータはありません。
HttpRequestCallback()
次に、アイデンティティ・コールバック・ハンドラhandle()
メソッドを使用して、HTTPリクエスト・コールバックをコールバック・ハンドラ内に設定できます。
// In token asserter: IdentityCallbackHandler ich = new IdentityCallbackHandlerImpl("identity"); ... // In login module: HttpRequestCallback httpreqcb = new HttpRequestCallback(); Callback[] callback = {httpreqcb}; ich.handle(callback);
HttpRequestCallback
クラスには、次のメソッドがあります。
void setHttpRequest(HttpServletRequest request)
このメソッドを使用してHTTPリクエスト・オブジェクトを設定します。ユーザー資格証明が含まれていることが想定されています。
HttpServletRequest getHttpRequest()
このメソッドは、HTTPリクエスト・オブジェクトを返します。
一般的に、アイデンティティ管理フレームワークの実装にはカスタム・ログイン・モジュールが含まれています。アイデンティティがトークン・アサータによって正常にアサートされると、トークン・アサータはアイデンティティをアイデンティティ・コールバック・ハンドラとしてOC4Jに渡します。OC4Jはこのアイデンティティをログイン・モジュールに渡します。
JAASの典型的な使用方法では、ログイン・モジュールが、ユーザーの認証およびユーザーのサブジェクト移入という2つの重要な機能を実行します。ただし、アイデンティティ管理フレームワーク内では、ログイン・モジュールが認証を処理する必要はありません。ログイン・モジュールの重要な機能は、ユーザーのロールに関する情報を取得してサブジェクトに移入するために、必要に応じてアイデンティティ管理システムにアクセスすることです。
ログイン・モジュールとアイデンティティ管理フレームワークを併用する場合、ログイン・モジュールがユーザー名を渡すために使用されるIdentityCallbackHandler
インスタンスを処理できる必要があります。ログイン・モジュールが実行しなければならないことは、次のとおりです。
IdentityCallbackHandler
インスタンスを受信します。
javax.security.auth.callback.NameCallback
やPasswordCallback
など、標準的なコールバックに加えて、Oracleコールバックoracle.security.jazn.callback.IdentityCallback
も含めることができます。HTTPリクエストのトークンを使用する場合、Oracleコールバックoracle.security.jazn.callback.HttpRequestCallback
を使用します。
handle(Callback[])
メソッドを使用して、コールバックをIdentityCallbackHandler
インスタンスに渡します。
オプションでサブジェクト・アサータを実装すると、トークン・アサータまたはログイン・モジュールによって移入および返されたサブジェクトを検証することができます。OC4Jは、サブジェクト・アサータが構成されている場合にそれを起動します。典型的な使用例では、サブジェクトが署名され、署名がプリンシパルとしてサブジェクトに追加され、サブジェクト・アサータが署名を確認し、検証します。
Oracleは、次のサブジェクト・アサータ・インタフェースを提供しています。
oracle.security.jazn.asserter.SubjectAsserter
SubjectAsserter
インタフェースには、次のメソッドが指定されています。
boolean assertSubject(Subject subject)
throws AsserterException
このメソッドを使用してサブジェクトを検証します。成功の場合はtrueが返されます。
アイデンティティ管理フレームワーク用に作成する実装クラスはアプリケーションの一部ではありません。また、アプリケーションとともにパッケージ化とデプロイもされていません。実装クラスを1つのJARファイルにパッケージ化し、そのJARファイルをOC4Jクラスパスに追加します。これは、共有ライブラリとして行うことができます。共有ライブラリは、それを使用とするアプリケーションによってインポートできます(「ライブラリを共有するためのタスク」を参照)。
ログイン・モジュールをアイデンティティ管理フレームワーク実装の一部として実装すると、その実装を同じライブラリ内にも、個別のライブラリとしても含めることができます。
ここではアイデンティティ管理フレームワークの構成について説明します。この項の内容は次のとおりです。
管理者はフレームワークのプロパティとログイン・モジュールを構成します。アプリケーション・アセンブラは、認証方式を設定して、フレームワークを使用するアプリケーションを構成します。
注意 デフォルトでは、単一インスタンスOC4Jインストールでは、アイデンティティ管理フレームワークの実装であるJava SSOは、事前に構成されています(「単一インスタンスOC4Jインストール用デフォルトJava SSOプロパティ設定」を参照)。 |
管理者は、jazn.xml
を構成して、使用するクラス実装に適したアイデンティティ管理フレームワークのプロパティを設定します。表13-1は、アイデンティティ管理フレームワークのプロパティを示しています。
<jazn>
要素の<property>
サブ要素内にこれらのプロパティを設定します。次に例を示します。
<jazn provider="XML" location="./system-jazn-data.xml" default-realm="jazn.com"> ... <!-- properties to configure the 3rd party IDM framework --> <property name="idm.authentication.name" value="JavaSSO" /> <property name="idm.token.asserter.class" value="oracle.security.jazn.sso.SSOCookieTokenAsserter" /> <property name="idm.token.collector.class" value="oracle.security.jazn.sso.SSOCookieTokenCollector" /> <property name="idm.token.type" value="HTTP_COOKIE" /> <property name="idm.token.collector.cookie.1" value="ORA_OC4J_SSO"/> ... </jazn>
重要
|
一般的にカスタム・ログイン・モジュールを使用することを想定しますが、その場合はモジュールを構成する必要があります。アプリケーションのデプロイメント時またはその後にApplication Server Controlを使用して、カスタム・ログイン・モジュールを構成できます(「Application Server Controlでのカスタム・セキュリティ・プロバイダの構成」を参照)。(OracleAS JAAS Provider Admintoolには、「Admintoolを使用したログイン・モジュールの構成とRMIパーミッションの付与」に記載されているように、ログイン・モジュール構成用のオプションもあります。)
構成は、system-jazn-data.xml
ファイルに格納されます。次に、アプリケーションmyapp
とともに使用されるカスタム・ログイン・モジュールCustomLM
の例を示します。
<jazn-loginconfig> <application> <name>myapp</name> <login-modules> <login-module> <class>mypackage.CustomLM</class> <control-flag>required</control-flag> <options> <option> <name>addAllRoles</name> <value>true</value> </option> </options> </login-module> </login-modules> </application> </jazn-loginconfig>
アプリケーションでアイデンティティ管理フレームワークを使用する場合、アプリケーション・アセンブラがorion-application.xml
ファイルの<jazn-web-app>
要素内に認証方式CUSTOM_AUTH
を指定する必要があります。次に例を示します。
<jazn provider="XML" ... > ... <jazn-web-app auth-method="CUSTOM_AUTH" /> ... </jazn>
これにより、jazn.xml
のフレームワーク・プロパティの構成、およびsystem-jazn-data.xml
(該当する場合)のログイン・モジュールの構成に基づいて、アイデンティティ管理フレームワークの使用がトリガーされます。
複数のOC4Jインスタンスを使用するインストール・タイプの場合、インスタンス間でアイデンティティ管理フレームワークの構成が複製されている必要があります。これには、jazn.xml
内のアイデンティティ管理フレームワーク・プロパティ設定、およびsystem-jazn-data.xml
内のログイン・モジュール構成(該当する場合)が含まれています。必要に応じて次の手順を実行します。
system-jazn-data.xml
更新を調整します。これにより、各system-jazn-data.xml
ファイルがOC4Jインスタンスのグループ内で更新されます。これには、ファイルベース・セキュリティ・プロバイダを使用する場合のユーザー設定も含まれます。「クラスタMBeanブラウザの機能およびJ2EEServerGroup MBean」では、OC4Jインスタンス間で各system-jazn-data.xml
ファイルの設定を調整する方法について説明します。インスタンス間でログイン・モジュール構成をメンテナンスする操作もあります(setLoginModule
など)。
jazn.xml
ファイルのプロパティ設定に対しては、各OC4Jインスタンスのjazn.xml
を手動で構成することが唯一のオプションです。ここでは、これまでに説明したアイデンティティ管理フレームワークの使用に関連する重要な作業をまとめます。
orion-application.xml
ファイルの<jazn-web-app>
要素内にある設定auth-method="CUSTOM_AUTH"
で行うことができます。
jazn.xml
ファイルのアイデンティティ管理フレームワーク・プロパティを構成します。
このサンプルの前提事項は、認証でユーザーがカスタム・アイデンティティ・ストアと照合されることです。次に、ログインしたユーザーのアイデンティティを含むカスタムHTTPヘッダー(Acme-Custom-Auth
)がリクエストに追加されます。サンプルのコンポーネントは次のように機能します。
IdentityCallbackHandlerImpl
クラスを使用し、アイデンティティ・コールバック・ハンドラ機能を介してこのアイデンティティをアサートします。
対応する構成は、jazn.xml
に示されているようになります。
ここには、サンプルのトークン・コレクタ実装用コードを示します。
package com.acme.idm; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import oracle.security.jazn.collector.CollectorException; import oracle.security.jazn.collector.oc4j.TokenCollectorImpl; import oracle.security.jazn.token.HttpHeaderIdentityToken; import oracle.security.jazn.token.IdentityToken; import oracle.security.jazn.token.TokenNotFoundException; import oracle.security.jazn.collector.IdmErrorConstants; public class CollectorImpl extends TokenCollectorImpl { public CollectorImpl() { } public IdentityToken getToken(String tokenType, HttpServletRequest request, List tokenNames, Properties properties) throws CollectorException, TokenNotFoundException { if (null == tokenType || 0 == tokenType.length() || !IdentityToken.HTTP_HEADER.equalsIgnoreCase(tokenType)) { throw new CollectorException("invalid token type" + tokenType); } HttpHeaderIdentityToken identityToken = (HttpHeaderIdentityToken)super.getToken(tokenType, request, tokenNames, properties); Map m = identityToken.getHeaderValues(); if (m == null || m.size() == 0) { throw new TokenNotFoundException("no HTTP Header token was found"); } return identityToken; } public void fail(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, int reason) { try { switch (reason) { case IdmErrorConstants.REASON_INVALID_USER: httpServletResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); case IdmErrorConstants.REASON_UNAUTHORIZED: httpServletResponse.sendError(HttpServletResponse.SC_FORBIDDEN); } } catch (Exception e) { System.err.println("failed to send response " + e); e.printStackTrace(System.err); } } }
ここには、サンプルのトークン・アサータ実装用コードを示します。
前提事項は、すべての認証済ユーザーに対して、Oracle HTTP ServerまたはOC4Jのフロントにある他のWebサーバーが"Acme-Custom-Auth
"を"ANONYMOUS
"に設定することです。Acme実装には、ユーザーが認証されることが必要です。(本番環境に近い実装では、ヘッダーでクリアなユーザー名を渡さない可能性が高いと考えられます。ヘッダーが生成された場合に検証する方法がないためです。)
package com.acme.idm; import java.util.Map; import java.util.Properties; import oracle.security.jazn.asserter.AsserterException; import oracle.security.jazn.asserter.TokenAsserter; import oracle.security.jazn.callback.IdentityCallbackHandler; import oracle.security.jazn.callback.IdentityCallbackHandlerImpl; import oracle.security.jazn.token.IdentityToken; import oracle.security.jazn.token.HttpHeaderIdentityToken; public class TokenAsserterImpl implements TokenAsserter { private static final String HEADER_NAME = "Acme-Custom-Auth"; private static final String AUTH_TYPE = "CUSTOM_HTTP_HEADER"; public TokenAsserterImpl() { } public IdentityCallbackHandler assertIdentity(String tokenType, IdentityToken identityToken, Properties properties) throws AsserterException { if (tokenType != null && tokenType.length() > 0 && IdentityToken.HTTP_HEADER.equalsIgnoreCase(tokenType)) { HttpHeaderIdentityToken token = (HttpHeaderIdentityToken) identityToken; Map m = token.getHeaderValues(); if (m != null && m.size() > 0) { String user = (String) m.get(HEADER_NAME); if ("ANONYMOUS".equalsIgnoreCase(user)) { throw new AsserterException ("anon user - expected authenticated user"); } IdentityCallbackHandler idcb = new IdentityCallbackHandlerImpl(user); idcb.setIdentityAsserted(true); idcb.setAuthenticationType(AUTH_TYPE); return idcb; } else { throw new AsserterException ("not a valid token - no identity to assert"); } } } }
ここには、このサンプル用jazn.xml
ファイルの構成を示します。
<?xml version="1.0" encoding="UTF-8" standalone='yes'?> <jazn xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://xmlns.oracle.com/oracleas/schema/jazn-10_0.xsd" schema-major-version="10" schema-minor-version="0" provider="XML" location="./system-jazn-data.xml" default-realm="jazn.com" > <property name="idm.token.asserter.class" value="com.acme.idm.TokenAsserterImpl" /> <property name="idm.token.collector.class" value="com.acme.idm.CollectorImpl" /> <property name="idm.token.type" value="HTTP_HEADER" /> <property name="idm.token.collector.header.1" value="Acme-Custom-Auth" /> <property name="idm.authentication.name" value="Acme-IDM" /> </jazn>
|
Copyright © 2003, 2008 Oracle Corporation. All Rights Reserved. |
|