JIT-Benutzer-Provisioning in OAM und SP fortgesetzt
Dieser Artikel zeigt, wie ein benutzerdefiniertes Benutzer-Provisioning-Modul in OAM/SP erstellt wird. Dies basiert auf dem OAM Developer's Guide, Kapitel 16, in dem beschrieben wird, wie ein solches Modul entwickelt wird.
In diesem Artikel konzentrieren Sie sich auf Folgendes:
-
Plug-in implementieren
-
Kompilieren
-
In Package integrieren
-
Plug-in in OAM hochladen
-
OAM für die Verwendung des neu hochgeladenen Plug-ins konfigurieren
In diesem Beispiel verwenden Sie den im OAM Developer's Guide aufgeführten Beispielcode.
Benutzerdefiniertes Benutzer-Provisioning-Modul
Das Benutzer-Provisioning-Framework ermöglicht die Implementierung eines benutzerdefinierten Plug-ins, das die vom Framework definierten Schnittstellen implementiert.
Ein benutzerdefiniertes Benutzer-Provisioning-Plug-in besteht aus:
-
Eine oder mehrere Java-Klassen, die das benutzerdefinierte Benutzer-Provisioning-Plug-in implementieren. Eine der Klassen erweitert die Klasse
oracle.security.fed.plugins.fed.provisioning.OIFUserProvisioningPlugin. -
Eine
MANIFEST.MF-Datei, in der die Java-Klassen beschrieben werden. -
Eine XML-Datei, die das Plug-in beschreibt.
Diese drei Elemente werden in einer JAR-Datei gebündelt, die dann über die OAM-Administrationskonsole auf den OAM-Server hochgeladen wird. Nach dem Hochladen und Aktivieren kann sie zur Laufzeit von OAM/SP verwendet werden.
Java-Klasse
Die Klasse, die das benutzerdefinierte Benutzer-Provisioning-Modul implementiert, muss die folgenden Anforderungen erfüllen:
-
Erweitern Sie die Klasse
oracle.security.fed.plugins.fed.provisioning.OIFUserProvisioningPlugin. -
Implementieren Sie die folgenden Methoden: Der öffentliche
ExecutionStatus-Prozess (UserContext-Kontext) löstUserProvisioningExceptionaus. -
Diese Methode wird aufgerufen, wenn ein Benutzerdatensatz erstellt werden muss.
-
Muss einen Status zurückgeben (Fehler oder Erfolg).
-
In unserem Beispiel prüft diese Methode, ob die in
UserContextenthaltenen Benutzerdaten über die erforderlichen Informationen verfügen. -
Öffnen Sie eine Verbindung mit dem LDAP-Server.
-
Erstellen Sie einen Benutzerdatensatz.
-
Die öffentliche Zeichenfolge
getPluginName()gibt den Namen des benutzerdefinierten Benutzer-Provisioning-Moduls zurück. -
In unserem Beispiel wird
CustomProvisioningPluginzurückgegeben. -
Die öffentliche Zeichenfolge
getDescription()gibt eine Beschreibung des benutzerdefinierten Benutzer-Provisioning-Moduls zurück. -
In unserem Beispiel wird
Custom Provisioning Pluginzurückgegeben. -
Die öffentliche Karte
<String, MonitoringData> getMonitoringData()wird nicht in einem Benutzer-Provisioning-Ablauf verwendet. -
In unserem Beispiel wird Null zurückgegeben.
-
Der öffentliche boolesche Wert
getMonitoringStatus()wird nicht in einem Benutzer-Provisioning-Ablauf verwendet. -
In unserem Beispiel wird False zurückgegeben.
-
public int
getRevision()muss denselben Wert aufweisen wie die in der Manifestdatei angegebene Version. -
In unserem Beispiel wird 10 zurückgegeben.
-
"public void"
setMonitoringStatus(boolean status)wird nicht in einem Benutzer-Provisioning-Ablauf verwendet. -
In unserem Beispiel ist diese Methode leer.
-
Die Klasse muss das Interface
org.osgi.framework.BundleActivatorund die folgenden Methoden implementieren:-
public void start(BundleContext arg0) löst eine Ausnahme aus.
-
In unserem Beispiel ist diese Methode leer.
-
-
öffentlicher annullierter Stopp (BundleContext arg0) löst eine Ausnahme aus.
-
In unserem Beispiel ist diese Methode leer.
-
Optional kann die Methode
initialize()implementiert werden, wenn das Plug-in Konfigurationsdaten aus den Plug-in-Einstellungen lesen muss. -
öffentliche ExecutionStatus initialisieren (PluginConfig config)
-
In unserem Beispiel liest diese Methode den Benutzerbasis-DN aus einem Einstellungseintrag in der Plug-in-Konfiguration:
USER_BASE_DN
Der folgende Code ist ein Beispiel für das benutzerdefinierte Plug-in mit dem Namen 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
{
}
}
Plug-in-Registrierungsdatei
Das benutzerdefinierte Benutzer-Provisioning-Plug-in muss in einer Plug-in-XML-Datei definiert werden. Beispiel:
<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>
Wichtiger Hinweis: Die XML-Datei muss denselben Namen wie die Klasse haben, die das Plug-in implementiert, in diesem Fall
CustomUserProvisioning.XML
Weitere Informationen finden Sie im OAM Developer's Guide.
Manifestdatei
Bevor Sie das benutzerdefinierte Benutzer-Provisioning-Plug-in in einer JAR-Datei verpacken, muss ein MANIFEST.MF definiert werden. Beispiel:
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
Weitere Informationen finden Sie im OAM Developer's Guide.
Hinweis: Die Manifestdatei muss die Eigenschaft ImportPackage enthalten, in der alle Packages aufgeführt werden, die im Plug-in verwendet werden.
Plug-in erstellen
Kompilieren
Die folgenden JAR-Dateien aus dem OAM-Deployment müssen für die Kompilierung verwendet werden:
-
felix.jar
-
oam-plugin.jar
-
fed.jar
Diese Dateien befinden sich in den folgenden Speicherorten:
-
felix.jar:
$IAM_HOME/oam/server/lib/plugin/felix.jar -
oam-plugin.jar:
$IAM_HOME/oam/server/lib/plugin/oam-plugin.jar -
fed.jar: In der Datei
$DOMAIN_HOME/servers/MANAGED_INSTANCE_NAME/tmp/_WL_user/oam_server/RANDOM_STRING/APP-INF/lib, wobeiRANDOM_STRINGein Verzeichnisname mit Zufallszeichen ist, z.B. 88g74i in der Testinstallation. In unserem Beispiel wird die Datei CustomerUserProvisioning.java in einemsrc/userprov-Ordner abgelegt: bash-4.1$ ls -lsrc/userprov/gesamt 8-rw-r--r-- 1 root root 4717 Mar 1 11:42 CustomUserProvisioning.java
Führen Sie zum Kompilieren den folgenden Befehl aus:
$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
Benutzerdefiniertes Plug-in verpacken
Wir haben MANIFEST.MF im aktuellen Verzeichnis basierend auf dem im vorherigen Abschnitt aufgeführten Inhalt und CustomUserProvisioning.xmlin das src-Verzeichnis erstellt, das die im vorherigen Abschnitt aufgeführte Plug-in-Definition enthält.
find
.
./MANIFEST.MF
./src
./src/userprov
./src/userprov/CustomUserProvisioning.class
./src/userprov/CustomUserProvisioning.java ./src/CustomUserProvisioning.xml
Um die JAR-Datei CustomUserProvisioning.JAR zu erstellen, die das Plug-in und die erforderlichen Dateien enthält, führen Sie den folgenden Befehl aus:
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%)
Dadurch wird CustomUserProvisioning.jar erstellt. So zeigen Sie den Inhalt der Datei an:
unzip -l CustomUserProvisioning.jar Archiv: CustomUserProvisioning.jar
| Länge | Datum | Zeit | Name |
|---|---|---|---|
| 0 | 03.01.2014 | 14:32 | META-INF/ |
| 404 | 03.01.2014 | 14:32 | META-INF/MANIFEST.MF |
| 0 | 03.01.2014 | 12:10 Uhr | Benutzerprov./ |
| (3991) | 03.01.2014 | 12:10 Uhr | userprov/CustomUserProvisioning.class |
| (4717) | 03.01.2014 | 11:42 | userprov/CustomUserProvisioning.java |
| 486 | 03.01.2014 | 14:04 Uhr | CustomUserProvisioning.xml |
| (9598) | 6 Dateien |
Wichtiger Hinweis: Die JAR-Datei muss denselben Namen wie die Klasse haben, die das Plug-in implementiert, in diesem Fall CustomUserProvisioning.JAR
Benutzerdefinierte Provisioning-Module bereitstellen
Führen Sie die folgenden Schritte aus, um das benutzerdefinierte Benutzer-Provisioning-Plug-in in OAM bereitzustellen:
-
Gehen Sie zur OAM-Administrationskonsole:
http(s)://OAM-admin-host:OAM-adminport/oamconsole. -
Navigieren Sie zu Access Manager, Plug-ins.
-
Klicken Sie auf Plug-in importieren.
-
Wählen Sie die JAR-Datei des Plug-ins (in diesem Beispiel
CustomUserProvisioning.JAR).

