Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: fix more confluence formatting bugs

...

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 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 Beispiel erzeugen wir eduPersonEntitlement-Attributwerte für die Zwecke des USI Wien-Services durch 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 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:

Code Block
languagehtml/xml
titleeduPersonEntitlements per Script erzeugen (Java8/Nashorn)
<AttributeDefinition id="eduPersonEntitlement" xsi:type="ScriptedAttribute" >
    <Dependency ref="myLDAP" />
    <Dependency ref="MappedEntitlements" />
    <AttributeEncoder xsi:type="SAML1String" name="urn:mace:dir:attribute-def:eduPersonEntitlement" encodeType="false" />
    <AttributeEncoder xsi:type="SAML2String" name="urn:oid:1.3.6.1.4.1.5923.1.1.1.7" friendlyName="eduPersonEntitlement" encodeType="false" />
    <Script><![CDATA[
var logger = Java.type("org.slf4j.LoggerFactory").getLogger("net.shibboleth.idp.attribute.resolver.script.usidiscount");
if (typeof schacDateOfBirth == "undefined" || schacDateOfBirth.getValues().size() < 1) {
  logger.debug("no schacDateOfBirth, ignoring");
} else {
  var dob = schacDateOfBirth.getValues().get(0);
  logger.trace("schacDateOfBirth is " + dob);
  var LocalDate  = Java.type("java.time.LocalDate");
  dob   = LocalDate.of(dob.slice(0,4), dob.slice(4,6), dob.slice(6,8));
  logger.trace("parsed dob is " + dob);
  var age = Java.type("java.time.Period").between(dob, LocalDate.now()).getYears();
  logger.trace("age is " + age);
  if (age < 25) {
    logger.debug("age is within USI limits, adding USI-entitlement");
    logger.trace("eduPersonEntitlement had values " + eduPersonEntitlement.getValues());
    eduPersonEntitlement.addValue("http://usi.at/student-discount");
    logger.trace("eduPersonEntitlement has values " + eduPersonEntitlement.getValues());
  } else {
    logger.debug("age is not within USI limits, doing nothing");
  }
}
]]></Script>
</AttributeDefinition>
 
<!-- Beispiel fuer "MappedEntitlements" -->
<AttributeDefinition id="MappedEntitlements" xsi:type="Mapped" sourceAttributeID="eduPersonAffiliation">
    <Dependency ref="eduPersonAffiliation" />
    <ValueMap>
        <ReturnValue>urn:mace:dir:entitlement:common-lib-terms</ReturnValue>
        <SourceValue>member</SourceValue>
    </ValueMap>
    <ValueMap>
        <ReturnValue>urn:mace:terena.org:tcs:personal-user</ReturnValue>
        <SourceValue>member</SourceValue>
    </ValueMap>
</AttributeDefinition>

...

Warning

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:

Code Block
languagehtml/xml
titleFreigabe in der Attribute Filter-Konfiguration
<!-- USI-Wien Student Discount -->
<AttributeFilterPolicy id="USIWien">
    <PolicyRequirementRule xsi:type="AND">
        <Rule xsi:type="Requester" value="https://www.usi-wien.at/shibboleth" />
        <Rule xsi:type="Value" attributeID="eduPersonAffiliation" value="student" />
    </PolicyRequirementRule>
    <AttributeRule attributeID="eduPersonEntitlement">
        <PermitValueRule xsi:type="Value" value="http://usi.at/student-discount" />
    </AttributeRule>
</AttributeFilterPolicy>

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.