ディレクトリ管理アプリケーションの記述

目次
casso1283
目次
ディレクトリ管理アプリケーションを記述する方法
  1. ポリシー サーバへの接続の確立
  2. セッション オブジェクトの取得
    ユーザまたは管理者が正常にログインするとき、セッション オブジェクトが取得されます。
    • SiteMinder
      管理者にログインして
      SiteMinder
      管理者セッションを確立するには、ユーティリティ パッケージの SmApiSession クラスで login() メソッドを呼び出します。
      ログインが成功する場合、セッション オブジェクトにはセッション指定が含まれます。
    • エンド ユーザ、DMS 組織管理者、または DMS スーパー管理者としてログインするには、エージェント API パッケージのエージェント API クラス内の login() メソッドを呼び出します。
      ログインが成功する場合、セッション指定は SessionDef オブジェクトの[
      spec
      ]フィールドに入力されます。SmApiSession オブジェクトで[
      spec
      ]値を設定します。
  3. セッション オブジェクトを渡す
    有効なセッションを取得した後に、このセッションを SmDmsApiImpl クラスのコンストラクタにバイパスする DMS API オブジェクトを作成します。たとえば、以下のようにします。
    SmDmsApi dmsApi = new SmDmsApiImpl (apiSession);
    この例で、dmsApi は新規 DMS API オブジェクトで、
    apiSession
    は管理者がログインに成功した場合に取得されるセッションです。
    注:
    DMS API オブジェクトを作成する場合は常に、セッションおよび接続情報をオブジェクトへ渡します。
  4. ディレクトリ管理コンテキストの作成
    ユーザ ディレクトリにアクセスするために DMS API を使用するには、以下のいずれかの情報が必要です。
    • 自己登録方式が設定されたレルムの OID。
      この情報を渡すには、SmDmsApiImpl.getDmsContext() を呼び出します。
    • 作業している
      SiteMinder
      ユーザ ディレクトリ。
      この情報を渡すには、SmDmsApiImpl.getDirectoryContext() を呼び出します。
    知っているまたは提供を選択する情報のタイプが、ユーザ ディレクトリへのアクセスに対するディレクトリ管理コンテキストを決定します。以下のようになります。
知っている情報
以下を実行
使用項目
自己登録方式が含まれるレルムの OID
ユーザが
SiteMinder
管理者である
分散代行管理サービス(DMS)コンテキスト
SiteMinder
ユーザ ディレクトリ名または OID
ディレクトリ コンテキスト
DMS コンテキストおよびディレクトリ コンテキストは、ディレクトリ情報のアクセスおよび操作が可能な SmDmsDirectory オブジェクトを取得するという同じ結果を達成するために 2 つの異なる手段を提供します。
5. オブジェクトの作成および操作
コンテキストの作成後、DMS オブジェクト モデルを使用してディレクトリ オブジェクトを作成および操作できます。ディレクトリ オブジェクトで作業する場合、以下の情報が必要です。
  • オブジェクトの識別名。
  • 以下のようなオブジェクトのタイプ。
    • トップレベルの組織
    • 組織単位
    • グループ
    • [User]
    • ロール
DMS コンテキスト
DMS コンテキストを使用すると、提供するレルム OID のコンテキスト内で SmDmsDirectory オブジェクトにアクセスできます。DMS コンテキスト クラスは SmDmsContext です。
以下のように DMS コンテキスト オブジェクトを作成できます。
SmDmsContext dmsContext = new SmDmsContext();
クラス SmDmsApiImpl でメソッド getDmsContext() を使用して DMS コンテキスト オブジェクトを取得できます。
注:
getDmsContext() を呼び出すには
SiteMinder
管理者権限が必要です。
DMS コンテキスト オブジェクト情報を取得する前に、getDmsContext() 呼び出しに渡すレルム オブジェクトを作成する必要があります。レルム オブジェクトには以下が必要です。
  • AgentAPI.isProtected() へのエージェント呼び出しから取得された、有効なオブジェクト識別子(OID)がある。
  • 登録方式と設定されている。