Beschreibung der Abbildung Import_Plugin.jpg
Das Plug-in befindet sich in einem hochgeladenen Status:

Beschreibung der Abbildung Plugin_Screen.jpg
Sie müssen das Plug-in an die OAM-Laufzeitserver verteilen und aktivieren:
-
Wählen Sie das Plugin aus.
-
Klicken Sie auf "Auswahl verteilen".
-
Auf der Registerkarte "Aktivierungsstatus" des Plug-ins wird der Status des Plug-ins angezeigt.

Beschreibung der Abbildung Plugin_Status.jpg
Sie müssen das Plug-in aktivieren:
-
Wählen Sie das Plugin aus.
-
Klicken Sie auf "Aktivieren".
-
Auf der Registerkarte "Aktivierungsstatus" des Plug-ins wird der Status des Plug-ins angezeigt.

Beschreibung der Abbildung Activation_Status.jpg
Schließlich muss das Plug-in für den Benutzerbasis-DN konfiguriert sein. Gehen Sie wie folgt vor:
-
Wählen Sie das Plugin aus.
-
Klicken Sie auf die Registerkarte Konfigurationsparameter des Plug-ins.
-
Geben Sie den Basis-DN des Benutzers ein (z.B. für das verwendete Verzeichnis: ou=users,dc=us,dc=oracle,dc=com).
-
Klicken Sie auf Speichern.

