Identity Manager実装の技術面の計画


Identity Managerがサーバ上で必要とするオブジェクトの複製

計画の一部として、DirXMLドライバを実行するサーバに特定のeDirectoryオブジェクトが複製されていることを確認する必要があります。

フィルタ済みレプリカを使用できます。ただし、ドライバが読み込むか同期化する必要があるすべてのオブジェクトと属性がフィルタ済みレプリカに含まれていることが条件です。

DirXMLドライバオブジェクトには、同期化するあらゆるオブジェクトに対する十分なeDirectory権限を与える必要があります。これは、明示的に権限を付与するか、ドライバオブジェクトのセキュリティを、必要な権限を持つオブジェクトと同等にすることによって行います。

DirXMLドライバが実行されているeDirectoryサーバ(または、リモートローダを使用している場合はドライバが参照するeDirectoryサーバ)は、次のマスタレプリカまたは読み書き可能レプリカを保持している必要があります。


スコープフィルタ処理を使用した別のサーバ上のユーザの管理

スコープフィルタ処理とは、各ドライバにルールを追加して、ドライバのアクションのスコープを特定のコンテナに制限することです。次に、スコープフィルタ処理が必要になる2つの状況を示します。

次に、スコープフィルタ処理の使用例を示します。

次の図は、ユーザが格納された3つのコンテナであるMarketing、Finance、およびDevelopmentを持つツリーを示します。各コンテナは別個のパーティションです。


スコープフィルタ処理のツリー例

この例では、次の図に示すように、eDirectory管理者はServer AとServer Bという2台のeDirectoryサーバを管理しています。どちらのサーバにもすべてのユーザのコピーは含まれません。各サーバには3つのパーティションのうち2つが含まれるため、サーバが保持するスコープが重複しています。

管理者は、ツリー内のすべてのユーザをGroupWiseドライバで同期化したいと考えていますが、ユーザのレプリカを1つのサーバに集約しようとは考えていません。このため、GroupWiseドライバの2つのインスタンスを各サーバで1つずつ使用することにしました。管理者はIdentity Managerをインストールし、各eDirectoryサーバにGroupWiseドライバを設定します。

Server AはMarketingコンテナとFinanceコンテナのレプリカを保持しています。また、このサーバにはIdentity Managerコンテナのレプリカもあり、このレプリカにServer AのドライバセットとServer AのGroupWiseドライバオブジェクトが保持されています。

Server Bには、DevelopmentコンテナとFinanceコンテナのレプリカ、およびServer BのドライバセットとServer BのGroupWiseドライバオブジェクトを格納するIdentity Managerコンテナが保持されいます。

Server AとServer Bの両方にFinanceコンテナのレプリカが保持されているため、Financeコンテナ内に存在するユーザJBassadは、両方のサーバに保持されています。スコープフィルタ処理を使用しない場合、GroupWiseドライバAとGroupWiseドライバBの両方がJBassadを同期化します。


スコープフィルタ処理が使用されていない、レプリカが重複した2台のサーバ

次の図は、スコープフィルタ処理を使用して、ドライバの2つのインスタンスが同じユーザを管理しないようにしていることを示します。これは、スコープフィルタ処理によって、各コンテナを同期化するドライバを定義しているためです。


スコープフィルタ処理によって各コンテナを同期化するドライバを定義

次に、スコープフィルタ処理のルールを作成する方法のサンプルを示します。このルールは、Subscriber Event Transformationスタイルシートに記述します。

<xsl:transform	version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:jstring="http://www.novell.com/nxsl/java/java.lang.String"
exclude-result-prefixes="jstring">

<!--
To select different containers for scoping, add/delete/modify the <value>
elements in the body of the variable "in-scope-containers-rtf"

Note that if the container is not in the root of the tree, then the DN
(minus the tree name) of the container must be specified, e.g.,
Corporate\Executives

Note:THESE MUST BE ENTERED IN THE TABLE AS ALL UPPERCASE
-->

<xsl:variable name="in-scope-containers-rtf">
<value>CORPORATE\USERS\ACTIVE</value>
<value>CORPORATE\USERS\INACTIVE</value>
</xsl:variable>
<xsl:variable name="in-scope-containers" select="document('')/xsl:transform/xsl:variable[@name='in-scope-containers-rtf']/value"/>

<!--
"identity" transformation - copies unchanged everything not explicitly
matched by other templates
-->

<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<!-- throw away events that are out of scope -->

<xsl:template match="input/*[@src-dn]">
<xsl:variable name="in-scope">
<xsl:call-template name="in-scope"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="$in-scope = '1'">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:when>
<xsl:otherwise>
<xsl:message>
<status level="warning">Operation vetoed by Event Transformation
Rule - out of scope</status>
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<!--
check to see if an object is in the scope defined by the variable
"in-scope-containers"
-->

<xsl:template name="in-scope">
<!-- validate that the container is in scope -->
<xsl:variable name="src-dn" select="substring-after(substring-after(@src-dn,'\'),'\')"/>
<xsl:variable name="src-dn-i" select="jstring:lastIndexOf($src-dn,'\')"/>
<xsl:if test="$src-dn-i != -1">
<xsl:variable name="src-dn-container" select="jstring:substring($src-dn, 0, $src-dn-i)"/>

<!--
the following test takes advantage of the XPath existential
quantification semantics:
basically, if one node in the node-set has a string value that matches
the string, then the statement is true
-->

<xsl:if test="jstring:toUpperCase($src-dn-container) = $in-scope-containers">
<xsl:value-of select="'1'"/>
</xsl:if>
</xsl:if>
</xsl:template>
</xsl:transform>