OAMおよびSPでのJITカスタム・ユーザー・プロビジョニングが続行されます
この記事では、OAM/SPでカスタム・ユーザー・プロビジョニング・モジュールを構築する方法を示します。これは、このようなモジュールの開発方法を説明するOAM開発者ガイドの第16章に基づいています。
この記事では、次のことに焦点を当てます。
-
プラグインの実装
-
コンパイル
-
パッケージ
-
プラグインをOAMにアップロードします
-
新しくアップロードしたプラグインを使用するようにOAMを構成します
この例では、OAM開発者ガイドに記載されているサンプル・コードを使用します。
カスタム・ユーザー・プロビジョニング・モジュール
ユーザー・プロビジョニング・フレームワークでは、フレームワークで定義されたインタフェースを実装するカスタム・プラグインを実装できます。
カスタム・ユーザー・プロビジョニング・プラグインは次のもので構成されます。
-
カスタム・ユーザー・プロビジョニング・プラグインを実装する1つ以上のJavaクラス。いずれかのクラスが
oracle.security.fed.plugins.fed.provisioning.OIFUserProvisioningPluginクラスを拡張します。 -
Javaクラスを記述する
MANIFEST.MFファイル。 -
プラグインを説明する XMLファイル。
これらの3つの要素はJARファイルにバンドルされ、OAM管理コンソールを介してOAMサーバーにアップロードされます。アップロードしてアクティブ化すると、OAM/SPが実行時に使用できます。
Javaクラス
カスタム・ユーザー・プロビジョニング・モジュールを実装するクラスは、次のものに従う必要があります。
-
oracle.security.fed.plugins.fed.provisioning.OIFUserProvisioningPluginクラスを拡張します。 -
次のメソッドを実装します: パブリック
ExecutionStatusプロセス(UserContextコンテキスト)はUserProvisioningExceptionをスローします。 -
このメソッドは、ユーザー・レコードを作成する必要があるときに呼び出されます。
-
ステータス(失敗または成功)を返す必要があります。
-
この例では、このメソッドは、
UserContextに含まれるユーザー・データに必要な情報があることを確認します。 -
LDAPサーバーへの接続を開きます。
-
ユーザー・レコードを作成します。
-
public文字列
getPluginName()は、カスタム・ユーザー・プロビジョニング・モジュールの名前を返します。 -
この例では、
CustomProvisioningPluginを返します。 -
public文字列
getDescription()は、カスタム・ユーザー・プロビジョニング・モジュールの説明を返します。 -
この例では、
Custom Provisioning Pluginを返します。 -
パブリック・マップ
<String, MonitoringData> getMonitoringData()は、ユーザー・プロビジョニング・フローでは使用されません。 -
この例ではnullを返します。
-
パブリック・ブール
getMonitoringStatus()は、ユーザー・プロビジョニング・フローでは使用されません。 -
この例では、falseを返します。
-
public int
getRevision()は、マニフェスト・ファイルで指定されたバージョンと同じ値である必要があります。 -
この例では、10を返します。
-
public void
setMonitoringStatus(boolean status)は、ユーザー・プロビジョニング・フローでは使用されません。 -
この例では、このメソッドは空です。
-
クラスには、
org.osgi.framework.BundleActivatorインタフェースと次のメソッドを実装する必要があります。-
public void start(BundleContext arg0)がExceptionをスローします。
-
この例では、このメソッドは空です。
-
-
public void stop(BundleContext arg0)がExceptionをスローします。
-
この例では、このメソッドは空です。
-
オプションで、プラグインがプラグイン設定から構成データを読み取る必要がある場合、
initialize()メソッドを実装できます。 -
パブリックExecutionStatus初期化(PluginConfig構成)
-
この例では、このメソッドはプラグイン構成の設定エントリからユーザー・ベースDNを読み取ります:
USER_BASE_DN
次のコードは、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ファイルをコンパイルに使用する必要があります。
-
felix.jar
-
oam- plugin.jar
-
fed.jar
これらのファイルは、次の場所にあります。
-
felix.jar:
$IAM_HOME/oam/server/lib/plugin/felix.jar -
oam- plugin.jar:
$IAM_HOME/oam/server/lib/plugin/oam-plugin.jar -
fed.jar:
$DOMAIN_HOME/servers/MANAGED_INSTANCE_NAME/tmp/_WL_user/oam_server/RANDOM_STRING/APP-INF/libで、テスト・インストールの88g74iなど、RANDOM_STRINGはランダムな文字を含むディレクトリ名です。この例では、CustomerUserProvisioning.javaファイルをsrc/userprovフォルダ(bash- 4.1$ ls - lsrc/userprov/total 8-rw-r--r-- 1 root root 4717 Mar 1 11:42 CustomUserProvisioning.java)に配置します
コンコンパイルするには、次のコマンドを実行します。
$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にデプロイします。
-
OAM管理コンソール(
http(s)://OAM-admin-host:OAM-adminport/oamconsole)に移動します。 -
「アクセス・マネージャ」、「プラグイン」にナビゲートします。
-
「プラグインのインポート」をクリックします。
-
プラグインJARファイル(この例では
CustomUserProvisioning.JAR)を選択します。

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

プラグインを実行時のOAMサーバーに分散してアクティブ化する必要があります。
-
プラグインを選択します。
-
「選択項目の配布」をクリックします。
-
プラグインの「アクティブ化ステータス」タブに、プラグインの状態が表示されます。

プラグインを有効化する必要があります:
-
プラグインを選択します。
-
「選択項目のアクティブ化」をクリックします。
-
プラグインの「アクティブ化ステータス」タブに、プラグインの状態が表示されます。

最後に、ユーザーベースDNに対してプラグインを構成する必要があります。次のステップを実行します:
-
プラグインを選択します。
-
プラグインの「構成パラメータ」タブをクリックします。
-
ユーザー・ベースDNを入力します(たとえば、使用しているディレクトリの場合: ou= users、dc= us、dc= oracle、dc= com)。
-
「保存」をクリックします。

カスタム・ユーザー・プロビジョニング・モジュールの使用
OAMでのユーザー・プロビジョニングの有効化
OAM/SPでユーザー・プロビジョニングを有効化/無効化するには、次のステップを実行します。
-
$IAM_ORACLE_HOME/common/bin/WLST.shを実行して、WLST環境を入力します。 -
WLS管理サーバー(
connect())に接続します。 -
「ドメイン・ランタイム」ブランチ
domainRuntime()に移動します。 -
userprovisioningenabledプロパティを次のように更新します。 -
OAM/SPでのユーザー・プロビジョニングの有効化:
putBooleanProperty("/fedserverconfig /userprovisioningenabled", "true") -
OAM/SPでのユーザー・プロビジョニングの無効化:
putBooleanProperty("/fedserverconfig /userprovisioningenabled", "false") -
WLST環境
exit()を終了します。
カスタム・プラグインを使用するためのOAMの構成
カスタム・プラグインを使用するようにOAM/SPを構成するには、次のステップを実行します。
-
$IAM_ORACLE_HOME/common/bin/WLST.shを実行して、WLST環境を入力します。 -
WLS管理サーバー(
connect())に接続します。 -
「ドメイン・ランタイム」ブランチ
domainRuntime()に移動します。 -
userprovisioningpluginプロパティを次のように更新します: カスタム・プラグインを使用するようにOAMを構成し、プロパティをプラグイン名(この例ではCustomUserProvisioning)に設定します:putStringProperty("/fedserverconfig/userprovisioningplugin","CustomUserProvisioning") -
組込みのユーザー・プロビジョニング・モジュールを使用するようにOAMを構成します:
putStringProperty("/fedserverconfig /userprovisioningplugin","FedUserProvisioningPlugin") -
WLST環境
exit()を終了します。
設定のテスト
前に構成したのと同じSAML 2.0フェデレーション設定を使用します。ここでは:
-
OAMはサービス・プロバイダとして機能します。
-
IdP (
AcmeIdP)は、次のものを使用してSAMLアサーションを送信します-
NameIDをuserIDに設定 -
属性送信済
-
ユーザーのEメール・アドレスに設定されたEメール
-
fnameがユーザーの名前に設定されました
-
-
ユーザーの姓に設定された名前
-
ユーザーの最後のジョブ・タイトルに設定されたタイトル
-
IdP属性プロファイルで構成されたOAM/SP
-
fnameを指定された名前にマップ
-
surnameからsnへのマップ
-
電子メールをメールにマップ
-
ユーザー・アリスはIdPで使用されますが、aliceのユーザー・アカウントはOAM/SPに存在しません。
-
userID: alice
-
電子メール: alice@oracle.com
-
名: Alice
-
姓: Appleton
-
title: manager
-
リモートの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が表示されます

テスト
フェデレーションSSOの後、aliceのユーザー・レコードが作成されました。
- dn: uid= alice,ou= users,dc= us,dc= oracle,dc= com
- mail: alice@oracle.com
- givenName: Alice
- objectClass: 個人
- objectClass: inetOrgPerson
- objectClass: organizationalPerson
- objectClass: 上部
- uid: alice
- cn: alice
- n: alice
- sn: Appleton
その他の学習リソース
docs.oracle.com/learnで他のラボを探すか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
JIT Custom User Provisioning in OAM and SP Continued
F60939-01
September 2022
Copyright © 2022, Oracle and/or its affiliates.