以下のように SmRealm オブジェクトを作成します。
SmRealm realm = new SmRealm();
次に、setOid() を呼び出すことによりレルム OID を設定します。このメソッドは、ポリシー管理 API の SmObjectImpl クラスを拡張するオブジェクトを通して呼び出すことができます。
レルム オブジェクトに対して OID を設定した後で getDmsContext() を呼び出し、レルム オブジェクトを渡します。
例:
エージェントは isProtected() を呼び出して、ユーザがアクセスを試みるリソースが保護されているかどうかを判断します。ポリシー サーバは、リソースにアクセスするために必要な認証情報を返すことで、リソースが保護されていることを示します。返される情報には、保護されたレルムの OID が含まれています。以下の例に示されるように、返されたレルム OID (例では m_REALM_OID)を使用して、作成して getDmsContext() に渡すレルム オブジェクトに対する OID を設定します。
// Create a DMS API object from a valid session.
SmDmsApi dmsApi = new SmDmsApiImpl (apiSession);
// The realm below should contain a registration scheme.
// You can get a directory OID from the registration scheme.
SmRealm realm = new SmRealm ();
realm.setOid (m_REALM_OID);
// Create the DMS context object.
SmDmsContext dmsContext = new SmDmsContext ();
// This call returns the realm, self registration,
// and user directory information through dmsContext.
result = dmsApi.getDmsContext (realm,
new SmDmsConfig(),
dmsContext);
dmsContext オブジェクトから完全なディレクトリ情報を取得するには、dmsContext.getDmsDirectory() を呼び出します。
ディレクトリ OID のみを取得するには、dmsContext.getSelfReg() を呼び出し、次に SmSelfReg.getUserDir() を呼び出します。
ディレクトリ コンテキスト
ディレクトリ コンテキストを使用すると、ユーザ ディレクトリ名または提供する OID のコンテキスト内で SmDmsDirectory オブジェクトにアクセスできます。ディレクトリ コンテキスト クラスは SmDmsDirectoryContext です。ディレクトリ コンテキストを取得するには、クラス SmDmsApiImpl でメソッド getDirectoryContext() を使用します。
以下の例では、SmDmsDirectoryContext オブジェクトが
dirContext
で返されます。ディレクトリ オブジェクトに関する情報を取得するには getDmsDirectory() を呼び出します。
// Create a DMS API object from a valid session.
SmDmsApi dmsApi = new SmDmsApiImpl (apiSession);
// Create the directory context object.
SmDmsDirectoryContext dirContext=new SmDmsDirectoryContext();
// Directory object to pass in to getDirectoryContext().
SmUserDirectory userDir = new SmUserDirectory ();
// setOid() method can take the name of the user directory.
userDir.setOid ("smdev");
// This call returns directory information through dirContext.
result=dmsApi.getDirectoryContext(userDir,
new SmDmsConfig(),
dirContext);
DMS コンテキスト内のユーザ タイプの変更
ディレクトリ コンテキストで、スーパー管理者、
SiteMinder
管理者、組織管理者、またはエンド ユーザなど、任意のユーザ タイプに代わって操作を実行できます。ただし、DMS コンテキスト オブジェクトを作成するにはメソッド getDmsContext() を呼び出す必要があり、このメソッドを呼び出すには
SiteMinder
管理者権限が必要です。
getDmsContext() が呼び出され、DMS コンテキストがセッションに対して確立された後、セッション内の後続の操作に対してユーザ タイプを変更することが可能です。たとえば、
SiteMinder
管理者が DMS コンテキスト内でセッションを開始した後に、あるエンド ユーザのプロファイルを同じセッションの中で変更するとします。
SiteMinder
管理者としてではなく、このエンド ユーザの代わりにプロファイル要求を作成するには、ユーザ タイプを変更する必要があります。
DMS コンテキスト オブジェクトを作成するには、SmDmsApiImpl.getDmsContext() を呼び出します。これを行うと、接続情報および
SiteMinder
管理者のセッション指定が DMS コンテキスト オブジェクトの中に入っています。
一連の後続オブジェクト(たとえば、SmDmsDirectory/SmDmsOrganization/SmDmsUser)がセッション内で作成されるにあたり、接続およびセッション情報がオブジェクトからオブジェクトに渡されます。あるオブジェクトに対してユーザ タイプを変更するには、そのオブジェクトに対する
SiteMinder
管理者のセッション指定を新しいユーザ タイプのセッション指定で置き換えると、それ以降の呼び出しはそのユーザ タイプの代理で行われます。どんなオブジェクト レベルでもセッション指定を変更できます。
DMS コンテキストで作成されたオブジェクト用のユーザ タイプの変更
  1. 新規ユーザ タイプによる要求のターゲットになるオブジェクトを作成します。
    たとえば、組織 dmsOrg 内の新規ユーザ オブジェクト dmsUser に対して、識別名 USER_DN を持つエンド ユーザの代わりに要求を作成する場合、以下のようにします。
    SmDmsUser dmsUser = dmsOrg.newUser(USER_DN);
    この例では、dmsOrg オブジェクト内の
    SiteMinder
    管理者セッション指定が dmsUser オブジェクトに渡されます。
  2. 以下のいずれかの方法で、新規ユーザに対するセッション仕様を取得します。
    • 標準的な
      SiteMinder
      エージェントでは、デフォルトの HTTP ヘッダ HTTP_SM_SERVERSESSIONSPEC を使用します。
    • カスタム エージェントで、新規ユーザにログインするためにエージェント API を使用します。
  3. 新規ユーザおよび DMS オブジェクトのためのセッション指定を渡します。たとえば、
    sessionSpec
    がセッション指定である場合、以下のようになります。
    dmsUser.getApiSession().setSessionSpec(sessionSpec);
