Zum Ende der Metadaten springen
Zum Anfang der Metadaten

Funktionales Beispiel einer Konfiguration für den Shibboleth 3.x IDP und Java 8 (Scripting Engine "Nashorn"), um das gewünschte USI Wien-eduPersonEntitlement zu berechnen, mittels dessen Studierende unter 25 Jahre ohne zusätzliche Umstände vergünstigte Tarife bei Kursen des USI Wien in Anspruch nehmen können. Dieses etwas komplexe Vorgehen verhindert, das Alter oder Geburtsdatum von Personen an den Service Provider schicken zu müssen. Gleichzeitig dient es als Beispiel für die Erzeugung bzw. komplexere Manipulation von Attributen im Shibboleth IDP.

LDAP oder RDBMS

Zur Berechnung des aktuellen Alters einer Person wird zuerst einmal das Geburtsdatum einer Person benötigt. Hat man dafür noch kein eigenes Attribut im LDAP-Verzeichnisdienst vorgesehen, bietet sich schacDateOfBirth aus dem SCHAC-Schema an. Dazu muß das Schema dem LDAP DSA bekannt gemacht, sowie allen (Benutzer-)Objekten, die einen schacDateOfBirth-Wert beinhalten können, die "auxiliary objectClass" schacPersonalCharacteristics zugewiesen werden. Wie im SCHAC-Schema angegeben, wird das Datum im Format JJJJMMTT gespeichert. Der 31. Dezember 1970 etwa würde so zu 19701231.

IDP-Konfiguration

attribute-resolver.xml

Um aus dem Geburtsdatum im IDP das Alter zu errechnen, braucht es etwas eigenen Code, über eine ScriptedAttribute Definition des Shiboleth IDP. Damit wird die Integration von interpretierten Programmiersprachen wie ECMAScript/JavaScript (oder auch Jython) mit den Java-Objekten des IDP möglich, ohne komplexe Erweitungen für den IDP in Java programmieren zu müssen.

Im folgenden Beispiel erzeugen wir eduPersonEntitlement-Attributwerte für die Zwecke des USI Wien-Services durch Berechnung aus schacDateOfBirth-Attributwerten. Bereits im LDAP-Verzeichnisdienst existierende (andere) Werte von eduPersonEntitlement werden hier automatisch inkludiert. Soll der IDP noch weitere Entitlements erzeugen können, so kann man die Definitionen, wo diese anderen Werte herkommen, einfach als zusätzliche Dependency-Elemente hinzufügen – untenstehend ein Beispiel (MappedEntitlements) unserer Anleitung zur Erzeugung von Entitlements folgend:

eduPersonEntitlements per Script erzeugen (Java8/Nashorn)

Hier wird mit JavaScript ein Attribut namens eduPersonEntitlement definiert. Ausgangsbasis für dessen Werte ist hier das Attribut schacDateOfBirth, das aus einem LDAP-Verzeichnisdienst gelesen wird (Dependency "myLDAP"). Ist schacDateOfBirth definiert (weil die LDAP-Abfrage einen Wert zurückgeliefert), wird der Wert zerlegt und in ein Datumsobjekt verwandelt. Die Differenz in Jahren zwischen diesem Objekt und dem heutigen Tag ergibt das aktuelle Alter der zugreifenden Person.

Ist nun das Alter kleiner 25, wird ein Entitlement-Wert spezifisch für das USI Wien erzeugt. Ist das Alter größer oder gleich 25 oder gab es kein schacDateOfBirth in der LDAP-Abfrage, wird kein zusätzlicher Entitlement-Wert erzeugt.

logback.xml

Um bei Bedarf im laufenden IDP zu sehen, was im Detail bei der obigen Altersberechnung passiert, kann dies gezielt mit einem Eintrag in der Datei logback.xml aktiviert (und wieder deaktiviert) werden:

Debug-Logging für Script-AttributeDefinition

Stellt man das Loglevel für dieses spezifische Modul auf DEBUG (und wartet bis zu 5 Minuten, bis die logback.xml Konfiguration neu eingeladen wurde – oder man lädt diese manuell neu), schreibt der IDP in die Datei idp-prozess.log, ob die Werte vorhanden sind oder nicht, sowie ob aufgrund des Alters nun ein Entitlement erzeugt wurde oder nicht. Nur wenn man das Loglevel hier auf TRACE stellt, sind auch das zur Berechnung verwendete Geburtsdatum und die eduPersonEntitlement-Werte (vorher/nachher) selbst zu sehen. Ist man mit der IDP-Konfiguration zufrieden, kann das Loglevel für diesen logger zurück auf INFO gestellt werden, womit nach wenigen Minuten (oder nach Neuladen der logback-Konfiguration, jedenfalls ohne Neustart des IDP) keine weiteren Logzeilen für diesen logger geschrieben werden.

attribute-filter.xml

Eine eigene Freigaberegel für das USI Wien ist nicht nötig, wenn man bereits die (empfohlene) "ACOnet-registered services" Regel für Attributweitergabe verwendet!

Für die gezielte Weitergabe der/des erzeugten eduPersonEntitlements kann nun eine neue AttributeFilterPolicy eingefügt werden:

Freigabe in der Attribute Filter-Konfiguration

Damit wird für das Attribut mit id="eduPersonEntitlement" nur der Wert http://usi.at/student-discount weitergegeben, und zwar nur, wenn das Attribut nach der Berechnung oben einen Wert hat, wenn der Service Provider jener des USI Wien ist, und wenn die zugreifende Person eine eduPersonAffiliation mit dem Wert student hat. Andere Service Provider bekommen das Attribut nicht, das USI Wien bekommt andere Entitlements nicht, und für Personen, die nicht auch Studierende sind, wird ebenfalls nichts weitergegeben.

Stichwörter
  • Keine