======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}}