======Data Connector====== Dieser Artikel ist ein Community-Beitrag für Shibboleth IdP 3.x. Es ist unklar, ob er für Shibboleth IdP 4.x so noch gilt. Um für den Shibboleth Identity Provider der Version 3 einen Datenkonnektor selbst zu schreiben, müssen bestimmte Klassen erweitert werden und eigne Namespaces erzeugt werden. ===== Zu erweiternde Klassen ===== * Data Connector Klasse: net.shibboleth.idp.attribute.resolver.AbstractDataConnector * Parser: net.shibboleth.idp.attribute.resolver.spring.dc.AbstractDataConnectorParser * Namespace Handler: net.shibboleth.ext.spring.util.BaseSpringNamespaceHandler ==== Namespace Schema das erweitert werden muss ==== * Namespace Schema: urn:mace:shibboleth:2.0:resolver Folgendes Beispiel implementiert das Attribut eduPersonTargetedId aus der Shibboleth Version 2. ====Data Connector Beispiel: TargetedId==== ===Data connector Class=== package org.example.shib_idp; ... public class TargetedIdSampleDataConnector extends AbstractDataConnector { private static final Logger LOG = LoggerFactory.getLogger(TargetedIdSampleDataConnector.class); private final String salt = "A secret, random string."; private String relyingPartyId; @Override protected Map doDataConnectorResolve( AttributeResolutionContext resolutionContext, AttributeResolverWorkContext workContext) throws ResolutionException { // compute SHA-1 Hash for eduPersonTargetedId: entityId of requester + uid + "string ... " relyingPartyId = resolutionContext.getAttributeRecipientID(); Map result = new HashMap(); String username = resolutionContext.getPrincipal(); IdPAttribute attribute = new IdPAttribute("eduPersonTargetedId"); result.put("eduPersonTargetedId", attribute); List> outputValues = new ArrayList<>(1); outputValues.add(new StringAttributeValue(getTargetedId(username))); attribute.setValues(outputValues); LOG.debug("Data connector added attribute: eduPersonTargetedId[" + getTargetedId(username) + "]"); return result; } private String getTargetedId(final String source) throws ResolutionException{ try { final MessageDigest md = MessageDigest.getInstance("SHA"); md.update(relyingPartyId.getBytes()); md.update((byte) '!'); md.update(source.getBytes()); md.update((byte) '!'); return Base64Support.encode(md.digest(salt.getBytes()), Base64Support.UNCHUNKED); } catch (final NoSuchAlgorithmException e) { LOG.error("Digest algorithm SHA is not supported"); throw new ResolutionException("Digest algorithm was not supported, unable to compute ID", e); } } } ===Data Connector Parser=== package org.example.shib_idp; ... public class TargetedIdSampleDataConnectorParser extends AbstractDataConnectorParser { public static final QName SCHEMA_NAME = new QName(TargetedIdSampleDataConnectorNamespaceHandler.NAMESPACE, "TargetedIdDataConnector"); /** {@inheritDoc} */ @Override protected Class getNativeBeanClass() { return TargetedIdSampleDataConnector.class; } @Override protected void doV2Parse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { super.doParse(element, builder); } } ===Data Connector Namespace Handler=== package org.example.shib_idp; import net.shibboleth.ext.spring.util.BaseSpringNamespaceHandler; public class TargetedIdSampleDataConnectorNamespaceHandler extends BaseSpringNamespaceHandler { /** Namespace for this handler. */ public static String NAMESPACE = "urn:example.org:shibboleth:2.0:resolver"; /** {@inheritDoc} */ @Override public void init() { registerBeanDefinitionParser(TargetedIdSampleDataConnectorParser.SCHEMA_NAME, new TargetedIdSampleDataConnectorParser()); } } ===Schema Erweiterung=== * Die Schema Erweiterung muss im *.jar File unter schema/myConnectors.xsd liegen Resolving eduPersonTargetedId as in version 2. ===Spring Schema File=== * Das Schema File muss im *.jar File unter META-INF/spring.schemas liegen urn\:example.org\:shibboleth\:2.0\:resolver = schema/myConnectors.xsd ===Spring Handler File=== * Das Handler File muss im *.jar File unter META-INF/spring.handlers liegen urn\:example.org\:shibboleth\:2.0\:resolver = org.example.shib_idp.TargetedIdSampleDataConnectorNamespaceHandler ===Plug-In installieren=== * Aus den angegebenen Dateien ein *.jar file generieren (am besten mit mvn) * Dieses *.jar file in das lib Verzeichnis der Webapplication vom Shibboleth IdP kopieren. ===Data Connector im Attribute Resolver benutzen=== ... {{tag>archiv}}