OAMおよびSPでのJITカスタム・ユーザー・プロビジョニングが続行されます

この記事では、OAM/SPでカスタム・ユーザー・プロビジョニング・モジュールを構築する方法を示します。これは、このようなモジュールの開発方法を説明するOAM開発者ガイドの第16章に基づいています。

この記事では、次のことに焦点を当てます。

この例では、OAM開発者ガイドに記載されているサンプル・コードを使用します。

カスタム・ユーザー・プロビジョニング・モジュール

ユーザー・プロビジョニング・フレームワークでは、フレームワークで定義されたインタフェースを実装するカスタム・プラグインを実装できます。

カスタム・ユーザー・プロビジョニング・プラグインは次のもので構成されます。

これらの3つの要素はJARファイルにバンドルされ、OAM管理コンソールを介してOAMサーバーにアップロードされます。アップロードしてアクティブ化すると、OAM/SPが実行時に使用できます。

Javaクラス

カスタム・ユーザー・プロビジョニング・モジュールを実装するクラスは、次のものに従う必要があります。

次のコードは、CustomerUserProvisioningというカスタム・プラグインの例です。

package userprov;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Map;
import javax.naming.Context;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.InitialDirContext;
import oracle.security.am.plugin.ExecutionStatus;
import oracle.security.am.plugin.MonitoringData;
import oracle.security.am.plugin.PluginConfig;
import oracle.security.fed.plugins.fed.provisioning.OIFUserProvisioningPlugin;
import oracle.security.fed.plugins.fed.provisioning.UserContext;
import oracle.security.fed.plugins.fed.provisioning.UserProvisioningException;


public class CustomUserProvisioning extends OIFUserProvisioningPlugin implements
org.osgi.framework.BundleActivator
{
	private String userBaseDN = null;
	public ExecutionStatus initialize(PluginConfig config)
	{
	ExecutionStatus status = super.initialize(config);
	if (status.getStatus() == ExecutionStatus.SUCCESS.getStatus())
		userBaseDN = (String)config.getParameter("USER_BASE_DN");
		return status;
	}
public ExecutionStatus process(UserContext  context) throws UserProvisioningException
{
	try
	{
		// get user data
	 // after OIF/SP processing of the attributes sent by the IdP, we expect
// givenname, sn, mail as well as fed.nameidvalue which contains
// the userid
		Map assertionAbributes = context.getAttributes();
		Collection collection = (Collection)assertionAbributes.get("givenname");
		String firstname = (String)(collection.size() > 0 ? collection.iterator().next() : null);
		collection =  (Collection)assertionAbributes.get("sn");
		String lastname = (String)(collection.size() > 0 ? collection.iterator().next() : null);
		collection = (Collection)assertionAbributes.get("mail");
		String email = (String)(collection.size() > 0 ? collection.iterator().next() : null);
		collection =  (Collection)assertionAbributes.get("fed.nameidvalue"); String userid = (String)(collection.size() > 0 ?
collection.iterator().next() : null);

// check that the required attributes are present. If not, return an error

if (firstname == null || firstname.length() == 0 || lastname == null || lastname.length() == 0 ||  email == null || email.length() == 0 ||
userid == null || userid.length() == 0)
	{

	// failure
		return ExecutionStatus.FAILURE;
	}
	String ldap = "ldap://adc00pcc.us.oracle.com:11389";
	String username = "cn=orcladmin"; String password = "welcome1";

// connects to the LDAP directory

		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
		env.put(Context.PROVIDER_URL, ldap);

		if (ldap.toLowerCase().startsWith("ldaps"))
			env.put(Context.SECURITY_PROTOCOL, "ssl");
			env.put(Context.SECURITY_AUTHENTICATION,"simple");
			env.put(Context.REFERRAL, "follow"); env.put(Context.SECURITY_PRINCIPAL, username);
			env.put(Context.SECURITY_CREDENTIALS, password);

		InitialDirContext ldapContext = new

		InitialDirContext(env);

// create the user entry

		BasicAttributes attributes = new

		BasicAttributes();

// object classes

		BasicAttribute objClassAbr = new

		BasicAttribute("objectClass");

		objClassAbr.add("person");

		objClassAbr.add("organizationalPerson");

		objClassAbr.add("inetOrgPerson");

		objClassAbr.add("top");

		attributes.put(objClassAbr);

// uid abr

		attributes.put(new BasicAttribute("uid", userid));

// first name

		attributes.put(new BasicAttribute("givenname", firstname));

// last name

		attributes.put(new BasicAttribute("sn", lastname));

// email

		attributes.put(new BasicAttribute("mail", email));

// DN: cn will be set to userID

		String dn = "cn=" + userid + (userBaseDN != null && userBaseDN.length() \> 0 ? "," + userBaseDN : "");

// create the user record

		ldapContext.createSubcontext(dn, attributes);

// return success

		return ExecutionStatus.SUCCESS;

	}

catch (Exception ex)

	{
		ex.printStackTrace();
		return ExecutionStatus.FAILURE;

	}
}

	public String getPluginName()
	{
		return "CustomProvisioningPlugin";
	}
	public String getDescription()
	{
		return "Custom Provisioning Plugin";
	}
	public Map<String, MonitoringData> getMonitoringData()
	{
		return null;
	}
	public boolean getMonitoringStatus()
	{
		return false;
	}
	public int getRevision()
	{
		return 10;
	}
	public void setMonitoringStatus(boolean status)
	{

	}
	public void start(BundleContext arg0) throws Exception
	{

	}
	public void stop(BundleContext arg0) throws  Exception

	{

	}

}

