この章は、Identity Connector Framework(ICF)とOracle Identity Managerメタデータを使用して.NETでアイデンティティ・コネクタを開発するのに必要な手順全体を確認するチュートリアルとなります。ここには、重要なICFクラスとインタフェース、コネクタ・バンドルおよびコネクタ・サーバーについての情報と、フラット・ファイル.NETアイデンティティ・コネクタの実装のコード例や、ユーザー・プロビジョニングとリコンシリエーションのプロセス用にOracle Identity Managerメタデータを作成するコード例が含まれています。この章には次の項目があります。
フラット・ファイル・コネクタは、構成インタフェースの実装を開発し、その後、コネクタ・クラスを実装するという手順で開発します。このドキュメントでは、作成、削除、更新および検索操作のフラット・ファイル・コネクタのサンプル実装について説明します。実装およびドキュメントを単純化するために、コネクタによってサポートされる構成プロパティおよびスキーマは最小限に維持されています。このコネクタの実装は、実際のコネクタの作成に役立つサンプルとしてのみ使用してください。
コネクタの実装を単純にするために、フラット・ファイルには名前、性別、資格、年齢属性のみが含まれていると仮定します。2つの構成ファイルの場所およびデリミタがあります。残りの構成は、サンプルにハードコードされています。
Microsoft Visual Studioでコネクタを使用して、プロジェクトを設定します。
タイプ・ライブラリの新しいVisual Studioプロジェクトを作成します。
参照として次のdllが追加されていることを確認します。
- Common.dll
- Framework.dll
- FrameworkInternal.dll
- System.dll
- System.Core.dll
これらのdllは、.NETコネクタ・サーバーで使用可能である必要があります。
Org.IdentityConnectors.Framework.Spi.AbstractConfigurationベース・クラスを拡張して、フラット・ファイル・コネクタ用の構成クラスを実装します。
例11-1 AbstractConfigurationの実装
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Org.IdentityConnectors.Framework.Spi;? using Org.IdentityConnectors.Framework.Common.Exceptions;? using System.IO; namespace Org.IdentityConnector.FlatFileConnector? { /// <summary> /// Configuration class for flat file connector representing target system information? /// </summary> public class FlatFileConfiguration : AbstractConfiguration? { #region FileName /// <summary> /// Target file name /// </summary> /// <value> /// File name with complete path. As for executing the .NET Connector bundle we need .NET Connector Server, hence the file should reside /// on the machine where the connector server is present. /// </value> [ConfigurationProperty(Required = true, Order = 1)] public String FileName { get; set; } #endregion #region Delimiter /// <summary> /// Delimiter used within the target flat file /// </summary> /// <value> /// Delimter /// </value> [ConfigurationProperty(Required = true, Order = 2)] public String Delimiter { get; set; } #endregion #region /// <summary> /// Validates if the configuration properties provided are as requiered, if not throw ConfigurationException /// </summary> public override void Validate() { if (this.FileName == null || this.FileName.Length == 0) { throw new ConfigurationException("Configuration property FileName cannot be null or empty"); } if (!File.Exists(this.FileName)) { throw new ConfigurationException("Target file " + this.FileName + " does not exist"); } if (this.Delimiter == null || this.Delimiter.Length == 0) { throw new ConfigurationException("Configuration property Delimiter cannot be null or empty"); } } #endregion } }
異なるSPIインタフェースOrg.IdentityConnectors.Framework.Spi
を実装することで、フラット・ファイル・コネクタにコネクタ・クラスを作成します。
例11-2では、PoolableConnector,CreateOp,SchemaOp,TestOp,DeleteOp,UpdateOp,SearchOp<String>インタフェースを実装するため、すべてのCRUD操作をサポートします。
例11-2 PoolableConnectorの実装
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Org.IdentityConnectors.Framework.Spi; using System.IO; using Org.IdentityConnectors.Framework.Common.Exceptions; using System.Security.AccessControl; using Org.IdentityConnectors.Framework.Spi.Operations; using Org.IdentityConnectors.Framework.Common.Objects; using Org.IdentityConnectors.Common; namespace Org.IdentityConnector.FlatFileConnector { /// <summary> /// FlatFileConnector showing implementation of SchemaOp, test, create, delete, update and search operations. /// </summary> [ConnectorClass("FlatFileConnector_DisplayNameKey",typeof(FlatFileConfiguration))] public class FlatFileConnector : PoolableConnector,CreateOp,SchemaOp,TestOp,DeleteOp,UpdateOp,SearchOp<String> { /// <summary> /// Flat file configuration instance. This instance has the target system information. /// </summary> private FlatFileConfiguration config; #region Init /// <summary> /// Create a connection to target and store it for later use. But here we just set attributes of target file /// name to Normal /// </summary> /// <param name="config">Configuration Object</param> public void Init(Configuration config) { this.config = (FlatFileConfiguration)config; File.SetAttributes(this.config.FileName, FileAttributes.Normal); } #endregion #region CreateOp Members /// <summary> /// This creates a new row in the target file with the data as sent in the 'attrs' /// </summary> /// <param name="objClass">The ObjectClass. Here we support only Account</param> /// <param name="attrs">Attributes of this Account that need to be created on target</param> /// <param name="options">Will always be empty</param> /// <returns>Unique id Uid, representing the Account which was just created</returns> public Uid Create(ObjectClass objClass, ICollection<ConnectorAttribute> attrs, OperationOptions options) { ConnectorAttribute NameAttribute = ConnectorAttributeUtil.Find(Name.NAME, attrs); ConnectorAttribute AgeAttribute = ConnectorAttributeUtil.Find("Age", attrs); ConnectorAttribute QualificationAttribute = ConnectorAttributeUtil.Find("Qualification", attrs); ConnectorAttribute GenderAttributute = ConnectorAttributeUtil.Find("Gender", attrs); StreamWriter writer = File.AppendText(this.config.FileName); writer.WriteLine("\nName:" + ConnectorAttributeUtil.GetAsStringValue(NameAttribute) + this.config.Delimiter + "Age:" + ConnectorAttributeUtil.GetAsStringValue(AgeAttribute) + this.config.Delimiter + "Qualification:" + ConnectorAttributeUtil.GetAsStringValue(QualificationAttribute) + this.config.Delimiter + "Gender:" + ConnectorAttributeUtil.GetAsStringValue(GenderAttributute)); writer.Flush(); writer.Dispose(); writer.Close(); return new Uid(ConnectorAttributeUtil.GetAsStringValue(NameAttribute)); } #endregion #region DeleteOp Members /// <summary> /// Deletes an entity from target flat file. We support only ACCOUNT object class. /// If the Uid (user name) is not found then UnknownUidException is thrown /// </summary> /// <param name="objClass"></param> /// <param name="uid"></param> /// <param name="options"></param> public void Delete(ObjectClass objClass, Uid uid, OperationOptions options) { String[] allLines = File.ReadAllLines(this.config.FileName); String[] newLines = new String[allLines.Length]; Boolean userExisted = false; for (int i = 0; i < allLines.Length; i++) { char[] separator = new char[] { '$' }; String[] thisLineSplit = allLines[i].Split(separator); String name = ""; foreach (String str in thisLineSplit) { if (str.StartsWith("Name")) { name = str; break; } } if (!name.Equals("Name" + ":" + uid.GetUidValue())) { newLines[i] = allLines[i]; } else { userExisted = true; } } if (userExisted) { File.WriteAllText(this.config.FileName, String.Empty); File.WriteAllLines(this.config.FileName, newLines); } else { throw new UnknownUidException("Uid "+uid.GetUidValue()+" not found"); } } #endregion #region UpdateOp Members /// <summary> /// Updates information of an existing user on the target flat file /// </summary> /// <param name="objclass">The ObjectClass. Here we support only user</param> /// <param name="uid">Unique id of the user using which we can find out the user on target. This is the returned vaue by CreateOp implementation</param> /// <param name="replaceAttributes">Updated attributes of user which should replace all existing user information on target</param> /// <param name="options">This will always be empty</param> /// <returns>Updated uid. It can be the same value which was provided to this method.</returns> public Uid Update(ObjectClass objclass, Uid uid, ICollection<ConnectorAttribute> replaceAttributes, OperationOptions options) { String uidValue = uid.GetUidValue(); String[] allLines = File.ReadAllLines(this.config.FileName); String[] updatedLines = new String[allLines.Length]; Boolean userExists = false; Uid updatedUid = uid; for(int i = 0; i < allLines.Length; i++) { String[] thisLineSplit = allLines[i].Split(new char[] { '$' }); String name = ""; foreach (String str in thisLineSplit) { if (str.StartsWith("Name")) { name = str; break; } } String nameToBeUpdated = "Name:" + uidValue; if (!name.Equals(nameToBeUpdated)) { updatedLines[i] = allLines[i]; } else { ConnectorAttribute NameAttribute = ConnectorAttributeUtil.Find(Name.NAME, replaceAttributes); ConnectorAttribute AgeAttribute = ConnectorAttributeUtil.Find("Age", replaceAttributes); ConnectorAttribute QualificationAttribute = ConnectorAttributeUtil.Find("Qualification", replaceAttributes); ConnectorAttribute GenderAttribute = ConnectorAttributeUtil.Find("Gender", replaceAttributes); updatedLines[i] = "Name:"+NameAttribute.Value.First().ToString()+this.config.Delimiter+ AgeAttribute.Name+":"+AgeAttribute.Value.First().ToString()+this.config.Delimiter+ QualificationAttribute.Name+":"+QualificationAttribute.Value.First().ToString()+this.config.Delimiter+ GenderAttribute.Name+":"+GenderAttribute.Value.First().ToString(); userExists = true; updatedUid = new Uid(NameAttribute.Value.First().ToString()); } } File.WriteAllText(this.config.FileName, String.Empty); File.WriteAllLines(this.config.FileName, updatedLines); if (!userExists) { throw new UnknownUidException("User "+uid.GetUidValue()+" not found"); } return updatedUid; } #endregion #region SearchOp<string> Members /// <summary> /// Returns a filter translator used by ExecuteQuery. The functionality of filter translator is to translate any filters provided by calling application (OIM/OW/OPAM) to native queries. /// </summary> /// <param name="oclass">The ObjectClass. We support only ACCOUNT</param> /// <param name="options">Options</param> /// <returns>FilterTranslator instance</returns> public Org.IdentityConnectors.Framework.Common.Objects.Filters.FilterTranslator<string> CreateFilterTranslator(ObjectClass oclass, OperationOptions options) { return new FlatFileFilterTranslator(); } /// <summary> /// Performs search on target based on query. Uses the handler instance to return back the searched result. /// </summary> /// <param name="oclass">The ObjectClass. This tells if we have to search for user (ACCOUNT) or group (GROUP). We support only user</param> /// <param name="query">Query as returned by FilterTranslator</param> /// <param name="handler">handler to return back result to caller</param> /// <param name="options">Options containing what attributes of entity to return back</param> public void ExecuteQuery(ObjectClass oclass, string query, ResultsHandler handler, OperationOptions options) { String[] results = GetResults(query); foreach (String result in results) { Console.WriteLine("Result = "+result); String result1 = result.Trim(); if (result1.Length > 0) { Console.WriteLine("Submitting result = " + result1); SubmitConnectorObject(result1, handler); } } } #region SchemaOp Members /// <summary> /// Defines the schema supported by this connector /// </summary> /// <returns>Schema</returns> public Schema Schema() { SchemaBuilder schemaBuilder = new SchemaBuilder(SafeType<Connector>.Get(this)); ICollection<ConnectorAttributeInfo> connectorAttributeInfos = new List<ConnectorAttributeInfo>(); connectorAttributeInfos.Add(ConnectorAttributeInfoBuilder.Build("Name")); connectorAttributeInfos.Add(ConnectorAttributeInfoBuilder.Build("Age")); connectorAttributeInfos.Add(ConnectorAttributeInfoBuilder.Build("Qualification")); connectorAttributeInfos.Add(ConnectorAttributeInfoBuilder.Build("Gender")); schemaBuilder.DefineObjectClass(ObjectClass.ACCOUNT_NAME, connectorAttributeInfos); return schemaBuilder.Build(); } #endregion #region TestOp Members /// <summary> /// Should ideally test the connecttion with target. But here we just print something as we have assumed that target file is on same machine /// </summary> public void Test() { Console.Write("Tested connection!"); } #endregion #region CheckAlive /// <summary> /// Check connection to target system is alive or not. But here we just check if target file name /// provided in the FlatFileConfiguration is available or not. /// </summary> public void CheckAlive() { if (!File.Exists(this.config.FileName)) { throw new ConnectorException("Target file " + this.config.FileName + " does not exist"); } } #endregion #region Dispose /// <summary> /// Remove connection from target, dispose any of the resources used. But here we just chill. /// </summary> public void Dispose() { //chill :) } #endregion private void SubmitConnectorObject(String result, ResultsHandler handler) { ConnectorObjectBuilder cob = new ConnectorObjectBuilder(); String[] resultSplit = result.Split(new char[]{'$'}); ICollection<ConnectorAttribute> attrs = new List<ConnectorAttribute>(); foreach (String str in resultSplit) { ConnectorAttributeBuilder cab = new ConnectorAttributeBuilder(); cab.AddValue(str.Split(new char[] { ':' })[1]); if (str.StartsWith("Name")) { cob.SetName(Name.NAME); cob.SetUid(str.Split(new char[] { ':' })[1]); cab.Name = Name.NAME; } else { cab.Name = str.Split(new char[] { ':' })[0]; } attrs.Add(cab.Build()); } cob.AddAttributes(attrs); handler(cob.Build()); } private String[] GetResults(String query) { String[] allLines = File.ReadAllLines(this.config.FileName); String[] results = allLines; if (query != null) { for (int i = 0; i < allLines.Length; i++) { String[] thisLineSplit = allLines[i].Split(new char[]{'$'}); Boolean foundResult = false; foreach (String str in thisLineSplit) { if (str.StartsWith("Name") && str.Equals(query)) { foundResult = true; break; } } if (foundResult) { return new String[] {allLines[i]}; } } } return results; } #endregion } }
このコネクタは、CreateEqualsExpression操作のみをサポートします。CreateEqualsExpressionを実装します。例11-3に、フィルタ操作を定義するOrg.IdentityConnectors.Framework.Common.Objects.Filters.AbstractFilterTranslator<T>のサンプル実装を示します。
例11-3 AbstractFilterTranslator<T>の実装
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Org.IdentityConnectors.Framework.Common.Objects.Filters; using Org.IdentityConnectors.Framework.Common.Objects; namespace Org.IdentityConnector.FlatFileConnector { /// <summary> /// FlatFileFilterTranslator. This translator converts the equalsFilter provided by the calling application to native query which can be used by the connector while searching. /// The implementation shown supports only equals filter. i.e it has provided implementation for only CreateEqualsExpression, this means that if any other filter is provided /// by the calling application, it would not be translated as a native query and search implementation gets all users and filtering will be done by ICF with all results. /// /// </summary> public class FlatFileFilterTranslator : AbstractFilterTranslator<String> { /// <summary> /// Creates a native query for equals filter and returns it only if equals filter is constructed for Name attribute and not for any other attributes. /// </summary> /// <param name="filter">Filter provided by calling application</param> /// <param name="not"></param> /// <returns></returns> protected override string CreateEqualsExpression(EqualsFilter filter, bool not) { ConnectorAttribute attr = filter.GetAttribute(); if (attr.Name.Equals(Name.NAME)) { return "Name:" + attr.Value.First().ToString(); } return null; } } }
プロジェクトのAssemblyInfo.csに存在するAssemblyVersionをメモします。
サンプルのAssemblyInfo.csファイル:
using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("FlatFileConnector")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Oracle Corporation")] [assembly: AssemblyProduct("FlatFileConnector")] [assembly: AssemblyCopyright("Copyright © Oracle Corporation 2012")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(true)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("79eec317-62bd-49a5-9512-88d61135684c")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")]
プロジェクトを作成します。プロジェクトは、コネクタDLLを作成する必要があります。
.NETに実装されているすべてのコネクタで、コネクタを実行する.NETコネクタ・サーバーを持つ必要があります。コネクタ・バンドルはOracle Identity Manager内にデプロイすることはできません。したがって、ICF .NETアイデンティティ・コネクタとOracle Identity Managerを統合するために次の手順を実行する必要があります。
.NETコネクタ・サーバーでコネクタ・バンドルを登録またはデプロイするには、次の手順を実行します。
.NETコネクタ・サーバーをインストールします。.NETコネクタ・サーバーのインストールの詳細は、第9.6.2.1項「.NETコネクタ・サーバーのインストール」を参照してください。
コネクタ・サーバーを停止します。コネクタ・サーバー・サービスが実行していないことを確認してください。
CONNECTOR_SERVER_HOMEの場所でコネクタDLLをコピーします。CONNECTOR_SERVER_HOMEは、.NETコネクタ・サーバーのインストール後に、ConnectorServer.exeおよびファイルに関連するその他のコネクタ・サーバーが存在する場所です。
.NETコネクタ・サーバーを起動します。
このメタデータ構成は、プロビジョニングとリコンシリエーションの両方で必要となります。Oracle Identity ManagerのDesign Consoleを使用して、次の手順を実行します。
ITリソース・タイプ定義は、リソースの接続情報の表現です。ITリソース・タイプ定義内の構成パラメータは、コネクタ・バンドルの構成パラメータと一致する必要があります。ITリソース内のパラメータの値は、バンドル構成で設定されます。
注意: バンドル構成によって使用されないパラメータを含めることができます。これらは、バンドル操作に悪影響は与えません。 |
Oracle Identity Manager Design Consoleにログインします。
「リソース管理」の下で、ITリソース・タイプ定義をクリックします。
「サーバー・タイプ」をFlat Fileとして定義して、新しいITリソース・タイプ定義を作成します。
図11-1に示すように、次のパラメータを追加します。
Configuration Lookupは、リソース用のメインの構成参照のマーカーです。パラメータの名前は、Configuration Lookupである必要があります。「デフォルトのフィールド値」に値を追加することをお薦めします。
デリミタは、バンドル構成のデリミタ・パラメータにマップします。このパラメータの値が渡されます。
FileNameは、バンドル構成のFileNameパラメータにマップします。このパラメータの値が渡されます。
Connector Server Nameは、.NETコネクタ・サーバーが実行中のコネクタ・サーバーのITリソース名を指定します。
リソース・オブジェクトは、Oracle Identity Managerでのリソースの表現です。コネクタ・バンドルは、リソース・オブジェクトに関連付けられています。
Oracle Identity Manager Design Consoleにログインします。
「リソース管理」の下の「リソース・オブジェクト」をクリックします。
Flat Fileという名前で新しいリソース・オブジェクトを作成します。
リソース・オブジェクトはターゲット・リソースであるため、図11-2に示すように、「信頼できるソース」ボックスは選択しません。
コネクタ・バンドルでサポートされている様々なオブジェクトに対して個別の参照を定義する必要があります。この参照には、これらのオブジェクトのプロビジョニングおよびリコンシリエーションに関連する情報を含めることができます。メインの構成参照は、これらの参照へのポインタが含まれているため、オブジェクト固有の参照のルートになります。次の項では、参照の作成方法について説明します。
(第11.2.2.1項「ITリソース・タイプ定義の作成」で定義した)構成参照には、接続情報とは見なされないコネクタ・バンドル構成が保持されます。ITリソース・タイプ定義で構成パラメータが見つからない場合、Oracle Identity Managerは構成参照を検索します。メインの構成参照には、バンドル・プロパティおよびバンドル構成が含まれています。バンドル・プロパティ・パラメータは、正しいバンドルの識別に必要であるため、必須です。ITリソース・タイプ定義の一部として定義されていないバンドル構成(第11.2.2.1項「ITリソース・タイプの定義の作成」を参照)は、ここで宣言できます。
注意: コード・キーの値は、図と完全に一致する必要があります。デコードの値は、コネクタ・バンドルに固有です。 |
Oracle Identity Manager Design Consoleにログインします。
「管理」の下の「参照定義」をクリックします。
新しい参照を作成し、Lookup.FlatFile.Configurationをコードの値として追加します。
図11-3に示すように、次の参照コード情報を追加します。
AssemblyVersionを必須バンドル・バージョンとして追加します。
FlatFile.Connectorを必須バンドル名として追加します。バンドル名は、コネクタのdll名から識別できます。コネクタDLLは、BUNDLE_NAME.dll形式です。
Org.IdentityConnector.FlatFileConnector.FlatFileConnectorを必須コネクタ名として追加します。
OBJECT_TYPE_NAMEConfiguration Lookupは、特定のオブジェクト・タイプの構成参照です。この例では、User Configuration Lookupが定義されているため、オブジェクト・タイプはUserになります。
オブジェクト・タイプの構成参照には、特定のオブジェクト・タイプに固有のパラメータが含まれています。オブジェクト・タイプは、アイデンティティ・コネクタが動作するエンティティです。ICF ObjectClassにマップされます。第11.2.2.3.1項「メインの構成参照の作成」でUser Configuration Lookupが参照されているため、Userがオブジェクト・タイプとなり、この場合はObjectClass.ACCOUNTにマップされています。(RolesとUserJobDataが、その他の2つのオブジェクト・タイプです。)オブジェクト・タイプ名は、アイデンティティ・コネクタ・バンドルでサポートされているオブジェクト・クラス名と一致する必要があります。Userオブジェクト・タイプは事前定義済のObjectClass.ACCOUNTにマップされ、Groupオブジェクト・タイプは事前定義済ObjectClass.GROUPにマップされます。アイデンティティ・コネクタが複数のオブジェクトをサポートしている場合、この手順をそれぞれに対して繰り返す必要があります。
注意: これらのユースケースは基本機能のみを対象としているため、この構成は必須属性として保持されます。 |
Oracle Identity Manager Design Consoleにログインします。
「管理」の下の「参照定義」をクリックします。
新しい参照を作成し、Lookup.FlatFile.UM.Configurationをコードとして追加します。
図11-4に示すように、次の属性を設定します。
注意: このチュートリアルは、アイデンティティ・コネクタの実行に最低限必要な構成に焦点を当てています。 |
プロビジョニング属性マップの値はLookup.FlatFile.UM.ProvAttrMapとします。この参照には、Oracle Identity Managerフィールドとアイデンティティ・コネクタ属性との間のマッピングが含まれています。このマッピングは、プロビジョニング時に使用されます。
リコンシリエーション属性マップの値はLookup.FlatFile.UM.ReconAttributeMapとします。この参照には、Oracle Identity Managerリコンシリエーション・フィールドとアイデンティティ・コネクタ属性との間のマッピングが含まれています。このマッピングは、リコンシリエーション時に使用されます。
次の項は、フラット・ファイル・プロビジョニング用にOracle Identity Managerを構成するために実行する必要があります。
プロセス・フォームは、Oracle Identity Managerでのオブジェクト属性の表現として使用されます。これにより、操作のためにオブジェクト属性がコネクタ・バンドルに渡される前に、ユーザーが設定を容易に入力できます。
プロセス・フォームで定義された属性は、規則ではありません。このフォームは、アイデンティティ・コネクタに渡される必要がある属性に対するチャレンジの方法です。一般的に、アイデンティティ・コネクタのサポートされている各属性に対して属性を定義します。
注意: アイデンティティ・コネクタ属性で1対1のマッピングを設定することをお薦めします。 |
対応するITリソース・タイプ定義に関連付ける必要があるITリソースを問い合せるためのフィールドが存在する必要があります。各フィールドの変数タイプは、オブジェクト属性のタイプにマップする必要があります。
Oracle Identity Manager Design Consoleにログインします。
「開発ツール」の下の「フォーム・デザイナ」をクリックします。
図11-5に示すように、「表名」がUD_FLATFILEである新しいフォームを作成します。
表11-1に示されているように、コネクタ・スキーマで定義されている属性を追加します。
表11-1 「フォーム・デザイナ」のフィールド
名前 | バリアント | フィールド・ラベル | フィールド・タイプ |
---|---|---|---|
UD_FLATFILE_NAME |
String |
名前 |
TextField |
UD_FLATFILE_AGE |
String |
年齢 |
TextField |
UD_FLATFILE_QUALIFICATION |
String |
資格情報 |
TextField |
UD_FLATFILE_GENDER |
String |
性別 |
LookupField |
UD_FLATFILE_RETURNIDQ |
String |
Return Id |
DOField |
UD_FLATFILE_ITRESOURCE |
Long |
ITリソース |
ITResourceLookup |
注意: フラット・ファイルの列名は、FirstName、ChangeNo、EmailID、Server、LastNameおよびAccountIDです。 |
「Properties」タブをクリックします。
図11-6に示しているように、次のプロパティをServer(ITResourceLookupField)に追加します。
Required = true
Type = Flat File
フォームを保存します。
バージョンのアクティブ化をクリックします。
コネクタ・バンドルでサポートされているすべての操作(作成、更新、削除など)に対してアダプタを作成する必要があります。
Oracle Identity Manager Design Consoleにログインします。
「開発ツール」の下の「アダプタ・ファクトリ」をクリックします。
新しいアダプタを作成して、アダプタ名として、フラット・ファイルの作成ユーザーを追加します。
「アダプタ・タイプ」として「プロセス・タスク」を追加します。
アダプタを保存します。
図11-7に示すように、「変数リスト」タブをクリックして、次の変数を追加します。
「タイプ」が「文字列」で、マップが実行時に解決であるobjectType。
「タイプ」が「ロング」で、マップが実行時に解決であるprocessInstanceKey。
「タイプ」が「文字列」で、マップが実行時に解決であるitResourceFieldName。
図11-8に示すように、次のサブ手順を実行して、Java機能タスクをアダプタに追加します。
アダプタ・タスク・タブをクリックします。
アダプタを選択し、「追加」をクリックします。
タスク・オプションからJavaを選択します。
APIソースから「icf-oim-intg.jar」を選択します。
APIソースとして「oracle.iam.connetors.icfcommon.prov.ICProvisioninManager」を選択します。
タスクのメソッドとして「createObject」を選択します。
構成を保存します。
(すでに変数リストに追加した)変数を、適切なメソッド入力および出力にマップします。
構成パラメータを、適切なメソッド入力および出力にマップします。
データベース参照はデータベース参照(アダプタ参照)にマップし、戻り変数は戻り変数(アダプタ変数)にマップします。
アダプタを保存してビルドします。
プロセス定義では、特定の操作用のコネクタ・バンドルの動作を定義します。すべての操作には、関連付けられている対応タスクがあります。この手順では、作成操作のプロセス定義、およびプロセス・タスクの統合を構成します。
Oracle Identity Manager Design Consoleにログインします。
「プロセス管理」タブの「プロセス定義」をクリックします。
図11-9に示すように、新しいプロセス定義を作成し、それにFlat Fileという名前を付けます。
プロセスのタイプとして「プロビジョニング」を選択します。
アイデンティティ・コネクタのリソース・オブジェクト名を指定します(この例ではフラット・ファイル)。
プロセス・フォームの表名を指定します(この例ではUD_FLATFILE)。
プロセス・タスクを追加してCreate Userという名前を付けます。
図11-10に示すように、「Create User」をダブルクリックして、編集します。
統合タブをクリックします。
図11-11に示すように、「追加」をクリックして、リストからadpFLATFILECREATEUSERアダプタを選択します。
このアダプタは、コンパイルされた後にのみ使用できます。
次のように変数をマップして、アイデンティティ・コネクタによって返されるレスポンス・コードを設定します。
Adapter Return Variable - レスポンス・コード
Object Type - [Literal:String] User(オブジェクト・タイプの名前)
Process Instance Key - [Process Data] プロセス・インスタンス
IT Resource Field Name - [Literal:String] UD_FLATFILE_ITRESOURCE (ITリソース情報が含まれたフォーム・フィールド名)
図11-12に示すように、「レスポンス」タブをクリックして、レスポンスを構成します。
UNKNOWNを、ステータスがR(拒否)の不明なレスポンスの受信として指定できます。
SUCCESSを、ステータスがC(完了)の操作の完了として指定できます。
ERRORを、ステータスがRのエラーの発生として指定できます。
タスクのオブジェクト・ステータス・マッピング・タブをクリックします。
図11-13に示すように、オブジェクト・ステータスをステータスがCのProvisionedに更新します。
プロセス・タスクを保存します。
プロビジョニング属性マッピング参照には、アイデンティティ・コネクタ・バンドル属性へのOracle Identity Managerフィールドのマッピングが含まれます。プロビジョニング属性マッピング参照の説明を次に示します。
コード・キーは、プロセス・フォームのフィールド・ラベルです。
デコードは、アイデンティティ・コネクタ・バンドル属性です。
子フォーム属性は、入力での埋込みオブジェクトとして構成できます。
アイデンティティ・コネクタのプロビジョニング操作は、レスポンスでUIDを返します。これは、アイデンティティ・コネクタ・バンドル属性に対してコーディングして、フォーム・フィールドに設定できます。
プロビジョニング属性マッピング参照を作成する手順は、次のとおりです。
Oracle Identity Manager Design Consoleにログインします。
「管理」タブの「参照定義」をクリックします。
新しい参照を作成し、Lookup.FlatFile.UM.ProvAttrMapという名前を付けます。
参照の名前は、オブジェクト・タイプの構成参照から参照されます。第11.2.2.3.2項「オブジェクト・タイプの構成参照の作成」を参照してください。
図11-14に示すように、フォーム・フィールド・ラベルをコード・キーとして追加し、アイデンティティ・コネクタ・バンドル属性をデコードとして追加します。
名前: __NAME__
性別: Gender
Return Id: __UID__
年齢: Age
資格情報: Qualification
注意: これらのプロパティは、高度なオプションで、コネクタの現在の実装では省略できます。 |
プロビジョニング属性マッピングの場合、次のフィールド・フラグをコード・キーに追加できます。
LOOKUP: これは、参照リコンシリエーション・ジョブの実行によって値が取得されるすべてのフィールドに指定する必要があります。参照リコンシリエーション・ジョブから取得された値には、ITリソース名/キーが追加されています。このフラグを指定すると、追加された値をバンドルに渡す直前にICF統合で削除するのに役立ちます。たとえば、ラベルがDatabaseで、参照リコンシリエーション・ジョブの実行により値が取得されたフィールドのコード・キーは、Database[LOOKUP]のようになります。
注意: LOOKUPフラグは、プロビジョニングとリコンシリエーション両方の属性マップに指定できます。プロビジョニングの場合、ITリソース名/ITリソース・キー接頭辞を削除する必要があります。リコンシリエーションの場合、ITリソース名/ITリソース・キー接頭辞を追加する必要があります。 |
IGNORE: これは、値が無視され、バンドルに送信されないすべてのフィールドに指定する必要があります。たとえば、ラベルがDatabaseで、値をバンドルに送信する必要がないフィールドのコード・キーは、Database[IGNORE]のようになります。
WRITEBACK: これは、作成操作または更新操作の直後に値をプロセス・フォームに書き戻す必要があるすべてのフィールドに指定する必要があります。このフラグを追加すると、ICF統合レイヤー・コールICF Get APIが、WRITEBACKフラグのマークがある属性の値を取得するようになります。たとえば、ラベルがDatabaseで、作成/更新の直後に値がプロセス・フォームに書き戻される必要があるフィールドのコード・キーは、Database[WRITEBACK]のようになります。これが機能するには、コネクタはGetApiOpインタフェースを実装し、ConnectorObject getObject(ObjectClass objClass、Uid uid、OperationOptionsオプション)APIに実装を提供する必要があります。このAPIは、Uidが渡されたUidと同じであるアカウントのターゲットを検索し、プロセス・フォームに書き戻されるすべての属性(およびその値)が含まれたコネクタ・オブジェクトをビルドします。
注意: コネクタがGetApiOpインタフェースを実装していない場合、WRITEBACKフラグは機能せず、エラーが生成されます。 |
DATE: これは、タイプがDateと見なされる必要があるフィールドに指定する必要があり、これがない場合、値は標準の文字列と見なされます。たとえば、ラベルがTodayで、値が日付形式で表示される必要があるフィールドのコード・キーは、Today[DATE]のようになります。
PROVIDEONPSWDCHANGE: これは、パスワード更新が発生した場合に、バンドル(ターゲット)に提供する必要があるすべてのフィールドに指定する必要があります。一部のターゲットは、追加の属性がすべてのパスワード変更で指定されると予測します。PROVIDEONPSWDCHANGEフラグを指定することで、パスワード変更がリクエストされた場合は必ずすべての追加フィールドまたは属性を送信するようICF統合に伝えます。たとえば、ラベルがExtra Attribute Needed for Password Changeで、パスワード更新時に値をバンドル(ターゲット)に提供する必要があるフィールドのコード・キーは、Extra Attribute Needed for Password Change[PROVIDEONPSWDCHANGE]のようになります。
この項では、フラット・ファイルのレコードのリコンシリエーションを構成する手順について説明します。ターゲット・リコンシリエーションを例として使用しますが、信頼できるリコンシリエーションも同様の方法で構成できます。リストされている順序で手順を実行してください。
デフォルトでは、リコンシリエーションはコネクタ・バンドルで検索操作を使用します。この操作は、Oracle Identity Managerを使用して構成されたスケジュール・タスクで呼び出されます。この手順は、次のサブ手順で構成されています。
スケジュール済タスクを定義するには、次の手順を実行します。
例11-4に示すように、スケジュール済タスク詳細が含まれたデプロイメント・マネージャXMLファイルを作成します。データベースの値を、使用しているデータベースに必ず更新してください。
例11-4 スケジュール済タスク詳細が含まれたデプロイメント・マネージャXML
<?xml version = '1.0' encoding = 'UTF-8'?> <xl-ddm-data version="2.0.1.0" user="XELSYSADM" database="jdbc:oracle:thin:@localhost:5524/estView.regress.rdbms.dev.mycompany.com" exported-date="1307546406635" description="FF"> <scheduledTask repo-type="MDS" name="Flat File Connector User Reconciliation" mds-path="/db" mds-file="Flat File Connector User Reconciliation.xml"> <completeXml> <scheduledTasks xmlns="http://xmlns.oracle.com/oim/scheduler"> <task> <name>Flat File Connector User Reconciliation</name> <class>oracle.iam.connectors.icfcommon.recon.SearchReconTask</class> <description>Flat File Connector User Reconciliation</description> <retry>0</retry> <parameters> <string-param required="false" encrypted="false" helpText="Filter">Filter</string-param> <string-param required="false" encrypted="false" helpText="Incremental Recon Date Attribute">Incremental Recon Date Attribute</string-param> <string-param required="false" encrypted="false" helpText="IT Resource Name">IT Resource Name</string-param> <string-param required="false" encrypted="false" helpText="Object Type">Object Type</string-param> <string-param required="false" encrypted="false" helpText="Latest Token">Latest Token</string-param> <string-param required="false" encrypted="false" helpText="Resource Object Name">Resource Object Name</string-param> </parameters> </task> </scheduledTasks> </completeXml> </scheduledTask> </xl-ddm-data>
このファイルをFlat File Connector User Reconciliation.xmlとして保存します。
Identity System Administrationにログインします。「システム管理」の下で、「インポート」をクリックします。
Flat File Connector User Reconciliation.xmlファイルを選択し、「インポート」をクリックします。
ウィザードのステップを完了します。
この手順では、スケジュール済タスクの作成方法について説明します。
Oracle Identity Manager拡張管理にログインします。
「システム管理」タブの「スケジューラ」をクリックします。
「新規」をクリックして、新しいスケジュール済ジョブを作成します。その後、ジョブ名をFlat Fileとして指定し、「タスク」フィールドで、参照から値をフラット・ファイル・コネクタ・ユーザー・リコンシリエーションとして選択します。ジョブの作成後、図11-15に示すようにジョブに値を指定します。スケジュール済タスクを追加して、図11-15に示すように、タイプにフラット・ファイル・コネクタ・ユーザー・リコンシリエーションを追加します。
パラメータを次のように設定します。
「ITリソース名」の値はFlat Fileとします。
リソース・オブジェクト名の値はFLATFILEとします。
「オブジェクト・タイプ」の値は「ユーザー」とします。
「適用」をクリックします。
リコンシリエーション・プロファイルでは、リコンシリエーション時のオブジェクト属性の構造を定義します。リコンシリエーション・プロファイルには、リコンシリエーションをサポートしているすべての属性が含まれている必要があります。
Oracle Identity Manager Design Consoleにログインします。
「リソース管理」の下の「リソース・オブジェクト」をクリックします。
「Flat File」リソース・オブジェクトを開きます。
図11-16に示すように、オブジェクト・リコンシリエーション・タブをクリックします。
次のリコンシリエーション・フィールドを追加します。
Return Id [String]、必須
名前 [String]、必須
性別 [String]
年齢 [String]
性別 [String]
ITリソース名 [IT Resource]、必須
構成を保存します。
リコンシリエーション・アクション・ルールでは、リコンシリエーションの動作を定義します。この手順では、一致が見つかった場合に行われるアクションを定義します。この手順では、Oracle Identity Manager Design Consoleにログインしていることを前提にしています。
「Flat File」リソース・オブジェクトを開きます。
オブジェクト・リコンシリエーション・タブをクリックします。
右側のフレームのリコンシリエーション・アクション・ルール・タブをクリックします。
1つのプロセス一致が見つかった場合(「ルール条件」)およびリンクの確立(「アクション」)として定義したアクション・ルールを追加します。
1つのエンティティ一致が見つかった場合(「ルール条件」)およびリンクの確立(「アクション」)として定義したアクション・ルールを追加します。
リコンシリエーション・プロファイルの作成をクリックします。
「保存」をクリックします。
リコンシリエーション・マッピングは、プロセス定義で実行する必要があります。これは、サポートされているリコンシリエーション・フィールドを(リソース・オブジェクトから)プロセス・フォーム・フィールドにマッピングすることです。このマッピングは、ターゲット・リコンシリエーションを構成する場合にのみ必要となります。
Oracle Identity Manager Design Consoleにログインします。
「プロセス管理」の下の「プロセス定義」をクリックします。
Flat Fileプロセス定義を開きます。
図11-18に示すように、リコンシリエーション・フィールド・マッピング・タブをクリックします。
リコンシリエーション・プロファイル・フィールドとプロセス・フォーム・フィールドとの間のマッピングを追加します。
ReturnId[String] = UD_FLATFILE_RETURNID
Name[String] = UD_FLATFILE_NAME, <KEY>
Age[String] = UD_FLATFILE_AGE
Gender[String] = UD_FLATFILE_GENDER
Qualification[String] = UD_FLATFILE_QUALIFICATION
IT Resource Name[IT Resource] = UD_FLATFILE_ITRESOURCE,<KEY>
構成を保存します。
9
注意: これらのプロパティは、高度なオプションで、コネクタの現在の実装では省略できます。 |
リコンシリエーション属性マッピングの場合は、次のフィールド・フラグをコード・キーに追加できます。
TRUSTED: これは、アカウントのステータスを表すフィールドのリコンシリエーション属性マップで指定する必要があります。このフラグは、信頼できるリコンシリエーションにのみ指定する必要があります。これが指定されている場合、アカウントのステータスは「アクティブ」または「無効」のいずれかになります。それ以外の場合、ステータスは「有効」または「無効」のいずれかになります。たとえば、ラベルがStatusで、値が「アクティブ」または「無効」のいずれかである必要があるフィールドのコード・キーは、Status[TRUSTED]のようになります。
DATE: これは、リコンシリエーション属性マップにおいて、タイプがDateと見なされる必要があるフィールドに指定する必要があります。たとえば、ラベルがTodayで、値が日付形式で表示される必要があるフィールドのコード・キーは、Today[DATE]のようにする必要があります。
リコンシリエーション一致ルールでは、ユーザー一致の計算用の式を定義します。
Oracle Identity Manager Design Consoleにログインします。
「開発ツール」の下の「リコンシリエーション・ルール」フォームを開きます。
「ルールの追加」をクリックします。
リソース・オブジェクトFlat Fileを選択します。
リコンシリエーション・ルール要素が追加されてから、リコンシリエーション・ルールがアクティブになっているように「アクティブ」フラグを確認します。
このルール要素を保存して追加します。
ユーザー・プロファイル・データの「ユーザー・ログイン」は、「名前」リソース属性と同等です。
ルールを保存します。
注意: リコンシリエーション・ルールに変更を行った場合は必ず、リコンシリエーション・プロファイルを再作成する必要があります。 |
フラット・ファイル・コネクタが動作する準備が整ったため、ユーザーは、Oracle Identity Managerにログインし、次の手順を使用してITリソース(ターゲット)を作成する必要があります。
タイプがFlat FileであるITリソースを作成します。
必要に応じて、ITリソース・パラメータを指定します。
必要に応じて、Lookup.FlatFile.Configurationに構成パラメータを指定します。