オブジェクトの作成
組織オブジェクト、グループ オブジェクト、ユーザ オブジェクトまたはロール オブジェクトなどのオブジェクトを作成するには、以下を実行します。
  1. DMS コンテキストまたはディレクトリ コンテキスト上で getDmsDirectory() を呼び出して、ディレクトリ オブジェクトを取得するためにコンテキストを使用します。たとえば、DMS コンテキストを使用するには以下のようにします。
    SmDmsDirectory dmsDir = dmsContext.getDmsDirectory();
  2. クラス SmDmsDirectory 内で newOrganization() を呼び出すことにより組織オブジェクトを作成するには、ディレクトリ オブジェクトを使用します。o=swdev.com など組織の識別名を渡します。例: <nete:proxyrules xmlns:nete="http://www.ca.com/" debug="yes">
    SmDmsOrganization org=dmsDir.newOrganization("o=swdev.com");
  3. グループ オブジェクトまたは組織単位オブジェクトなど他のオブジェクトを作成するには組織オブジェクトを使用します。以下の例は、識別名 ou=UI、ou=eng、o=swdev.com を持つ grp という名前のグループ オブジェクトを作成します。
    SmDmsGroup grp=org.newGroup("ou=UI,ou=eng,o=swdev.com");
注:
このコードは、ディレクトリにグループを追加しません。
以下の図は、ディレクトリ オブジェクトを作成するための DMS API フローを示しています。
An illustration describing how to create an object using the API.
ディレクトリ エントリ属性の取得
特定の属性の値を取得するには、クラス SmDmsObject 内で getAttribute() を呼び出し、属性名を文字列として渡します。getObject() で属性を取得した後、属性値を利用することができます。メソッド getAttribute() は、java.lang.Object クラスのメンバを返します。属性が複数の値を持つ場合、返されたオブジェクトはキャレット(^)で区切られた複数の値を持ちます。
ディレクトリへのオブジェクトの追加
ディレクトリにオブジェクトを追加するには以下を実行します。
  1. クラス SmDmsObject 内で setAttribute() を呼び出し、属性名とその値に渡すことで、オブジェクトに対する属性を設定します。属性名はユーザのディレクトリシステムで定義されています。
    setAttribute() はオブジェクトの定義に必要なだけ何回でも呼び出します。
  2. クラス SmDmsObject 内でメソッド addObject() を呼び出します。例: <nete:proxyrules xmlns:nete="http://www.ca.com/" debug="yes">
    result = grp.addObject();
    例で、
    result
    は SmApiResult オブジェクトです。
    (一般的な) SmDmsObject オブジェクトで addObject() を呼び出したい場合、最初に setClassId() を呼び出してクラス識別子を設定する必要があります。