プラグイン登録ファイル

カスタム・ユーザー・プロビジョニング・プラグインは、次のようなプラグインXMLファイルで定義する必要があります。

<Plugin type="User Provisioning">
<author>uid=admin</author>
<email>admin@example</email>
<creationDate>08:00:00,2014-01-15</creationDate>
<description>Custom Provisioning Plugin</description>
 <configuration>
   <AbributeValuePair>
     <Attribute type="string" length="100">USER_BASE_DN</Abribute> <mandatory>false</mandatory>
     <instanceOverride>false</instanceOverride>
     <globalUIOverride>false</globalUIOverride>
     <value> </value>
  </AbributeValuePair>
</configuration>
</Plugin>

重要なノート: XMLファイルは、プラグインを実装するクラスと同じ名前である必要があります(この場合はCustomUserProvisioning.XML)。

詳細は、『OAM開発者ガイド』を参照してください。

manifestファイル

カスタム・ユーザー・プロビジョニング・プラグインをJARファイルにパッケージ化する前に、次のようなMANIFEST.MFを定義する必要があります。

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: CustomUserProvisioning
Bundle-SymbolicName: CustomUserProvisioning
Bundle-Version: 10
Bundle-Activator: userprov.CustomUserProvisioning Import-Package: org.osgi.framework;version="1.3.0",oracle.security.fed
.plugins.fed.provisioning,javax.naming,javax.naming.directory,oracle. security.am.plugin
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

詳細は、『OAM開発者ガイド』を参照してください。

ノート: マニフェスト・ファイルには、プラグインで使用されるすべてのパッケージをリストするImportPackageプロパティが含まれている必要があります。

プラグインの構築

コンパイル

OAMデプロイメントの次のJARファイルをコンパイルに使用する必要があります。

これらのファイルは、次の場所にあります。

コンコンパイルするには、次のコマンドを実行します。