Beschreibung der Abbildung Configure_Plugin.jpg
Benutzerdefiniertes Benutzer-Provisioning-Modul verwenden
Benutzer-Deployment in OAM aktivieren
So aktivieren/deaktivieren Sie das Benutzer-Provisioning in OAM/SP:
-
Geben Sie die WLST-Umgebung ein, indem Sie Folgendes ausführen:
$IAM_ORACLE_HOME/common/bin/WLST.sh. -
Stellen Sie eine Verbindung zum WLS-Admin-Server her:
connect(). -
Navigieren Sie zur Domainlaufzeitverzweigung:
domainRuntime(). -
Ändern Sie die Eigenschaft
userprovisioningenabledin: -
Benutzer-Provisioning in OAM/SP aktivieren:
putBooleanProperty("/fedserverconfig /userprovisioningenabled", "true") -
Benutzer-Provisioning in OAM/SP deaktivieren:
putBooleanProperty("/fedserverconfig /userprovisioningenabled", "false") -
Beenden Sie die WLST-Umgebung:
exit().
OAM für die Verwendung des benutzerdefinierten Plug-ins konfigurieren
So konfigurieren Sie OAM/SP für die Verwendung des benutzerdefinierten Plug-ins:
-
Geben Sie die WLST-Umgebung ein, indem Sie Folgendes ausführen:
$IAM_ORACLE_HOME/common/bin/WLST.sh. -
Stellen Sie eine Verbindung zum WLS-Admin-Server her:
connect(). -
Navigieren Sie zur Domainlaufzeitverzweigung:
domainRuntime(). -
Aktualisieren Sie die Eigenschaft
userprovisioningpluginin: Konfigurieren Sie OAM so, dass das benutzerdefinierte Plug-in verwendet wird. Setzen Sie die Eigenschaft auf den Plug-in-Namen (in unserem BeispielCustomUserProvisioning):putStringProperty("/fedserverconfig/userprovisioningplugin","CustomUserProvisioning") -
OAM für die Verwendung des integrierten Benutzer-Provisioning-Moduls konfigurieren:
putStringProperty("/fedserverconfig /userprovisioningplugin","FedUserProvisioningPlugin") -
Beenden Sie die WLST-Umgebung:
exit().
Testsetup
Verwenden Sie dasselbe SAML 2.0 Federation-Setup, das zuvor konfiguriert wurde. Dabei gilt:
-
OAM fungiert als Serviceanbieter
-
Die IdP (
AcmeIdP) sendet eine SAML-Assertion mit-
NameIDaufuserIDgesetzt. -
Gesendete Attribute
-
E-Mail auf die E-Mail-Adresse des Benutzers gesetzt
-
fname auf Vorname des Benutzers gesetzt
-
-
Nachname des Benutzers festgelegt
-
Titel auf letzte Tätigkeit des Benutzers gesetzt
-
Mit einem IdP-Attributprofil konfigurierter OAM/SP:
-
Namen givenname zuordnen
-
Nachname zu sn zuordnen
-
E-Mail zu Mail zuordnen
-
Benutzeralice wird auf der IdP verwendet, während kein Benutzerkonto für Alice auf OAM/SP vorhanden ist:
-
userID: Alice
-
E-Mail: alice@oracle.com
-
Vorname: Alice
-
Nachname: Appleton
-
title: Manager
-
Während eines SAML 2.0-Föderations-SSO mit dem Remote-IdP-Partner lautet die XML-SAML-Antwort mit der von der IdP zurückgesendeten Assertion wie folgt:
<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>
Das Ergebnis der Verarbeitung der SAML 2.0-Assertion durch OAM/SP zeigt die transformierten Attribute sowie die NameID

Beschreibung der Abbildung Operation_Result.jpg
Testen
Nach dem Federation-SSO wurde der Benutzerdatensatz für Alice erstellt:
- dn: uid=alice,ou=users,dc=us,dc=oracle,dc=com
- E-Mail: alice@oracle.com
- givenName: Alice
- objectClass: Person
- objectClass: inetOrgPerson
- objectClass: organizationalPerson
- objectClass: Oben
- uid: Alice
- cn: Alice
- n: Alice
- sn: Appleton
Weitere Lernressourcen
Sehen Sie sich weitere Übungen unter docs.oracle.com/learn an, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning-Kanal YouTube zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.
Die Produktdokumentation finden Sie im Oracle Help Center.
JIT Custom User Provisioning in OAM and SP Continued
F60939-01
September 2022
Copyright © 2022, Oracle and/or its affiliates.