Avant propos.
ori-oai-workflow a la possibilité de se connecter à un annuaire LDAP pour l'authentification et l'identification.
Le développement de cette possibilité s'est initalement naturellement concentré sur la compatibilité avec des annuaires LDAP type SupAnn .
Certains utilisateurs ont eu à installer ori-oai-workflow sur un Microsoft Active Directory, un certain nombre de modifications sont à faire pour y parvenir, on tente ici de rassembler quelques notes autour de cela.
N'hésitez pas à contrbuer à cette page en la modifiant directement ou en y ajoutant des commentaires, cela afin d'obtenir une documentation complète, voire à permettre aux développeurs d'intégrer cette possibilité AD nativement dans ori-oai-workflow.
Notes
Quelques notes pour pouvoir utiliser Active Directory de Microsoft avec ori-oai-workflow.
On privilégiera cependant l'utilisation d'un annuaire ldap type Supann à celui d'un AD.
La particularité constatée de l'AD est que le full Domain Name d'un utilisateur ne comprend pas un uid=jtest mais un cn="Justin Test".
L'identifiant login étant un attribut particulier, le "sAMAccountName".
Objectifs
Avec les modifs données ci-dessous, on est censé pouvoir
- utiliser AD pour s'authentifier via le couple sAMAccountName / password
- utiliser AD pour récupérer les attributs d'un utilisateur et ses groupes
main-config.properties :
ldap.managerDn = le sAMAccountName d'un "admin" dans l'AD
ldap.managerPassword = son password
acegi-authentication-ldap.xml
- On décommente l'usage de ldap.managerDn et ldap.managerPassword
- On ajoute un bloc extraEnvVars, cf diff ci-dessous
Index: /opt/ori-oai/ori-oai-src/ori-oai-workflow-svn/conf/properties/spring/acegi/acegi-authentication-ldap.xml =================================================================== --- /opt/ori-oai/ori-oai-src/ori-oai-workflow-svn/conf/properties/spring/acegi/acegi-authentication-ldap.xml (revision 1694) +++ /opt/ori-oai/ori-oai-src/ori-oai-workflow-svn/conf/properties/spring/acegi/acegi-authentication-ldap.xml (working copy) @@ -9,14 +9,23 @@ class="org.acegisecurity.ldap.DefaultInitialDirContextFactory"> <constructor-arg value="${ldap.providerUrl}" /> - <!-- uncomment it if you want to connect vith username/password (see main-cinfig.properties) + <!-- uncomment it if you want to connect vith username/password (see main-cinfig.properties) --> <property name="managerDn"> <value>${ldap.managerDn}</value> </property> <property name="managerPassword"> <value>${ldap.managerPassword}</value> </property> - --> + <property name="extraEnvVars"> + <map> + <entry> + <key> + <value>java.naming.referral</value> + </key> + <value>follow</value> + </entry> + </map> + </property> </bean> </beans>
acegi-authentication.xml
On surcharge le userSearch donné par défaut avec acegi, cf diff ci-dessous
Index: /opt/ori-oai/ori-oai-src/ori-oai-workflow-svn/conf/properties/spring/acegi/acegi-authentication.xml =================================================================== --- /opt/ori-oai/ori-oai-src/ori-oai-workflow-svn/conf/properties/spring/acegi/acegi-authentication.xml (revision 1694) +++ /opt/ori-oai/ori-oai-src/ori-oai-workflow-svn/conf/properties/spring/acegi/acegi-authentication.xml (working copy) @@ -82,8 +82,27 @@ <property name="peopleSearchBase" value="${ldap.people.peopleSearchBase}" /> <property name="uidAttribute" value="${ldap.people.uidAttribute}" /> <property name="mailAttribute" value="${ldap.people.mailAttribute}" /> + <property name="userSearch"><ref bean="userSearch"/></property> </bean> + <bean id="userSearch" + class="org.acegisecurity.ldap.search.FilterBasedLdapUserSearch"> + <constructor-arg index="0"> + <!--value>dc=ul,dc=edu,dc=lb</value--> + <value></value> + </constructor-arg> + <constructor-arg index="1"> + <value>(sAMAccountName={0})</value> + </constructor-arg> + <constructor-arg index="2"> + <ref bean="initialDirContextFactory" /> + </constructor-arg> + <property name="searchSubtree"> + <value>true</value> + </property> + </bean> + + <bean id="oriLdapAuthoritiesPopulator" class="org.orioai.workflow.services.application.OriLdapAuthoritiesPopulator"> <constructor-arg>
OriBindAuthenticator.java
Certaines parties du code doivent à ce jour être commentées.
Cf diff ci-dessous
Index: /opt/ori-oai/ori-oai-src/ori-oai-workflow-svn/src/org/orioai/workflow/services/application/OriBindAuthenticator.java =================================================================== --- /opt/ori-oai/ori-oai-src/ori-oai-workflow-svn/src/org/orioai/workflow/services/application/OriBindAuthenticator.java (revision 1694) +++ /opt/ori-oai/ori-oai-src/ori-oai-workflow-svn/src/org/orioai/workflow/services/application/OriBindAuthenticator.java (working copy) @@ -78,12 +78,14 @@ // If DN patterns are configured, try authenticating with them directly Iterator dns = getUserDns(username).iterator(); + /* while (dns.hasNext() && (user == null)) { String dn = (String) dns.next(); log.debug("retrieveUser :: dn : " + dn); user = bindWithDn(dn, username); log.debug("retrieveUser :: user : " + user); } + */ // Otherwise use the configured locator to find the user // and authenticate with the returned DN. @@ -136,11 +138,13 @@ LdapUserDetails user = null; + /* while (dns.hasNext() && (user == null)) { String dn = (String) dns.next(); log.debug("retrieveUsers :: dn : " + dn); user = bindWithDn(dn, userUid); } + */ // Otherwise use the configured locator to find the user // and authenticate with the returned DN.