Acegi/ntlm

Cette page a été rédigée il y a fort fort longtemps, et n'a pas tellement été mise à jour.

 

Vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise page. Moi, si je devais résumer mon wiki aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. Des gens qui m'ont tendu la main, peut-être à un moment où je ne pouvais pas, où j'étais seul chez moi. Et c'est assez curieux de se dire que les hasards, les rencontres forgent une destinée... Parce que quand on a le goût de la chose, quand on a le goût de la chose bien faite, le beau geste, parfois on ne trouve pas l'interlocuteur en face je dirais, le miroir qui vous aide à avancer. Alors ça n'est pas mon cas, comme je disais là, puisque moi au contraire, j'ai pu ; et je dis merci au wiki, je lui dis merci, je chante le wiki, je danse le wiki... je ne suis qu'amour ! Et finalement, quand des gens me disent « Mais comment fais-tu pour avoir cette humanité ? », je leur réponds très simplement que c'est ce goût de l'amour, ce goût donc qui m'a poussé aujourd'hui à entreprendre une construction logicielle... mais demain qui sait ? Peut-être simplement à me mettre au service de la communauté, à faire le don, le don de soi.

Acegi permet par le biais de filtres de choisir le mode d’authentification et coupler plusieurs modes d’authentification en fallback.

Voici donc comment configurer Acegi pour utiliser l’authentification par le protocole NTLM. Cette fonction n’est pas supportée en standard dans Acegi, cependant il est possible de trouver les composants nécessaires dans les forums du projet.

L’implémentation du filtre NTLMProcessingFilter retenue a été téléchargée à partir de cette URL : http://opensource.atlassian.com/projects/spring/secure/attachment/11937/20060906_Acegi_NTLM.zip

Essentiellement 4 classes composent cette solution :

  • public class AbstractProcessingFilter implements Filter, InitializingBean, ApplicationEventPublisherAware, MessageSourceAware

  • public class NtlmProcessingFilter extends AbstractProcessingFilter

  • public class NtlmProcessingFilterEntryPoint implements AuthenticationEntryPoint

  • public class BeginNtlmHandshakeException extends AuthenticationException

Exemple.jpg

Lorsque la chaine de filtre invoque la méthode doFilter de la classe NtlmProcessingFilter :

1- la méthode requiresAuthentication vérifie si l’authentification est requise

2- la méthode onPreAuthentication s’assure que le navigateur a fourni les informations NTLM

3- la méthode attemptAuthentication vérifie les informations NTLM auprès du contrôleur de domaine

Scenario exceptionnel :

2a- les informations NTLM ne sont pas présentes : une exception BeginNtlmHandshakeException est lancée.

2b- Le filtre ExceptionTranslationFilter appelle la méthode commence(…) de NtlmProcessingFilterEntryPoint qui renvoie un code HTTP 401 en spécifiant le protocole NTLM

2c- Le navigateur réeffectue sa requête en incluant les données NTLM

FILTRE PAR IP

Le filtre NTLM est souvent couplé à un filtre d’authentification par formulaire. Dans ce cas, tout utilisateur ne se trouvant pas dans un domaine NT voit d’abord apparaître 3 fois successivement une fenêtre lui demandant son login et son mot de passe NT, puis arrive sur le filtre d’authentification par formulaire..

Pour contourner ce problème, un attribut a été rajouté au filtre NLTM : subnetMasks

La classe NtlmProcessingFilterWithIp hérite donc de NtlmProcessingFilter en redéfinissant la méthode requiresAuthentication(…) :

Cette méthode vérifie si l’IP de la machine appelante appartient à l’un des sous-réseaux spécifiés par les masques de l’attribut subnetMasks. Le cas échéant elle retourne false, ce qui a pour effet de passer la main au filtre suivant.

CUSTOMEDITOR

La syntaxe pour la définition du nouvel attribut subnetMasks est la suivante

		<property name="subnetMasks">
			<value>
				aaa.bbb.ccc.ddd
				eee.fff.ggg.hhh
				…
				// some comments
			</value>
		</property>

Spring permet d’associer pour un type donné d’attribut une implémentation héritant de PropertyEditorSupport qui se charge de transformer la chaine de caractère contenue dans le fichier de configuration Acegi en une instance du type de l’attribut.

Deux classes ont donc été créées :

  • ListIps.java

  • ListIpsEditor.java

La déclaration de ce "CustomEditor" est faite dans le fichier de configuration d’acegi:

	<bean id="customEditorConfigurer"
	    class="org.springframework.beans.factory.config.CustomEditorConfigurer">
	  <property name="customEditors">
	    <map>
	      <entry key="ch.oosphere.acegisecurity.ui.ntlm.ListIps">
	        <bean class="ch.oosphere.acegisecurity.ui.ntlm.ListIpsEditor" />
	      </entry>
	    </map>
	  </property>
	</bean>