Oracle® Fusion Middleware Oracle Directory Integration Platform管理者ガイド 11g リリース1 (11.1.1) B65032-05 |
|
![]() 前 |
![]() 次 |
この章では、Oracleバックエンド・ディレクトリと接続ディレクトリを同期するための一般的な方法について説明します。内容は次のとおりです。
関連項目: Oracleバックエンド・ディレクトリと次の接続ディレクトリ間の統合の構成に関する手順は、次の各章を参照してください。 |
Oracleバックエンド・ディレクトリと接続ディレクトリ間の同期を準備するには、次の手順を実行します。
Oracleバックエンド・ディレクトリとその他のディレクトリが稼働していることを確認します。
同期化するコンテナ内の関連エントリの読取りおよび書込みに十分な権限を持つユーザー・アカウントを接続ディレクトリに作成します。ディレクトリでtombstoneがサポートされている場合、アカウントにはtombstoneエントリの読取りに十分な権限も必要です。
接続ディレクトリからのインポート操作: ユーザー・アカウントにサブツリー・ルートに対する読取りアクセス権限を付与します。ユーザー・アカウントは、Oracle Directory Integration Platformとの同期化が行われる接続ディレクトリ内のソース・コンテナ(サブツリー・ルート)下のすべてのオブジェクトを読み取ることができる必要があります。接続ディレクトリのユーザー・アカウントに、Oracleバックエンド・ディレクトリと同期化されるすべてのオブジェクトに対する必要な権限があるかどうかを確認するには、次のようにコマンド行ユーティリティldapsearch
を使用してサブツリー検索を実行します。
$ORACLE_HOME/bin/ldapsearch -h directory host-p directory port \ -b "DN of subtree" -s sub -D binddn "objectclass=*" -q
注意: 権限のあるディレクトリ・ユーザーのパスワードを要求されます。 |
ldapsearch
ユーティリティから返される結果には、同期化されるすべての属性および値を含む、対象の全オブジェクトが含まれている必要があります。
接続ディレクトリへのエクスポート操作: ユーザー・アカウントに、Oracle Directory Integration Platformからユーザーをエクスポートする全コンテナの親であるサブツリー・ルートに対する、次の権限を付与します。
書込み
すべての子オブジェクトの作成
すべての子オブジェクトの削除
関連項目: ユーザー・アカウントに対する権限の付与方法の詳細は、接続ディレクトリのドキュメントを参照してください。 |
変更ロギングが有効な状態でOracleバックエンド・ディレクトリが稼働していることと、変更ログのパージ期間が7日以上に設定されていることを確認する必要もあります。
関連項目:
|
ORACLE_HOME/bin
ディレクトリにあるexpressSyncSetup
コマンドを使用すると、Express同期のためにインポートおよびエクスポート同期プロファイルを作成できます。
注意:
|
expressSyncSetup
expressSyncSetup -h HOST -p PORT -D wlsuser -pf PROFILE -conDirType CONNECTED_DIRECTORY_TYPE -conDirURL CONNECTED_DIRECTORY_URL -conDirBindDN CONNECTED_DIRECTORY_BIND_DN -conDircontainer SYNC_CONTAINER [-ssl -keystorePath PATH_TO_KEYSTORE -keystoreType TYPE] [-enableProfiles {true | false}] [-help]
-h | -host
Oracle Directory Integration PlatformがデプロイされているOracle WebLogic Serverホスト。
-p | -port
Oracle Directory Integration PlatformがデプロイされているOracle WebLogic管理対象サーバーのリスニング・ポート。
-D | wlsusser
Oracle WebLogic ServerのログインID。
注意: Oracle WebLogic Serverのログイン・パスワードを要求されます。パスワードをコマンド行引数として指定することはできません。最良のセキュリティ・プラクティスは、コマンドからの要求への応答としてのみ、パスワードを入力することです。スクリプトからexpressSyncSetup を実行する必要がある場合、Oracle WebLogic Serverパスワードを含むファイルから、入力をリダイレクトできます。ファイル権限を使用してファイルを保護し、不要になったら権限を削除します。expressSyncSetup に複数のパスワードを入力する必要がある場合、接続ディレクトリ・バインドDNパスワード、Oracle WebLogic Serverログイン・パスワードの順で、ファイル内の別々の行に記載します。 |
-pf | -profile
プロファイル名。ASCII以外の文字は「プロファイル名」ではサポートされていないため、プロファイルの名前をASCII文字のみを使用して指定します。
-conDirType
接続ディレクトリのタイプ。サポートされている値は、ActiveDirectory
、EDirectory
、iPlanet
、OpenLDAP
、ADAM
、Tivoli
、OID
およびExchangeServer2003
です。
-conDirUrl
接続ディレクトリが稼働しているURL。host:portという形式です。
-conDirBindDN
接続ディレクトリ・サーバーのバインドDN。次に例を示します。
administrator@idm2003.net
cn=orcladmin
cn=Directory Manager
注意: 接続ディレクトリのバインドDNパスワードを要求されます。パスワードをコマンド行引数として指定することはできません。最良のセキュリティ・プラクティスは、コマンドからの要求への応答としてのみ、パスワードを入力することです。スクリプトからexpressSyncSetup を実行する必要がある場合、接続ディレクトリ・バインドDNパスワードを含むファイルから、入力をリダイレクトできます。ファイル権限を使用してファイルを保護し、不要になったら権限を削除します。expressSyncSetup に複数のパスワードを入力する必要がある場合、接続ディレクトリ・バインドDNパスワード、Oracle WebLogic Serverログイン・パスワードの順で、ファイル内の別々の行に記載します。 |
-conDirContainer
同期コンテナ。次に例を示します。
ou=sales,dc=us,dc=com
ou=groups,dc=imtest,dc=com
cn=users,dc=imtest,dc=com
-ssl
SSLモードでコマンドを実行します。
注意: Oracle Directory Integration PlatformがデプロイされているOracle WebLogic管理対象サーバーは、SSLモードでこのコマンドを実行するようにSSLに対して構成されている必要があります。詳細は、『Oracle Fusion Middleware Oracle WebLogic Serverの保護』の「SSLの構成」を参照してください。 |
-keystorePath
キーストアへのフルパス。
-keystoreType
-keystorePath
で識別されるキーストアのタイプ。たとえば、-keystorePath jks
または-keystorePath PKCS12
などです。
-enableProfiles
作成されたプロファイルを有効にする場合はtrue
、有効にしない場合はfalse
を指定します。
-help
コマンドの使用方法のヘルプを提供します。
-search-size-limit
Oracle Directory Server Enterprise Editionがバックエンド・ディレクトリの場合、エントリ・サイズの制限としてunlimited
を指定します。
expressSyncSetup -h myhost.mycompany.com -p 7005 -D login_ID -pf myProfile \
-conDirType ACTIVEDIRECTORY -conDirUrl server.mycompany.com:5432 \
-conDirBindDN administrator@idm2003.net -conDirContainer ou=sales,dc=us,dc=com \
-enableProfiles false \
expressSyncSetup -help
expressSyncSetup
コマンドは、事前定義の仮定を使用して2つの同期プロファイル(インポート用およびエクスポート用)を作成することを可能にします。Oracle Directory Integration Platformがすでに稼働している場合は、プロファイルを有効にすると、ユーザーおよびグループが接続ディレクトリに格納されているコンテナとOracleバックエンド・ディレクトリ内のコンテナとの間で、ユーザーおよびグループの同期化をすぐに開始できます。
注意: 自分の環境用の同期プロファイルをカスタマイズする際に、デプロイ作業を容易にするためにテスト・ユーザーとテスト・グループを追加することが必要になる場合があります。同期プロファイルのカスタマイズとテストが終了したときには、必ずテスト・ユーザーとテスト・グループを削除してください。 |
構成を簡単にするために、expressSyncSetup
コマンドでは次のことを仮定します。
Oracle Internet Directoryでは、デフォルト・レルムのユーザーのエントリはコンテナcn=users,
default_realm_DN
内にありますが、Oracle Unified DirectoryおよびOracle Directory Server Enterprise Editionではデフォルト・レルムのユーザーはコンテナcn=users,
default_metadata_suffix
内にあります。
デフォルト・レルムのグループのエントリは、Oracle Internet Directoryではコンテナcn=groups,
default_realm_DN
内にあり、Oracle Unified DirectoryおよびOracle Directory Server Enterprise Editionではコンテナdefault_metadata_suffix内にあります。
インストール時に作成されたOracle Directory Integration Platformマスター・マッピング・ルール・ファイルは、$ORACLE_HOME/ldap/odi/conf
にあります。
マスター・ドメイン・マッピング・ルールは、$ORACLE_HOME/ldap/odi/conf/
ディレクトリにあります。
ログオン資格証明は、Oracleディレクトリ・サーバー内のユーザー・コンテナに対して、プロファイル、レルムおよびアクセス制御を構成するための十分な権限を持つOracle Directory Integration Platform管理者のものです。dipadmingrpのメンバーには、必要な権限があります。
Oracle Internet Directoryでは、Oracle Directory Integration Platform管理者グループは次のようになります。
cn=dipadmingrp,cn=dipadmins,cn=directory integration platform,cn=products,cn=oraclecontext
Oracle Unified DirectoryおよびOracle Directory Server Enterprise Editionでは、Oracle Directory Integration Platform管理者グループは次のようになります。
cn=dipadmingrp,cn=dipadmins,cn=directory integration platform,<suffix>
次の手順に従い、expressSyncSetup
コマンドを実行し、接続ディレクトリのcn=users,default_naming_context
とOracleバックエンド・ディレクトリのcn=users,
default_realm
との間で、ユーザーとグループが同期していることを確認します。
「expressSyncSetupの構文」を使用してExpress構成を実行します。
expressSyncSetup
コマンドにより、profile_name
Import
およびprofile_name
Export
という名前の2つのプロファイルが作成されます。デフォルトでは、どちらのプロファイルも無効になっています。接続ディレクトリからOracleバックエンド・ディレクトリへの同期が必要な場合はprofile_name
Import
プロファイル、Oracleバックエンド・ディレクトリから接続ディレクトリへの同期が必要な場合はprofile_name
Export
プロファイルを有効にします。activate
操作を指定してmanageSyncProfiles
コマンドを使用し、プロファイルを有効にします。
スケジューリングの間隔が経過するまで待ち、次のコマンドを入力して同期が開始されたことを確認します。コマンドを実行すると、権限のあるディレクトリ・ユーザーのパスワードを要求されます。
$ORACLE_HOME/bin/ldapsearch -h OID host -p OID port \ -D binddn -q \ -b "orclodipagentname=import profile,cn=subscriber profile,cn=changelog subscriber,cn=oracle internet directory" -s base "objectclass=*" orclodipsynchronizationstatus orclodiplastsuccessfulexecutiontime
注意: デフォルトのスケジューリング間隔は60秒(1分)です。Oracle Enterprise Manager Fusion Middleware Controlを使用すると、デフォルトのスケジューリング間隔を変更できます。Oracle Enterprise Manager Fusion Middleware Controlの使用方法は、第10章「ディレクトリ同期プロファイルの管理」を参照してください。 |
同期が正常に開始された場合は、次のようになります。
Synchronization Status
属性の値は、orclodipsynchronizationstatus
です。
Last orclodiplastsuccessfulexecutiontime
属性の値は、その実行の特定の日時です。この値は、現在の日時に近い値である必要があります。
次に、正常な同期を示す結果の例を示します。
orclodiplastsuccessfulexecutiontime 20060515012615
注意:
|
同期が開始されていることを確認した後、Oracleバックエンド・ディレクトリと接続ディレクトリ内のエントリを調べ、接続ディレクトリのcn=users,default_naming_context
とOracleバックエンド・ディレクトリのcn=users,
default_realm
間で、ユーザーおよびグループが同期していることを確認します。
注意: インポートとエクスポートの同期プロファイルをうまくカスタマイズするためには、その他の構成タスクがすべて終了するまで、SSLを有効にしないでください。 |
Oracle Directory Integration Platformをインストールすると、サポート対象のOracleおよびサード・パーティの接続ディレクトリごとにインポートおよびエクスポートの同期プロファイルのサンプルが自動的に作成されます。インストール・プロセス時またはexpressSyncSetup
コマンドによって作成されたインポートおよびエクスポートの同期プロファイルは、Oracleバックエンド・ディレクトリと接続ディレクトリの統合をデプロイする際に使用する開始点としてのみ利用されます。デフォルトの同期プロファイルは事前定義の仮定を使用して作成されるため、次の項目で説明されているように、環境に合せてそれらをさらにカスタマイズする必要があります。
関連項目: インストール・プロセス時に作成されたサンプルの同期プロファイルの詳細は、個々の接続ディレクトリ統合に関する章を参照してください。 |
インストール・プロセス時に作成された同期プロファイルのサンプルをカスタマイズするには、manageSyncProfiles
コマンドのcopy
操作でそれらのプロファイルをコピーし、manageSyncProfiles
コマンドのactivate
操作でそのコピーを有効にします。
注意: Oracleバックエンド・ディレクトリがOracle Unified DirectoryまたはOracle Directory Server Enterprise Editionである場合、これらのディレクトリのデフォルト・コンテナは、メタデータの接尾辞となります。このため、cn=users, <metadata_suffix>およびcn=groups, <metadata_suffix>エントリを追加して、ドメイン・マッピング・ルールを更新することが必要となる場合があります。 |
レルムを構成する手順は、次のとおりです。
「ディレクトリ情報ツリーの構造の選択」での説明や、「デプロイの計画」でのより具体的な説明に従って、レルム識別名構造を選択します。
ユーザーのログイン名の属性を選択します。この属性には、ログインに使用される属性の名前が含まれます。デフォルトではuid
です。詳細は、「ログイン名の属性の選択」を参照してください。
Microsoft Active Directoryと統合して、userprincipalname
属性をログインに使用する場合は、userprincipalname
をOracleバックエンド・ディレクトリのuid
属性にマップします。
Novell eDirectoryまたはOpenLDAPと統合して、mail
属性をログインに使用する場合は、mail
をOracleバックエンド・ディレクトリのuid
属性にマップします。
Oracleバックエンド・ディレクトリでusersearchbase
値とgroupsearchbase
値を設定します。これらの値によって、Oracleバックエンド・ディレクトリ内でユーザーおよびグループを検索する場所が、各種Oracleコンポーネントに指定されます。これらの値は、インストール時にデフォルトの値に設定されます。ただし、2つのディレクトリ内のDIT構造に対応するように、これらの値をリセットすることが必要になる場合があります。これらを正しく設定してください。間違って設定すると、同期が正常に機能していても、コンポーネントがOracleバックエンド・ディレクトリのユーザーやグループにアクセスできないままになる可能性があります。
ユーザー検索ベースとグループ検索ベースを構成する場合、例のように、usersearchbase
の値は、cn=users,dc=us,dc=MyCompany,dc=com
またはその親の1つに設定する必要があります。同様に、DITにgroups
というサブツリーがあるとすると、複数の値のあるgroupsearchbase
属性は、次の両方に設定します。
cn=groups,dc=us,dc=MyCompany,dc=com
またはその親の1つ
cn=users,dc=us,dc=MyCompany,dc=com
Oracle Directory Services Manager (Oracle Unified DirectoryおよびOracle Internet Directoryの場合)またはDirectory Service Control Center (Oracle Directory Server Enterprise Editionの場合)を使用して、ユーザー検索ベースとグループ検索ベースを構成します。
Oracleバックエンド・ディレクトリでusercreatebase
値とgroupcreatebase
値を設定します。これらの値は、各種Oracleコンポーネントに、ユーザーおよびグループを作成できる場所を指定します。これらの値は、インストール時にデフォルトの値に設定されます。
ユーザー作成ベースとグループ作成ベースを構成する場合、例のように、usercreatebase
の値は、cn=users,dc=us,dc=MyCompany,dc=com
またはその親の1つに設定する必要があります。同様に、groupcreatebase
はcn=groups,dc=us,dc=MyCompany,dc=com
またはその親の1つに設定します。
Oracle Directory Services Manager (Oracle Unified DirectoryおよびOracle Internet Directoryの場合)またはDirectory Service Control Center (Oracle Directory Server Enterprise Editionの場合)を使用して、ユーザー作成ベースとグループ作成ベースを構成します。
この項では、インポート・プロファイル、エクスポート・プロファイルおよびその他のOracleコンポーネント用に、ACLをカスタマイズする方法を説明します。内容は次のとおりです。
インポート・プロファイルは、Oracle Directory Integration Platformによって使用されるアイデンティティを使用して、Oracleバックエンド・ディレクトリにアクセスします。ACLにより、ユーザー・コンテナおよびグループ・コンテナ、またはアクセスするエントリのあるサブツリーで、インポート・プロファイルによるオブジェクトの追加、変更および削除ができるようにする必要があります。デフォルトでは、インポート・プロファイルは、DIP管理者グループ(cn=dipadmingrp,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext
)およびインポート・プロファイル・グループ(cn=odipigroup,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext
)に含まれます。これらのグループは、cn=oraclecontext接尾辞に対する適切な権限を持っていますが、インポート・プロファイルに対して必須アクションを実行するための適切な権限を付与する必要があります。このグループは、デフォルト・レルムのDNの下にある任意のエントリに対するすべての操作を実行できる権限を持っています。
Oracle Unified DirectoryまたはOracle Directory Server Enterprise Editionバックエンド・ディレクトリ用のACLのカスタマイズ
Oracleバックエンド・ディレクトリがOracle Unified DirectoryまたはOracle Directory Server Enterprise Editionのいずれかである場合、インポート・プロファイルでは、メタデータの接尾辞のDNの下にあるユーザーおよびグループを追加、変更および削除できます。メタデータ以外の接尾辞の場合は、ACLを次のように設定して、コンテナが他のソースからユーザーおよびグループをインポートできるようにする必要があります。
dn: <Container DN> changeType: modify add: aci aci: (target="ldap:///<Container DN>")(version 3.0; acl "Entry-level DIP permissions"; allow (all,proxy) groupdn="ldap:///cn=dipadmingrp,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext"; allow (all,proxy) groupdn="ldap:///cn=odipigroup,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext"; ) - add: aci aci: (targetattr="*")(version 3.0; acl "Attribute-level DIP permissions"; allow (all,proxy) groupdn="ldap:///cn=dipadmingrp,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext"; allow (all,proxy) groupdn="ldap:///cn=odipigroup,cn=DIPadmins,cn=Directory Integration Platform,cn=Products,cn=OracleContext";)
Oracle Unified DirectoryまたはOracle Directory Server Enterprise Editionバックエンド・ディレクトリ用のLDIF ACLのカスタマイズ
前述のACLの例を参照してください。<Container DN>
は、必要に応じて操作が実行されるDNに置き換えてください。
次のldapmodify
コマンドを使用して、LDIFファイルをアップロードできます。
$ORACLE_HOME/bin/ldapmodify -h <backend-host> -p <backend-port> -D <binddn> -f <ldif-file>
コマンドを実行すると、権限のあるディレクトリ・ユーザーのパスワードを要求されます。
Oracle Internet Directoryバックエンド・ディレクトリ用のACLのカスタマイズ
Oracleバックエンド・ディレクトリがOracle Internet Directoryである場合は、Oracle Internet Directoryリリース11gリリース1(11.1.1)とともにインストールされるデフォルト・レルムとのインポートの同期用にACLをカスタマイズする必要はありません。それより前のリリースのOracle Internet Directoryからアップグレードする場合、あるいはデフォルト以外のOracle Internet Directoryレルムと同期が行われる場合、適切なサブツリーまたはコンテナで必要な権限が、同期を処理するインポート・プロファイルに付与されていることを確認します。
関連項目: 『Oracle Fusion Middleware Oracle Internet Directory管理者ガイド』のアクセス制御に関する章 |
Oracle Internet Directoryバックエンド・ディレクトリ用のLDIF ACLのカスタマイズ
LDIF形式のACLテンプレートは、$ORACLE_HOME/ldap/schema/oid/oidRealmAdminACL.sbs
ファイルを参照してください。Oracleバックエンド・ディレクトリがOracle Internet Directoryであり、デフォルト・レルムでACLを変更していない場合、このテンプレート・ファイルは、置換変数をインスタンス化し、%s_SubscriberDN%
をOracle Internet Directoryのデフォルト・レルムDNで、%s_OracleContextDN%
をcn=OracleContext
,default_realm_DN
でそれぞれ置換すると、直接適用できます。
たとえば、realmacl.ldif
がインスタンス化されたファイルの場合、次のldapmodify
コマンドを使用してアップロードできます。
$ORACLE_HOME/bin/ldapmodify -h <backend-host> -p <backend-port> -D <binddn> -f <ldif-file>
コマンドを実行すると、権限のあるディレクトリ・ユーザーのパスワードを要求されます。
Oracle Directory Integration Platformから接続ディレクトリにアクセスできるようにするには、接続ディレクトリでアイデンティティを作成する必要があります。このアイデンティティは、各エクスポート・プロファイルで構成されます。
デフォルト・レルム外にあるユーザー・レコードの同期をサポートするためのACLのカスタマイズ方法
Oracleバックエンド・ディレクトリがOracle Internet Directoryであり、Oracle Internet Directoryデフォルト・レルム外にあるユーザー・レコードを同期する必要がある場合は、LDIFファイルを使用して、次のようにACLを変更します。
注意: このACLの変更は、DIP同期を使用して、デフォルト・レルム外にあるOIDユーザー・パスワードを接続ディレクトリにエクスポートする場合に必要です。 |
ルート・ディレクトリ固有のエントリでACIを問い合せ、出力をLDIFファイルにバックアップとして保存します。
ldapsearch -h OID host -p port -D cn=orcladmin -w password -s base -L -b "" objectclass=* orclaci orclentrylevelaci > /tmp/orig-root-acis.ldif
次のACIを探します。
orclaci: access to attr=(userpkcs12,orclpkcs12hint,userpassword,pwdhistory,orclrevpwd) by group="cn=OracleUserSecurityAdmins,cn=Groups,cn=OracleContext" (search,read,write,compare) by self (search,read,write,compare) by * (none)
DIP DNを含めるようにACIを変更し、new-root-acis.ldif
という名前でファイルを保存します。
変更されたファイルは次のようになります。
orclaci: access to attr=(userpkcs12,orclpkcs12hint,userpassword,pwdhistory,orclrevpwd) by group="cn=OracleUserSecurityAdmins,cn=Groups,cn=OracleContext" (search,read,write,compare) by self (search,read,write,compare) by dn="cn=odisrv,cn=Registered Instances,cn=Directory Integration Platform,cn=products,cn=oraclecontext" (search,read)* by * (none)
ファイルの最初の行の後に次の2行を追加します。
changetype: modify replace: orclaci
ファイルの先頭の正しい内容は次のとおりです。
dn: Container DN
changetype: modify
replace: orclaci
orclaci: access to
...
ldapmodify
コマンドを使用して、変更されたACIを適用します。
$ORACLE_HOME/bin/ldapmodify -h <backend-host> -p <backend-port> -D <binddn> -f <ldif-file>
同期プロファイルの重要な要素であるマッピング・ルールは、同期化されるディレクトリ情報、および同期化されたときのディレクトリ情報の変換方法を決定します。マッピング・ルールは、要件にあわせて実行時に変更できます。
サンプルの同期プロファイルには、それぞれデフォルトのマッピング・ルールが含まれています。これらのルールには、デフォルトで同期用に構成された、最小限のデフォルトのユーザー属性およびグループ属性が含まれています。
注意: 進行中の同期は、ディレクトリ内の変更より前に構成されたマッピング・ルールに依存します。マッピングの一貫性を確実にするには、同期化済のエントリを削除するか、完全同期を実行することが必要な場合があります。 |
マッピング・ルールにより、ソース・ディレクトリと宛先ディレクトリが同期化されるときに、データを変換する方法が決定されます。次の変更を行う必要がある場合は、サンプル・プロファイルにあるデフォルトのマッピング・ルールをカスタマイズします。
識別名マッピングの変更。識別名マッピングにより、接続ディレクトリのDITをOracleバックエンド・ディレクトリのDITにマップする方法を決定します。
同期化する必要がある属性の変更。
同期時に発生する変換(マッピング・ルール)の変更。
宛先ディレクトリで変換の結果得られたデータがそのディレクトリのスキーマに一致すれば、どのようなマッピングでも実行できます。
関連項目:
|
Oracleバックエンド・ディレクトリと接続ディレクトリ間の同期を確立すると、同期プロファイルの属性マッピング・ルールを、デプロイの要件を満たすようにカスタマイズできます。
同期プロファイルの属性マッピング・ルールをカスタマイズする手順は、次のとおりです。
サンプルのマッピング・ルール・ファイルの複製を作成します。サンプルのマッピング・ルール・ファイルは、$ORACLE_HOME/ldap/odi/conf
ディレクトリにあり、各種プロファイル用にmap.master
の拡張子が付いています。
前述の変更を行うために、サンプル・マッピング・ルール・ファイルを編集します。マッピング・ルールの編集方法は、「マッピング・ルールの構成」を参照してください。
変更後、manageSyncProfiles
コマンドのupdate
操作を使用してプロファイルを更新します。たとえば、次のコマンドは、プロファイル名myImportProfile
をmyPropertiesFile
という名前のプロパティ・ファイルで更新します。
manageSyncProfiles update -profile profile_name -file myPropertiesFile
関連項目: 『Oracle Fusion Middleware Oracle Identity Managementリファレンス』の「Oracle Directory Integration Platformツール」のmanageSyncProfilesに関する項を参照してください。 |
スケジューリングの間隔が経過するまで待ってから、同期化されたユーザーおよびグループをチェックし、属性マッピング・ルールが要件を満たしていることを確認します。
ヒント: 属性マッピング・ルールをカスタマイズする際に、テスト・ユーザーとテスト・グループをOracleバックエンド・ディレクトリまたは接続ディレクトリに追加すると便利です。 |
デフォルトでは、expressSyncSetup
コマンドにより作成されたインポートおよびエクスポート同期プロファイルに対して、SSLは使用できません。SSLモードで同期化するかどうかは、デプロイ要件によって決まります。たとえば、SSLは、パブリック・データの同期化には必要ありませんが、パスワードなどの機密情報の同期化には必要です。Oracleバックエンド・ディレクトリと接続ディレクトリ間で、パスワードの変更を同期化するには、SSLサーバー認証モードを使用する必要があります。
注意: 同期プロファイルをSSL用に構成する前に、非SSLモードでユーザーを正常に同期化できることを確認してください。 |
チャネルを保護するには、次のことが必要です。
Oracleバックエンド・ディレクトリとOracle Directory Integration Platform間でのSSLの有効化
Oracle Directory Integration Platformと接続ディレクトリ間でのSSLの有効化
Oracleバックエンド・ディレクトリとOracle Directory Integration Platform間のSSLまたはそのサーバーと接続ディレクトリ間のSSLを有効にできますが、機密情報を同期化する前に、完全にチャネルを保護することをお薦めします。パスワードの同期化などの場合は、SSLを介してのみ同期化を行うことができます。
SSLを構成するには、次のことを実行する必要があります。
『Oracle Fusion Middleware Oracle Internet Directory管理者ガイド』のSecure Sockets Layer(SSL)に関する章の説明に従って、Oracleディレクトリ・サーバーをSSLモードで実行します。
第2章「Oracle Directory Integration Platformのセキュリティ機能」の説明に従って、Oracle Directory Integration PlatformをSSLモードで実行します。Directory Integration PlatformのSSLモードは、Oracleバックエンド・ディレクトリ・サーバーの起動時に使用されたものと同じモードである必要があります。SSLモード1は認証なし、SSLモード2はサーバー認証です。
注意: Oracleバックエンド・ディレクトリがOracle Internet Directoryである場合、Oracle Directory Integration Platformでは、認証なしのSSLモード(SSLモード1)のみをサポートします。Oracle Unified DirectoryまたはOracle Directory Server Enterprise EditionがOracleバックエンド・ディレクトリである場合、使用できるSSLはSSLサーバー認証(SSLモード2)のみとなります。 |
接続ディレクトリ・サーバーをSSLモードで実行します。SSLを介した接続ディレクトリとの通信では、SSLサーバー認証が必要です。これには、Oracleバックエンド・ディレクトリとOracle Directory Integration Platformの両方をSSLサーバー認証モードで実行する必要があります。
次の手順を実行し、SSLモードでの接続ディレクトリとの通信を構成します。
接続されているディレクトリ用の証明書を生成します。サーバーからのトラスト・ポイント証明書のみ必要です。接続されているディレクトリの証明書ストアに証明書を格納します。
信頼できる認証局(CA)証明書をBase 64エンコードされた形式にエクスポートします。
keytoolコマンドを使用して信頼できるCA証明書をJavaキーストア(JKS)にインポートします。Oracle Directory Integration Platformで既存のJKSをすでに使用している場合、-keystore
PATH_TO_JKS
オプションを使用して、その場所を特定します。Oracle Directory Integration Platformにまだ使用するJKSがない場合、-keystore
PATH_TO_JKS
オプションで特定した場所にkeytoolによって作成されます。
次に例を示します。
keytool –importcert –trustcacerts –alias mycert –file PATH_TO_JKS \ -keystore PATH_TO_JKS
-keystore
PATH_TO_JKS
オプションで特定されたJKSを初めて使用する場合、パスワードを指定し、次のステップaおよびbも実行する必要があります。
manageDIPServerConfigコマンドを使用して、手順3
で使用した場所とパスワードを用いてDirectory Integration Platformの構成を更新します。次に例を示します。
manageDIPServerConfig set -h HOST –p PORT -D WLS_USER \ -attribute keystorelocation -value PATH_TO_JKS
次のWLSTコマンドを使用して、PASSWORD変数を、キーストアの作成時に使用したパスワードに置き換え、資格証明ストア・フレームワーク(CSF)の資格証明を更新します。
createCred(map="dip", key="jksKey", user="jksUser",
password="PASSWORD",desc="jks password")
manageSyncProfilesコマンドの変更操作を使用して、ホスト名、プロファイルおよびconnectedDirectoryURL
属性を含む接続ディレクトリ接続情報を変更します。
manageSyncProfiles update -profile profile_name -file myMapFile
connectedDirectoryURL
属性を構成する場合、次の形式を使用します。
host:port:sslmode
sslmode
に対してサポートされる値は次のとおりです。
ステップ3で新規JKSを使用した場合、Oracle Directory Integration PlatformをSSLモードで再起動する必要があります。ステップ3で既存のJKSを使用した場合、6に進みます。
テスト・ユーザーを追加し、正常に同期することを確認します。テスト・ユーザーが正常に同期しない場合、SSL構成のトラブルシューティングを行います。
注意: Oracle Directory Integration Platformでは、クライアント/サーバー認証モードでのSSLはサポートされていません。 |
詳細は、第9.8項「パスワード同期」を参照してください。
Oracle Internet Directoryでは、Javaベースの外部認証プラグインがサポートされます。Microsoft Active DirectoryおよびOracle Directory Server Enterprise Edition/Sun Java System Directory Serverにしか対応していない以前のPL/SQLベースのプラグインのかわりに、Javaプラグインを使用することをお薦めします。
プラグイン用の構成ツールはoidexcfg
というJavaプログラムです。このプログラムを使用して、Microsoft Active Directory、Oracle Directory Server Enterprise Edition(Sun Java System Directory Server)、Novell eDirectory、IBM Tivoli Directory ServerおよびOpenLDAPのJavaベースの外部認証プラグインを構成します。
注意: oidexcfg ツールでは、単一ドメインで機能するようにしか外部認証プラグインを構成しません。複数ドメインで機能するように外部認証プラグインを設定するには、「複数のドメインに対する外部認証の構成」に記載されている手順を実行する必要があります。 |
外部認証プラグインを構成するには、次の手順を実行します。
(オプション) SSLを使用して認証プラグインと外部LDAPディレクトリ間との通信を保護する場合にのみ、この手順を実行します。通信を保護しない場合は、手順2に進みます。
SSLを使用して認証プラグインと外部LDAPディレクトリ間の通信を保護するには、外部の認証ディレクトリの信頼できる証明書がファイル・システム上のウォレットに存在する必要があります。手順3
でoidexcfgを使用してプラグインを構成すると、外部LDAPディレクトリ構成に関する情報の入力を要求され、このウォレットの場所を識別できます。
SSLを使用する場合、ここで証明書を新規または既存のウォレットに配置します。
注意: 証明書は、認証プラグインと外部LDAPディレクトリ間の通信をSSLによって保護できるようにします(手順3 でoidexcfgを実行した場合は、Oracleバックエンド・ディレクトリとの通信は保護されません)。 |
JavaのCLASSPATH環境変数にoidexcfg.jar
およびldapjclnt11.jar
を含めます。環境変数を設定するには、次のようにします。
UNIX/Linux環境:
setenv CLASSPATH=$ORACLE_HOME/ldap/jlib/oidexcfg.jar:$ORACLE_HOME/ldap/jlib/ldapjclnt11.jar:$CLASSPATH
Windows環境:
set CLASSPATH=%ORACLE_HOME%/ldap/jlib/oidexcfg.jar;%ORACLE_HOME%/ldap/jlib/ldapjclnt11.jar;%CLASSPATH%
次のコマンドを実行し、oidexcfg
を使用してプラグインを構成します。SSLに必要な信頼できる証明書を含むウォレットの場所など、外部LDAPディレクトリ構成に関する情報の入力を要求されます。
注意: 次のように、完全修飾パスを使用してウォレットの場所を指定する必要があります。/etc/ORACLE_HOME/wallets/ewallet.p12 |
次のコマンドを実行し、oidexcfg
を使用してプラグインを構成します。
java -classpath $CLASSPATH oracle.ldap.extplg.oidexcfg -h OID_Host -p OID_Port -D BindDN -w password -t Directory_Type
ディレクトリ・タイプを指定する-tオプションは、次の値をサポートしています。
ad
: Microsoft Active Directory
adam
: Microsoft Active Directory Application Mode
iplanet
: Oracle Directory Server Enterprise EditionおよびSun Java System Directory Server
edirectory
: Novell eDirectory
openldap
: OpenLDAP
tivoli
: IBM Tivoli Directory Server
外部認証プラグインを設定して複数の外部認証ドメインで動作させる場合は、外部構成ツールを実行した後にいくつかの手順を手動で実行する必要があります。次のように設定を続行します。
「外部認証プラグインの構成」で説明されているように、外部認証プラグインを構成します。
手順1で構成ツールにより作成されたプラグイン構成エントリを検索し、検索結果をファイルに出力します。次のようなldapsearch
コマンドを使用します。
ldapsearch -p 3060 -D binddn -q -s sub -L \
-b "cn=plugin,cn=subconfigsubentry" cn="oidexplg_*_ad" >> output.ldif
注意: パスワードを要求されます。 |
この例では、Microsoft Active Directoryのcn
が表示されます。表20-2に示すように、構成したプラグインのタイプに正しいプラグインのcn
を使用します。例に示すように、*
をワイルドカードとして使用できます。
表20-2 外部認証プラグインの識別名
プラグイン・タイプ | DN |
---|---|
Microsoft Active Directory |
|
Oracle Directory Server Enterprise Edition |
|
Novell eDirectory |
|
OpenLDAP |
|
出力ファイルを調べます。Microsoft Active Directoryプラグインの場合、出力ファイルは次のようになります。
dn: cn=oidexplg_compare_ad,cn=plugin,cn=subconfigsubentry cn: oidexplg_compare_ad objectclass: orclPluginConfig objectclass: top orclpluginname: oidexplg.jar orclplugintype: operational orclpluginkind: Java orclplugintiming: when orclpluginldapoperation: ldapcompare orclpluginsecuredflexfield;walletpwd: password orclpluginsecuredflexfield;walletpwd2: password orclpluginversion: 1.0.1 orclpluginisreplace: 1 orclpluginattributelist: userpassword orclpluginentryproperties: (!(&(objectclass=orcladobject)(objectclass=orcluserv2))) orclpluginflexfield;host2: host.domain.com orclpluginflexfield;port2: 636 orclpluginflexfield;isssl2: 1 orclpluginflexfield;host: host.domain.com orclpluginflexfield;walletloc2: /location/wallet orclpluginflexfield;port: 389 orclpluginflexfield;walletloc: /tmp orclpluginflexfield;isssl: 0 orclpluginflexfield;isfailover: 0 orclpluginclassreloadenabled: 0 orclpluginenable: 0 orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com dn: cn=oidexplg_bind_ad,cn=plugin,cn=subconfigsubentry cn: oidexplg_bind_ad objectclass: orclPluginConfigobjectclass: top orclpluginname: oidexplg.jar orclplugintype: operational orclpluginkind: Java orclplugintiming: when orclpluginldapoperation: ldapbind orclpluginversion: 1.0.1 orclpluginisreplace: 1 orclpluginentryproperties: (!(&(objectclass=orcladobject)(objectclass=orcluserv2))) orclpluginclassreloadenabled: 0 orclpluginflexfield;walletloc2: /location/wallet orclpluginflexfield;port: 389 orclpluginflexfield;walletloc: /tmp orclpluginflexfield;isssl: 0 orclpluginflexfield;isfailover: 0 orclpluginflexfield;host2: host.domain.com orclpluginflexfield;port2: 636 orclpluginflexfield;isssl2: 1 orclpluginflexfield;host: host.domain.com orclpluginenable: 0 orclpluginsecuredflexfield;walletpwd: password orclpluginsecuredflexfield;walletpwd2: password orclpluginsubscriberdnlist: cn=users,dc=us,dc=oracle,dc=com
次のように、出力ファイルからLDIFファイルを新規作成します。
エントリ名を変更します。前の手順で示した例では、cn=oidexplg_compare_ad,cn=plugin, cn=subconfigsubentry
をcn=oidexplg_compare_
ad1
, cn=plugin,cn=subconfigsubentry
に、cn=oidexplg_bind_ad, cn=plugin,cn=subconfigsubentry
をcn=oidexplg_bind_
ad1
, cn=plugin,cn=subconfigsubentry
に変更します。
orclpluginenable
の値を変更します。有効にする場合は値1
を、無効にする場合は値0
を使用します。
外部ディレクトリのホスト名とポート番号について、orclpluginflexfield;host
とorclpluginflexfield;port
の値を変更します。
orclpluginflexfield;isssl
の値を変更します。外部ディレクトリに対してSSL接続を有効にする場合は値1
を、無効にする場合は値0
を使用します。値1
を使用する場合は、ウォレット・ロケーションとパスワードについて、orclpluginflexfield;walletloc
とorclpluginsecuredflexfield;walletpwd
の値も変更する必要があります。
orclpluginflexfield;isfailover
の値を変更します。バックアップ外部ディレクトリに対してフェイルオーバーを設定する場合は、値1
を使用します。値1
を使用する場合は、ホスト名とポート番号について、orclpluginflexfield;host2
とorclpluginflexfield;port2
の値も変更する必要があります。バックアップ・ディレクトリ・サーバーに対してSSL接続を使用するには、orclpluginflexfield;walletloc2
とorclpluginsecuredflexfield;walletpwd2
の値を変更する必要があります。
プラグインの起動ネーミング・コンテキストについて、orclpluginsubscriberdnlist
を変更します。
プラグインのリクエスト・グループについて、orclPluginRequestGroup
を変更します。この属性が検索結果の出力にない場合は、LDIFファイルに属性と値を追加します。
変更したプラグイン構成エントリをOracle Internet Directoryサーバーに追加します。次のようなコマンドを使用します。
$ORACLE_HOME/ldap/bin/ldapadd -h host -p port -D binddn -q \ -v -f input.ldif
注意: パスワードを要求されます。 |
Oracle Directory Integration Platformは、カスタム同期コネクタをサポートします。このトピックにはカスタム・コネクタの記述に役立つ情報が説明されおり、次の項が含まれます。
インバウンド・コネクタを記述するには、次の手順を実行します。
リーダーを実装します。リーダーは、一般的にターゲット・システムのコネクタ・クラスを拡張してDISReadInterfaceを実装します。DISReadInterfaceの様々なメソッドは、javadoc内で指定されます。リーダーの実装例は、「サンプル・リーダー」を参照してください。
構成ファイルのサンプルを作成します。一般的な構成ファイルを次に示します。
[INTERFACEDETAILS]
Reader: Complete_classname_including_packageName
SkipErrorToSyncNextChange: false
SearchDeltaSize: 500
UpdateSearchCount: 100
一連のマッピング・ルールを含むマップ・ファイルを作成します。
configfileパラメータ、mapfileパラメータおよびfilterパラメータを設定してプロパティ・ファイルを作成します。
インバウンド・コネクタのテスト手順:
manageSyncProfilesコマンドのregister操作を使用して、テスト・プロファイルを作成します。詳細は、「manageSyncProfilesを使用した同期プロファイルの管理」を参照してください。
ロギング・メッセージを検証します。
Oracle Internet Directoryを調べ、発生した同期を検証して、適切なエントリが作成されたか確認します。
package oracle.ldap.odip.gsi; import oracle.ldap.odip.engine.AttrHandler; import oracle.ldap.odip.engine.ChangeRecord; import oracle.ldap.odip.engine.Connector; import oracle.ldap.odip.engine.ConfigReader; import oracle.ldap.odip.engine.Constants; import oracle.ldap.odip.engine.DISReadInterface; import oracle.ldap.odip.engine.DISFilterInterface; import oracle.ldap.odip.engine.ODIException; import oracle.ldap.odip.engine.Debug; import oracle.ldap.odip.map.MapRules; import oracle.ldap.odip.map.OrclFilter; import oracle.ldap.odip.util.Utils; //Imports added for ODLLogger import oracle.core.ojdl.logging.ODLLogger; import oracle.dms.context.ExecutionContext; import oracle.core.ojdl.logging.ODLLevel; import oracle.core.ojdl.logging.ODLHandler; import java.util.logging.Handler; import java.util.logging.Level; import oracle.ldap.odip.DIPLogger; public class SampleReader implements DISReadInterface { /* ** Member variables used */ protected NamingEnumeration mEnumerate; protected Attributes mAttribs; protected Attribute mAttrib; protected Attribute mAttribAllValues; protected SearchResult mResult; protected MapRules mMapRules; /* ** Vector to store the list of required attributes */ protected Vector mReqAttrList = new Vector(); /* ** List of source attributes whose changes need to be mapped */ protected Vector mSrcAttrList = new Vector(); protected String mMapFilter; protected int mAppliedChangeNum = 0; protected int mAvailableChangeNum = 700; protected DISFilterInterface mFilter; /* ** LastChangeNumber that is read */ protected String mReadChangeNum; /* ** List of attributes to be returned in changelog LDAPSearch */ protected String[] mRetAttribs; private int mErrorCode = 0; /* ** Constructor */ public SampleReader() { } /** ** Constructor with the connector */ public SampleReader( Connector conn ) { super(conn); } /** ** Get the last change key value ** * @param boolean Operation is success/failure * @return Object lastkeyvalue to be stored */ public Object getLastChangeKey(boolean val) { if ( val == false ) { int nval = Integer.parseInt(mReadChangeNum); if ( nval > 0 ) { nval--; } mReadChangeNum = String.valueOf(nval); } return (mReadChangeNum); } /** ** Initializes required values from hashtable passed from Profile ** ** @param Connector connection details with credentials ** @param Hashtable with the required parameters ** @throws ODIException Indicating connection failure */ public void initialise(Connector conn,Hashtable pHash) throws ODIException { m_logger.finest ( "Entry: SampleReaders.initialise"); setValues(conn); mMapRules = (MapRules)pHash.get(Constants.MAPRULE_STR); readCtx = connect(); pHash.put("READCONTEXT", readCtx); pHash.put(Constants.READERCHANGEKEY_STR, Constants.CHANGE_NUM); String key = (String)pHash.get(Constants.LASTAPPLIEDCHG_STR); String val = null; if ( key != null ) val = (String)pHash.get(key); if ( val != null ) mAppliedChangeNum = Integer.parseInt((String)pHash.get(key)); mReadChangeNum = (String)pHash.get(key); pHash.put(key, mReadChangeNum); mFilter = (DISFilterInterface)pHash.get(Constants.MATCHRULE_STR); mAvailableChangeNum = Integer.parseInt(initAvailableChgKey()); mSaveLastChgNum = mAppliedChangeNum; try { SearchControls pControls = new SearchControls(); pControls.setSearchScope(SearchControls.OBJECT_SCOPE); pControls.setReturningAttributes(mRetAttribs); pControls.setTimeLimit(3000000); mEnumerate = mLdapCtx.search("","objectclass=*",pControls); while ( mEnumerate.hasMoreElements() ) { mResult = (SearchResult)mEnumerate.nextElement(); mAttribs = mResult.getAttributes(); } // END INFEASIBLE ConfigReader configInfo = (ConfigReader) pHash.get(Constants.CONFINFO_STR); if (configInfo != null) { mUpdateSearchCount = configInfo.getUpdateSearchCount(); mSearchDelta = configInfo.getSearchDeltaSize(); } } catch (Exception ex) // BEGIN INFEASIBLE { throw new ODIException(ODIException.LDAP_INITIALIZATION_EXCEPTION,ex); } // END INFEASIBLE m_logger.finest ( "Exit: SampleReaders.initialise"); } /** ** Search the changelog ** @throws ODIException */ public int searchChanges() throws ODIException { int temp; int searchDelta = (int) mSearchDelta; if ( mAvailableChangeNum <= mAppliedChangeNum ) return -1; int minChgNum = mAppliedChangeNum+1; if ( mAvailableChangeNum - mAppliedChangeNum >= searchDelta) temp = mAppliedChangeNum + searchDelta; else temp = mAvailableChangeNum; String searchF = ""; if ( mFilter != null ) { searchF = mFilter.getSearchFilter(); m_logger.log(ODLLevel.NOTIFICATION,"SEARCHF", searchF ); } StringBuffer filter = new StringBuffer(300); /** * SearchChanges is called to get all changes * */ try { mEnumerate = mReadCtx.search( filter.toString()); } catch ( Exception ex ) // BEGIN INFEASIBLE { throw ( new ODIException(ODIException.LDAP_SEARCH_EXCEPTION, ex) ); } finally { m_logger.log(ODLLevel.NOTIFICATION, "SEARCH_SUCCESSFUL" ,new Integer( temp )); mAppliedChangeNum = temp; return mErrorCode; } public boolean hasMore() throws ODIException { boolean retval = false; int count =0; try { if ( mEnumerate.hasMoreElements() ) { retval = true; } else { while ( mAvailableChangeNum > mAppliedChangeNum ) { if ( count >= mUpdateSearchCount ) break; searchChanges(); count++; if (mEnumerate.hasMoreElements()) { retval = true; break; } else mReadChangeNum = String.valueOf(mAppliedChangeNum); } } } catch( Exception ex ) // BEGIN INFEASIBLE { throw (new ODIException(ODIException.LDAP_HASMORE_EXCEPTION,ex)); } // END INFEASIBLE if (retval == false) { // no more results mReadChangeNum = (new Integer(mAvailableChangeNum)).toString(); } return retval; } /** ** Read the next change from the source ** ** @return Object the header part of the changes read. */ public Object getNextChange() throws ODIException { try { if ( mEnumerate.hasMoreElements() ) { mResult = (SearchResult)mEnumerate.nextElement(); mAttribs = mResult.getAttributes(); } catch ( Exception e ) // BEGIN INFEASIBLE { throw (new ODIException (ODIException.LDAP_GETNEXT_EXCEPTION, e)); } // END INFEASIBLE return mAttribs; } /** ** Create the change record from the data read from the file. ** ** @returns ChangeRecord */ public ChangeRecord createChangeRecord(String dn) throws ODIException { // Create the changerecord based on the mAttribs which contains all the attributes. } public String initAvailableChgKey() throws ODIException { // set the available changekey value. This reads the value equivalent to the latest changelog number in the ldap world. } }
アウトバウンド・コネクタを記述するには、次の手順を実行します。
ライターを実装します。ライターは、一般的にターゲット・システムのコネクタ・クラスを拡張してDISWriteInterfaceを実装します。DISWriteInterfaceの様々なメソッドは、Javadoc内で指定されます。リーダーの実装例は、「サンプル・ライター」を参照してください。
構成ファイルのサンプルを作成します。一般的な構成ファイルを次に示します。
[INTERFACEDETAILS]
Reader: Complete_classname_including_packageName
SkipErrorToSyncNextChange: false
SearchDeltaSize: 500
UpdateSearchCount: 100
一連のマッピング・ルールを含むマップ・ファイルを作成します。
configfileパラメータ、mapfileパラメータおよびfilterパラメータを設定してプロパティ・ファイルを作成します。
アウトバウンド・コネクタのテスト手順:
manageSyncProfilesコマンドのregister操作を使用して、テスト・プロファイルを作成します。詳細は、「manageSyncProfilesを使用した同期プロファイルの管理」を参照してください。
ロギング・メッセージを検証します。
Oracle Internet Directoryを調べ、発生した同期を検証して、適切なエントリが作成されたか確認します。
*/ import oracle.ldap.odip.engine.AttrHandler; import oracle.ldap.odip.engine.ChangeRecord; import oracle.ldap.odip.engine.ConfigReader; import oracle.ldap.odip.engine.Connector; import oracle.ldap.odip.engine.Constants; import oracle.ldap.odip.engine.DISWriteInterface; import oracle.ldap.odip.engine.ODIException; import oracle.ldap.odip.map.MapRules; import oracle.ldap.odip.util.Utils; import oracle.core.ojdl.logging.ODLLogger; import oracle.core.ojdl.logging.ODLLevel; import oracle.core.ojdl.logging.ODLHandler; import java.util.logging.Handler; import java.util.logging.Level; import oracle.ldap.odip.DIPLogger; public class SampleWriter implements DISWriteInterface { protected Hashtable mProfile; protected int mErrorCode = 0; protected String mLastKeyValue; protected String mLastWrittenKey; protected Vector mWriteFilter = new Vector(); protected MapRules mMapRules; protected String mNamingContext = ""; private String mOrigDstDn = ""; protected boolean mHandleModAsAdd = false; /* Constructor */ public LDAPWriter() { } public LDAPWriter(Connector conn) { super(conn); } public void initialise(Connector conn, Hashtable pHash) throws ODIException { m_logger.finest("Entry: LDAPWriter.initialise"); setValues(conn); mProfile = pHash; mMapRules = (MapRules) pHash.get(Constants.MAPRULE_STR); connect(); ConfigReader configInfo = (ConfigReader) pHash.get(Constants.CONFINFO_STR); if (configInfo != null) { //mSearchDelta = configInfo.getSearchDeltaSize(); mHandleModAsAdd = configInfo.getHandleModAsAdd(); } mLastWrittenKey = (String) pHash.get(Constants.READERCHANGEKEY_STR); pHash.put("WRITECONTEXT", mLdapCtx); NamingEnumeration filter = (NamingEnumeration) pHash.get("WriteFilter"); try { while (filter.hasMoreElements()) { mWriteFilter.add((String) filter.next()); } } catch (Exception ex) { //System.out.println("Error in initializing filter"); } /* ** Get the lastapplied changekey value from the profile ** and use that string to determine the 'lastappliedchangenum' ** or lastappliedchangetime to be stored as the 'lastkeyvalue' ** ** Each of the insert/modify/delete routines, if the operation is ** successful, that lastkeyvalue is updated correspondingly. Otherwise ** it has the previous successful operation value */ m_logger.finest ( "Exit: LDAPWriter.initialise" ); } public void setChanges(ChangeRecord chgrec) { mChanges = chgrec; } public ChangeRecord getChanges() { return mChanges; } public String getLastChangeKey() { return mLastKeyValue; } public int writeChanges() throws ODIException { m_logger.finest("Entry: LDAPWriter.writeChanges"); mErrorCode = 0; m_logger.log(ODLLevel.FINE, "\n Output ChangeRecord " + mChanges.toString()); String dn = mChanges.getChangeKey(); if ( mHandleModAsAdd && (mChanges.getChangeType() == Constants.CHGTYPE_MODIFY)) { try { mLdapCtx.getAttributes( mChanges.getChangeKey() ); } catch (NameNotFoundException nnfe) { m_logger.log(ODLLevel.ERROR,"ERROR_DN_CONN_DIR"); mChanges.setChangeType(Constants.CHGTYPE_MODRADD); } catch (NamingException ne) { m_logger.log(ODLLevel.ERROR,"LDAP_WNAMING_EXCEPTION" , ne); } } m_logger.log(ODLLevel.FINE, "Changetype is " + mChanges.getChangeType()); mChanges.setChangeKey(ndn); if (dn.length() > 1) { //testnew(dn); switch (mChanges.getChangeType()) { case Constants.CHGTYPE_ADD: if (mChanges.size() > 0) { insert(); } break; case Constants.CHGTYPE_MODIFY: // non-changelog-based changes if (mChanges.size() > 0) { modify(); } else { mErrorCode = -1; } break; case Constants.CHGTYPE_DELETE: delete(); break; case Constants.CHGTYPE_MODRADD: // non-changelog-based changes if (mChanges.size() > 0) { modifyRadd(); } break; case Constants.CHGTYPE_MODRDN: modRDNchangelog(dn); break; case Constants.CHGTYPE_MODDN: m_logger.log(ODLLevel.FINE, "Processing moddn"); modDNchangelog(dn); break; default: //INFEASIBLE break; } } else // BEGIN INFEASIBLE { m_logger.log(ODLLevel.ERROR, "ENTRY_NOT_EXISTS_DELETE"); m_logger.log(ODLLevel.FINE, "Synchrozing a deletion, entry to delete is not found. Ignore."); mErrorCode = 99; return mErrorCode; } // END INFEASIBLE Object chgInfo = mChanges.getChangeInfo(); try { if (chgInfo instanceof Attributes) { Attributes attrs = (Attributes) chgInfo; mLastKeyValue = (String) ((Attribute) attrs.get(mLastWrittenKey)).get(); } } catch (Exception ex) { //System.out.println("Caught the exception here " + mErrorCode); if (mErrorCode != 0) { m_logger.log(ODLLevel.ERROR, "EXCEPTION_FOR_DN", new Object [] { dn, new Integer ( mErrorCode ) , ex.toString()}); } } mChanges.setChangeKey(mOrigDstDn); return mErrorCode; } public void insert() throws ODIException { m_logger.finest("Entry: LDAPWriter.insert"); String dn = mChanges.getChangeKey(); Enumeration attrdtls = mChanges.getAll(); m_logger.log(ODLLevel.FINE, "Processing Insert Operation .."); while (attrdtls.hasMoreElements()) { AttrHandler temp = (AttrHandler) attrdtls.nextElement(); attr = attrHandlerToAttr((AttrHandler) temp); if (attr != null && temp.getAttrChgType() != Constants.ATTRCHGTYPE_DELETE) { attrs.put(attr); } } createEntry(dn, attrs); m_logger.finest("Exit: LDAPWriter.insert"); } public void modify() throws ODIException { m_logger.finest("Entry: LDAPWriter.modify"); String attrname = mChanges.getChangeKey(); m_logger.log(ODLLevel.FINE, "Processing Modify Operation .."); int pos = attrname.indexOf('='); String naming = null; if (pos > 0) { naming = attrname.substring(0, pos).trim(); } } /** * Delete the entry */ public void delete() { m_logger.finest("Entry: LDAPWriter.delete"); try { m_logger.log(ODLLevel.FINE, "Processing Delete Operation .."); } /** ** Handle the ModRDN operation ** ** @throws ODIException */ protected void modDNchangelog(String newDn) throws ODIException { String newDN = null; m_logger.log(ODLLevel.FINE, "Processing change log based ModRDN operation .." + " DN passed in: " + newDn); String dn = mChanges.getChangeKey(); } /** ** Handle the ModRDN operation ** ** @throws ODIException */ protected void modRDNchangelog(String newDn) throws ODIException { } protected void performModDN(String oldDN, String newDN) throws ODIException { } /* ** First check whether the 'dn' already exists. ** If exists, ** do a modify. ** else ** construct objectclasses and do a add */ // public void modifyRadd(boolean rdn) throws ODIException public void modifyRadd() throws ODIException { m_logger.finest("Entry: LDAPWriter.modifyRadd"); } /** ** Compare the value with the old value, and replace it, if the new value ** is different from the old value */ public void checkNReplace(String dn, Attributes attrs) throws ODIException { } //BEGIN INFEASIBLE public int getErrorCode() { return mErrorCode; } public int getChangeType() { return mChanges.getChangeType(); } public String getEventType() { return ""; } //END INFEASIBLE }