オブジェクトを追加する場合、
objectclass
属性に対して複数の値を設定することができますが、他の属性に対しては実行できません。modifyObject() メソッドでオブジェクトを変更する場合、どの属性に対しても複数の値を設定できます。
属性に対して複数の値を設定するには、以下を実行できます。
  • 値の区切りにキャレット(^)を使用した文字列を渡します。
  • 値のベクターを渡し、
    SiteMinder
    がそのベクターを文字列に変換するようにします。
たとえば、top および organizationalunit の値を含む文字列を渡すには、以下のコードを使用できます。
group.setAttribute("objectclass","top^organizationalunit");
同じ値に対するベクターを渡すには、以下のコードを使用できます。
Vector objectclass = new Vector();
objectclass.add("top");
objectclass.add("organizationalunit");
group.setAttribute("objectclass", objectclass);
注:
既存のオブジェクトの場合、オブジェクト クラスは modifyObjectClass() メソッドによって変更できます。このメソッドを使用して、オブジェクト クラスに対して複数の値を設定できます。
グループへのユーザの追加
グループへユーザを追加するには、addToGroup() メソッドをクラス SmDmsObject 内で呼び出します。以下の例では、ユーザ
user1
はグループ
devGroup
に追加されます。
SmDmsDirectory dmsDir = dmsContext.getDmsDirectory();
SmDmsOrganization org = dmsDir.newOrganization(ORG_ROOT);
SmDmsGroup devGroup = org.newGroup(GROUP_DN);
SmDmsUser user1 = org.newUser(USER_DN1);
result = devGroup.addToGroup(user1);
ロールへのユーザの追加
ユーザをロールに追加するには、addToRole() メソッド(クラス SmDmsUser)を呼び出します。以下の例で、ユーザ
user1
はロール
role
に追加されます:
SmDmsDirectory dmsDir = dmsContext.getDmsDirectory();
SmDmsOrganization org = dmsDir.newOrganization(ORG_ROOT);
SmDmsRole role = org.newRole(ROLE_DN);
SmDmsUser user1 = org.newUser(USER_DN1);
result = user1.addToRole(role);
オブジェクトの取得、変更または削除
オブジェクトの属性を取得または変更、またはオブジェクトを削除するには getObject()、modifyObject()、または deleteObject() を呼び出します。これらのメソッドはクラス SmDmsObjectで定義されます。
たとえば、DN がディレクトリ ネームスペース dmsDir 内の ORG_ROOT によって参照される組織 org の属性を取得するには以下を実行します。
ORG_ROOT="o=swdev.com";
SmDmsDirectory dmsDir = dmsContext.getDmsDirectory();
SmDmsOrganization org = dmsDir.newOrganization(ORG_ROOT);
SmApiResult result = org.getObject();
オブジェクトの属性を変更するには、まず getObject() で既存の属性を取得します。その後、オブジェクトを追加する場合と同じように、setAttribute() (クラス SmDmsObject 内)を呼び出すことで新規属性(複数可)を設定します。たとえば、上記の組織 org 内のユーザ USER_DN1 を、値 Boston に属性
I
を設定することで修正するには、以下を実行します。
SmDmsUser user = org.newUser(USER_DN1);
result = user.getObject();
user.setAttribute("l", "Boston");
result = user.modifyObject();
objectclass
属性だけでなく、すべての属性に対して複数の値を修正できます。
前の例でユーザを削除するには、以下を実行します。
SmDmsUser user = org.newUser(USER_DN1);
result = user.deleteObject();