V případě, že chceme atributy uživatelů získavat pro náš identity provider z LDAP, je potřeba v příslušném konfiguračním souboru (resolv.xml, resolv.ldap.xml, …) definovat tzv. LDAP Data Connector. Typická konfigurace vypadá takto:
<JNDIDirectoryDataConnector id="directory"> <Search filter="uid=%PRINCIPAL%"> <Controls searchScope="SUBTREE_SCOPE" returningObjects="false" /> </Search> <Property name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory" /> <Property name="java.naming.provider.url" value="ldap://ldap.domena.cz/dc=org,dc=cz" /> </JNDIDirectoryDataConnector>
V tomto jednoduchém případě aplikace provede anonymní bind k serveru ldap.domena.cz a v podstromu dc=org,dc=cz vyhledá uživatele pomocí filtru uid=%PRINCIPAL%, kde %PRINCIPAL% je substituce pro uživatelské jméno.
Je potřeba také definovat, jaké atributy chceme použít. U jednotlivých atributů uvádíme jejich identifikátor a také odkaz na data konektor, pomocí kterého lze atribut získat:
<SimpleAttributeDefinition id="urn:mace:dir:attribute-def:cn"> <DataConnectorDependency requires="directory"/> </SimpleAttributeDefinition>
Aby mohl IdP komunikovat s LDAP serverem po SSL, je potřeba importovat CA certifikát, kterým byl podepsán certifikát LDAP serveru, do uložiště klíčů nebo-li tzv. default java keystore. K tomulze použít utilitu keytool, která je součást JDK. Pokud je certifikát v pem formátu, převedeme ho do der formátu:
# openssl x509 -outform der -in ldap-cacert.pem -out ldap-cacert.der
A přidáme ho do uložiště:
# keytool -import -file ldap-cacert.der -alias LDAP-CA -keystore $JAVA_HOME/jre/lib/security/cacerts
Pro manipulaci s uložištěm potřebujeme znát heslo. Pokud jsme s uložištěm ještě nepracovali, pravděpodobně bude fungovat výchozí heslo, které je changeit.
Pak v konfiguraci LDAP konektoru stačí změnit v URL serveru hodnotu protokolu z ldap na ldaps:
<JNDIDirectoryDataConnector id="directory"> <Search filter="uid=%PRINCIPAL%"> <Controls searchScope="SUBTREE_SCOPE" returningObjects="false" /> </Search> <Property name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory" /> <Property name="java.naming.provider.url" value="ldaps://ldap.domena.cz/dc=org,dc=cz" /> </JNDIDirectoryDataConnector>
Skupiny v LDAP jsou obvykle umístěné ve zvláštním podstromu, např. ou=groups,dc=org,dc=cz. Název skupiny se standardně ukládá do atributu cn a členové skupiny do vícenásobného atributu uniquemember formou DN (distinguished name, např. uid=novak,ou=people,dc=org,dc=cz). Abychom získali seznam skupin, ve kterých je daný uživatel, musíme se dotázat filtrem uniquemember=uid=novak,ou=people,dc=org,dc=cz do podstromu ou=groups,dc=org,dc=cz. V resolveru toho dosáhneme tím, že nadefinujeme další LDAP konektor závislý na tom prvním:
<JNDIDirectoryDataConnector id="directorygroup" mergeMultipleResults="true"> <DataConnectorDependency requires="directory"/> <Search filter="uniquemember=uid=%PRINCIPAL%,ou=people,dc=org,dc=cz"> <Controls searchScope="SUBTREE_SCOPE" returningObjects="false" /> </Search> <Property name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory" /> <Property name="java.naming.provider.url" value="ldaps://ldap.domena.cz/ou=groups,dc=org,dc=cz" /> </JNDIDirectoryDataConnector>
Atribut mergeMultipleResults je potřeba nastavit na true, jinak v případě více výsledků (uživatel je ve více skupinách) vyhodí IdP vyjímku. Zbývá jen nadefinovat atribut, závislý na tento konektor:
<SimpleAttributeDefinition id="urn:mace:cesnet.cz:attribute-def:isMemberOf" sourceName="cn"> <DataConnectorDependency requires="directorygroup"/> </SimpleAttributeDefinition>