| Oracle® Fusion Middleware Oracle Access Management開発者ガイド 11gリリース2 (11.1.2) B69537-02 |
|
![]() 前 |
![]() 次 |
Oracle Access Management Identity Federation (Identity Federation)は、Access Managerのプラグイン・フレームワークを使用して、ユーザーのプロビジョニングを容易に行えるようにします。標準のユーザー・プロビジョニング・プラグインが提供されており、さらに、ここで説明するように、カスタムのプラグインを開発することもできます。この章の内容は次のとおりです。
|
参照: デフォルトのユーザー・プロビジョニング・プラグインの使用方法の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。 |
Identity Federationがサービス・プロバイダ(SP)モードで動作している場合、ユーザー・アサーションはローカル・ストアにマップされ、フェデレーテッド・シングル・サインオンを実行します。ただし、場合によっては、サービス・プロバイダがユーザー・アサーションを実行する際に、ユーザーが見つからないことがあります。デフォルトのユーザー・プロビジョニング・プラグイン(LDAPProvisioningPlugin)は、Access Managerアイデンティティ・ストアとして構成されたLDAPストア内のユーザーをプロビジョニングします。
実行時に収集されたすべての情報は、標準またはカスタムの任意のユーザー・プロビジョニング・プラグインに渡されます。カスタムのユーザー・プロビジョニング・プラグインは、この情報に基づいて、取得および使用する必要のあるユーザー情報を決定する必要があります。また、各カスタム・プラグインには、プロビジョニングするユーザーの追加処理を実行するための独自の構成を含めることができます。
Identity FederationがSPモードで動作しており、アサーションのユーザーへのマップに失敗した場合、Identity Federationはそのユーザーをプロビジョニングする必要があるかどうかを確認するため、構成プロパティを探します。ユーザー・プロビジョニング・フラグがtrueに設定されている場合、Identity Federationは起動する必要のあるプラグイン名を検索します。カスタム・プラグインが使用されていない場合は、標準プラグイン(LDAPProvisioningPlugin)がデフォルトで起動されます。GenricPluginFactoryを使用して定義されているプラグインを検索し、プロビジョニング・ロジックを実行します。
Identity Federationは、パートナnameideattrnameに関連付けられたプロパティを取得し、プラグインに送信された属性リストのnameid値に移入します。Identity Federationが標準プラグインを使用するように構成されている場合、データ・ストアの選択肢は次のとおりです。
Identity Federationがパートナ固有のデータ・ストア(マルチストア)を使用している場合、Identity Federationはアイデンティティ・ストア名をプラグインに渡します。
Identity Federationがデフォルトのユーザー・アイデンティティ・ストアを使用する場合、標準のプラグインはユーザー・プロビジョニングAPIを使用して、データ・ストアのユーザー・データをプロビジョニングします。
パートナ固有のストアが構成されていない場合は、デフォルトのアイデンティティ・ストアが使用されます。
デフォルトのアイデンティティ・ストアとパートナ固有のストアのどちらが使用されるかに関係なく、ユーザーのプロビジョニングに使用されるユーザー・プロビジョニングAPIは同じです。
カスタムのユーザー・プロビジョニング・プラグインが拡張する主なクラスはOIFUserProvisioningPluginです。次のインタフェースがカスタム・プラグインに対して公開されています。
oracle.security.fed.plugins.fed.provisioning.OIFUserProvisioningPlugin.java (oracle.security.am.plugin.AbstractAMPluginを拡張します)
oracle.security.fed.plugins.fed.provisioning.UserContext.java
oracle.security.fed.plugins.fed.provisioning.UserProvisioningException.java
oracle.security.fed.plugins.fed.provisioning.UserProvisioningConstants.java
これらのインタフェースの詳細は、Oracle Fusion Middleware Oracle Access Management Identity Federationユーザー・プロビジョニング・プラグインJava APIリファレンスを参照してください。
カスタムのユーザー・プロビジョニング・プラグインのjarファイル構造は、Access Managerのカスタム認証プラグイン構造に準拠している必要があります。つまり、これには、plugin.class、plugin.xmlおよびMANIFEST.MFファイルが必要です。この構造の詳細は、第3.4項「サンプル・コード: カスタム・データベース・ユーザー認証プラグイン」を参照してください。
この項では、次のユーザー・プロビジョニング・プラグインのコード・サンプルを示します。
例13-1 UserProvisioning.javaのサンプル
package oif.test;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
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.UserProvisioningConstants;
import oracle.security.fed.plugins.fed.provisioning.UserProvisioningException;
/*
* Sample OIF User proisioning plugin
*/
public class ProvisioningPlugin extends OIFUserProvisioningPlugin {
private boolean monitoringStatus = false;
private Map paramMap ;
private String userRecordAttrList = null;
private String useridAssertionAttr = null;
/* (non-Javadoc)
*/
@Override
public ExecutionStatus process(UserContext context) throws UserProvisioningException {
/*
* Execute method for plugin
*/
boolean provisioningStatus = false;
try{
Map<String, Object> attrs = context.getAttributes();
Map<String, Object> attrsMapping = context.getAttributesUsedInMapping();
if (useridAssertionAttr == null) {
System.out.println("User id attribute to create user is not found in the attributes list");
return ExecutionStatus.ABORT;
}
String userid = null;
if (attrs.containsKey(useridAssertionAttr)) {
Object valueObj = attrs.get(useridAssertionAttr);
if (valueObj instanceof String)
userid = (String) valueObj;
else {
userid = (String)((Set) valueObj).iterator().next();
}
}
DirContext ctx = getContext();
// creating the user record
Attributes record = new BasicAttributes();
// Create the objectclass to add
Attribute objClasses = new BasicAttribute("objectClass");
objClasses.add("top");
objClasses.add("person");
String objectClass = "inetOrgPerson";
objClasses.add(objectClass);
objClasses.add("organizationalPerson");
record.put(objClasses);
String userIDAttr = "uid";
// Set the attributes
record.put(new BasicAttribute(userIDAttr, userid));
StringTokenizer st = new StringTokenizer(userRecordAttrList, ",");
while (st.hasMoreTokens()) {
String key = (String) st.nextToken();
record.put(new BasicAttribute(key, attrs.get(key)));
}
Set keys = attrsMapping.keySet();
Iterator itr = keys.iterator();
while (itr.hasNext()) {
String key = (String) itr.next();
if (!attrs.containsKey(key)) {
record.put(new BasicAttribute(key, attrsMapping.get(key)));
}
String ldapUserBaseDN = "dc=iplanet,dc=com";
// Create the record
ctx.createSubcontext("cn=" + userid + "," + ldapUserBaseDN, record);
provisioningStatus = true;
}
catch(Exception e){
/*
* If exception abort the authentication.
*/
e.printStackTrace();
return ExecutionStatus.ABORT;
}
if( provisioningStatus){
/*
* Success
*/
return ExecutionStatus.SUCCESS;
}else{
/*
* Failure.
*/
return ExecutionStatus.FAILURE;
}
}
/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#initialize(java.util.Map)
*/
@Override
public ExecutionStatus initialize(PluginConfig config) {
//success for the execution status
userRecordAttrList = (String)config.getParameter(UserProvisioningConstants.KEY_USER_RECORD_ATTRIBUTE_LIST);
useridAssertionAttr = (String)config.getParameter(UserProvisioningConstants.KEY_USERID_ATTRIBUTE_NAME);
return ExecutionStatus.SUCCESS;
}
/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getDescription()
*/
@Override
public String getDescription() {
return "Ldap Provisioning Plugin";
}
/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getMonitoringData()
*/
@Override
public Map < String, MonitoringData > getMonitoringData() {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getMonitoringStatus()
*/
@Override
public boolean getMonitoringStatus() {
return monitoringStatus;
}
/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getName()
*/
@Override
public String getPluginName() {
return "LDAP_Provisioning_plugin";
}
/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#getVersion()
*/
@Override
public int getRevision() {
return 10;
}
/* (non-Javadoc)
* @see oracle.security.am.plugin.GenericPluginService#setMonitoringStatus(boolean)
*/
@Override
public void setMonitoringStatus(boolean status) {
monitoringStatus = status;
}
private DirContext getContext() {
try {
DirContext context = null;
String ldapURL = "ldap://myldap.oracle.com:389";
String ldapUserBaseDN = "dc=iplanet,dc=com";
Hashtable<String, String> env = new Hashtable <String, String> ();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldapURL);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.REFERRAL, "follow");
String credential = "password";
String secPrincipal = "cn=Directory Manager";
env.put(Context.SECURITY_PRINCIPAL, secPrincipal);
env.put(Context.SECURITY_CREDENTIALS, credential);
context = new InitialDirContext (env);
return context;
} catch (NamingException ne) {
throw new UserProvisioningException(ne);
} catch (Throwable e) {
throw new UserProvisioningException(e);
}
}
}
例13-2 UserPlugin.xmlのサンプル
<Plugin type="User Provisioning"> <author>uid=User1</author> <email>User1@mycompany</email> <creationDate>09:32:20,2012-06-15</creationDate> <description>User provisioning</description> <configuration> <AttributeValuePair> <Attribute type="string" length="100">KEY_USERID_ATTRIBUTE_NAME</Attribute> <mandatory>false</mandatory> <instanceOverride>false</instanceOverride> <globalUIOverride>true</globalUIOverride> <value>uid</value> </AttributeValuePair> <AttributeValuePair> <Attribute type="string" length="200">KEY_USER_RECORD_ATTRIBUTE_LIST</Attribute> <mandatory>true</mandatory> <instanceOverride>false</instanceOverride> <globalUIOverride>true</globalUIOverride> <value>mail,uid</value> </AttributeValuePair> </configuration> </Plugin>
例13-3 MANIFEST.MFのサンプル
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: ProvisioningPlugin Bundle-SymbolicName: ProvisioningPlugin Bundle-Version: 10 Bundle-Activator: oif.test.ProvisioningPlugin Import-Package: org.osgi.framework;version="1.3.0",oracle.security.fed.plugins.fed.provisioning Bundle-RequiredExecutionEnvironment: JavaSE-1.6
この項では、カスタムのIdentity Federationユーザー・プロビジョニング・プラグインの記述手順を示します。以降では、システム・アーキテクトがカスタム・プラグインのビジネス要件を識別し、ユーザーがローカル・ユーザー・ストアにマップされていない場合のユーザー・プロビジョニング・フローを検討した後に開発者が実行する必要があるアクションについて説明します。
この項には次のトピックが含まれます。
Identity FederationはAccess Managerプラグイン・フレームワークを使用するので、それらプロセスは類似しています。詳細は、第3.1.2項「計画、認証モデルおよびプラグインについて」を参照してください。
OIFUserProvisioningPluginクラスを拡張し、次のメソッドを実装します。詳細は、第3.5.1項「カスタム認証プラグインの記述について」を参照してください。
initializeメソッドの実装
processメソッドの実装
適切なAccess Manager 11gインタフェースおよびパッケージを使用して、プラグイン・コードを開発します。詳細は、次を参照してください。
カスタム・プラグインのメタデータを作成します。詳細は、第3.4.2項「プラグイン構成メタデータ要件のサンプル」を参照してください。
プラグインjarファイルおよびマニフェストを作成し、これらをデプロイ・チームに引き渡します。詳細は、次を参照してください。
カスタム認証プラグインのデプロイと管理の詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。
カスタムのユーザー・プロビジョニング・プラグインをコンパイルするには、次のjarファイルが必要です。
felix.jar
oam-plugin.jar
fed.jar
これらのファイルは、DOMAIN_HOME/servers/managed_instance_name/tmp/_WL_user/oam_server_11.1.2.0.0/RANDOM_STRING/APP-INF/libに置かれています。