$JDK_HOME/bin/javac -cp $IAM_HOME/oam/server/lib/plugin/felix.jar:$IAM_HOME/oam/server/lib/plugin/oam-plugin.jar:/tmp/oam-server/APPINF/lib/fed.jar src/userprov/*.java

カスタム・プラグインのパッケージ化

前の項にリストされた内容に基づいて現在のディレクトリにMANIFEST.MFを作成し、前の項にリストされたプラグイン定義を含むsrcディレクトリをCustomUserProvisioning.xmlinしました。

find
.
./MANIFEST.MF
./src
./src/userprov
./src/userprov/CustomUserProvisioning.class
./src/userprov/CustomUserProvisioning.java ./src/CustomUserProvisioning.xml

プラグインおよび必要なファイルを含むCustomUserProvisioning.JAR JARファイルを作成するには、次のコマンドを実行します:

jar cfvm CustomUserProvisioning.jar MANIFEST.MF -C src/ .
added manifest adding: userprov/(in = 0) (out= 0)(stored 0%) adding: userprov/CustomUserProvisioning.class(in =3991) (out= 1954)(de_ated 51%)
adding: userprov/CustomUserProvisioning.java(in =4717) (out= 1401)(de_ated 70%)
adding: CustomUserProvisioning.xml(in = 486) (out= 266)(de_ated 45%)

これにより、CustomUserProvisioning.jarが作成されます。ファイルのコンテンツを表示するには:

unzip -l CustomUserProvisioning.jarアーカイブ: CustomUserProvisioning.jar

長さ 日付 時間 名前
0 03-01-2014 14:32 メタイン/
404 03-01-2014 14:32 メタイン/MANIFEST.MF
0 03-01-2014 12:10 ユーザー・プロバイダ/
3991 03-01-2014 12:10 ユーザー・プロバイダ/CustomUserProvisioning.class
4717 03-01-2014 11:42 ユーザー・プロバイダ/CustomUserProvisioning.java
486 03-01-2014 14:04 CustomUserProvisioning.xml
9598     6ファイル

重要なノート: JARファイルは、プラグインを実装するクラスと同じ名前である必要があります(この場合はCustomUserProvisioning.JAR)。

カスタム・プロビジョニング・モジュールのデプロイ

次のステップを実行して、カスタム・ユーザー・プロビジョニング・プラグインをOAMにデプロイします。

  1. OAM管理コンソール(http(s)://OAM-admin-host:OAM-adminport/oamconsole)に移動します。

  2. 「アクセス・マネージャ」「プラグイン」にナビゲートします。

  3. 「プラグインのインポート」をクリックします。

  4. プラグインJARファイル(この例ではCustomUserProvisioning.JAR)を選択します。

図Import_Plugin.jpgの説明

プラグインはアップロードされた状態になります:

図Plugin_Screen.jpgの説明

プラグインを実行時のOAMサーバーに分散してアクティブ化する必要があります。

  1. プラグインを選択します。

  2. 「選択項目の配布」をクリックします。

  3. プラグインの「アクティブ化ステータス」タブに、プラグインの状態が表示されます。

図Plugin_Status.jpgの説明

プラグインを有効化する必要があります:

  1. プラグインを選択します。

  2. 「選択項目のアクティブ化」をクリックします。

  3. プラグインの「アクティブ化ステータス」タブに、プラグインの状態が表示されます。

図Activation_Status.jpgの説明

最後に、ユーザーベースDNに対してプラグインを構成する必要があります。次のステップを実行します:

  1. プラグインを選択します。

  2. プラグインの「構成パラメータ」タブをクリックします。

  3. ユーザー・ベースDNを入力します(たとえば、使用しているディレクトリの場合: ou= users、dc= us、dc= oracle、dc= com)。

  4. 「保存」をクリックします。

図Configure_Plugin.jpgの説明

カスタム・ユーザー・プロビジョニング・モジュールの使用

OAMでのユーザー・プロビジョニングの有効化

OAM/SPでユーザー・プロビジョニングを有効化/無効化するには、次のステップを実行します。

  1. $IAM_ORACLE_HOME/common/bin/WLST.shを実行して、WLST環境を入力します。

  2. WLS管理サーバー(connect())に接続します。

  3. 「ドメイン・ランタイム」ブランチdomainRuntime()に移動します。

  4. userprovisioningenabledプロパティを次のように更新します。

  5. OAM/SPでのユーザー・プロビジョニングの有効化: putBooleanProperty("/fedserverconfig /userprovisioningenabled", "true")

  6. OAM/SPでのユーザー・プロビジョニングの無効化: putBooleanProperty("/fedserverconfig /userprovisioningenabled", "false")

  7. WLST環境exit()を終了します。

カスタム・プラグインを使用するためのOAMの構成

カスタム・プラグインを使用するようにOAM/SPを構成するには、次のステップを実行します。

  1. $IAM_ORACLE_HOME/common/bin/WLST.shを実行して、WLST環境を入力します。

  2. WLS管理サーバー(connect())に接続します。

  3. 「ドメイン・ランタイム」ブランチdomainRuntime()に移動します。

  4. userprovisioningpluginプロパティを次のように更新します: カスタム・プラグインを使用するようにOAMを構成し、プロパティをプラグイン名(この例ではCustomUserProvisioning)に設定します: putStringProperty("/fedserverconfig/userprovisioningplugin","CustomUserProvisioning")

  5. 組込みのユーザー・プロビジョニング・モジュールを使用するようにOAMを構成します: putStringProperty("/fedserverconfig /userprovisioningplugin","FedUserProvisioningPlugin")

  6. WLST環境exit()を終了します。

設定のテスト

前に構成したのと同じSAML 2.0フェデレーション設定を使用します。ここでは:

リモートのIdPパートナとのSAML 2.0フェデレーションSSO中に、IdPによって返されたアサーションを含むXML SAMLレスポンスは次のようになります。

<samlp:Response ..>
 <saml:Issuer ...>http://acme.com/idp</saml:Issuer>
 <samlp:Status>
   <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
</samlp:Status>
<saml:Assertion ...>
<saml:Issuer ...>http://acme.com/idp</saml:Issuer>
<dsig:Signature ...>
 ...
</dsig:Signature>
<saml:Subject>
<saml:NameID ...>alice</saml:NameID>
...
</saml:Subject>
<saml:Conditions ...>
 ...
</saml:Conditions>
<saml:AuthnStatement ...>
...
</saml:AuthnStatement>
<saml:AbributeStatement ...>
<saml:Attribute Name="email" ...>
 <saml:AbributeValue ...>alice@oracle.com</saml:AbributeValue>
</saml:Abribute>
<saml:Attribute Name="title" ...>
<saml:AbributeValue ...>manager</saml:AbributeValue>
</saml:Abribute>
<saml:Attribute Name="surname" ...>
<saml:AbributeValue ...>Appleton</saml:AbributeValue>
</saml:Abribute>
<saml:Attribute Name="fname" ...>
<saml:AbributeValue ...>Alice</saml:AbributeValue>
</saml:Abribute>
</saml:AbributeStatement>
</saml:Assertion>
</samlp:Response>

OAM/SPによるSAML 2.0アサーションの処理結果には、変換された属性とNameIDが表示されます

図Operation_Result.jpgの説明

テスト

フェデレーションSSOの後、aliceのユーザー・レコードが作成されました。

その他の学習リソース

docs.oracle.com/learnで他のラボを探すか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。