Téléchargement des produits


Version anglaise


 

La configuration du service d'authentification repose sur l'objet JwtProviderConfig d'une part et, selon le module d'authentification choisi, sur les objets JwtLDAPLoginModule, JwtJEELoginModule ou JwtAdeliaLoginModule d'autre part.


Tous ces objets sont décrits dans le fichier de configuration /WEB-INF/beans.xml de l'application.


Le choix du (ou des) module(s) d'authentification se fait à l'aide de la propriété jwtLoginModuleName de l'objet JwtProviderConfig (par défaut : "jwtJEELoginModule").

Pour chaîner plusieurs modules d'authentification il faut séparer les noms de module à l'aide d'une virgule.


Exemples :
Utilisation du module d'authentification LDAP :
<bean id="jwtProviderConfig" class="com.hardis.jwtprovider.JwtProviderConfig">
      ...
      <!-- jwtJEELoginModule | jwtLDAPLoginModule -->
      <property name="jwtLoginModuleName"    value="jwtLDAPLoginModule"/>
</bean>



Chaînage d'un module d'authentification LDAP et d'un module d'authentification Adélia :
<bean id="jwtProviderConfig" class="com.hardis.jwtprovider.JwtProviderConfig">
      ...
      <!-- jwtJEELoginModule | jwtLDAPLoginModule | jwtAdeliaLoginModule-->
      <property name="jwtLoginModuleName"    value="jwtLDAPLoginModule,jwtAdeliaLoginModule"/>
      <property name="jwtUnionLMGroupsSet"  value="false"/>
      <property name="jwtGetFirstClaimFound"  value="true"/>
</bean>



Authentification Java EE

Le module d'authentification Java EE est sélectionné en fixant la propriété jwtLoginModuleName avec la valeur jwtJEELoginModulejwtJEELoginModule est une instance de la classe com.hardis.security.loginmodules.jee.JwtJEELoginModule.


La déclaration de l'objet jwtJEELoginModule faisant office de module d'authentification Java EE se fait de la façon suivante :

<bean id="jwtJEELoginModule" class="com.hardis.security.loginmodules.jee.JwtJEELoginModule" lazy-init="true">
      <property name="userParameterName"     value="login"/>
      <property name="passwordParameterName" value="password"/>
      <property name="securityRoles">
         <!-- roles to test to define user roles list -->
         <list>
            <value>role1</value>
            <value>role2</value>
            <value>role3</value>
         </list>
      </property>
      <!--property name="securityRequestUrl"    value="http://127.0.0.1:8080/security/JEELoginServlet"/-->
</bean>

Détail des propriétés :

  • userParameterName : nom du paramètre utilisé pour passer le nom de l'utilisateur à authentifier (par défaut : "login").

  • passwordParameterName : nom du paramètre utilisé pour passer le mot de passe de l'utilisateur à authentifier (par défaut : "password").

  • securityRoles : liste des rôles à tester pour constituer la liste des rôles propres à l'utilisateur authentifié.

  • securityRequestUrl : par défaut, ce paramètre est déterminé automatiquement et prend la valeur http://yourwebcontainerhost:port/contextPath/security/JEELoginServlet.

    L'authentification de l'utilisateur se fait donc en invoquant la servlet JEELoginServlet via la ressource /security/JEELoginServlet.

    Dans le cadre d'une configuration cluster avec un serveur frontal qui ne serait pas ré-entrant, et donc accessible depuis le serveur d'applications, il convient de spécifier l'IP du Container Web (127.0.0.1) et le port du container Web.

Exemple :
Un serveur frontal écoute sur le port 80 devant un firewall.
Le container Web écoute sur le port 8080.
Le firewall n'autorise pas les requêtes sur l'IP frontal depuis le container Web.

L'URL est alors http://127.0.0.1:8080/security/JEELoginServlet.


Remarque : la configuration des utilisateurs et des rôles est défini dans le paramétrage du container Java EE.

↑ Haut de page



Authentification LDAP

Le module d'authentification LDAP est sélectionné en fixant la propriété jwtLoginModuleName avec la valeur jwtLDAPLoginModule, jwtLDAPLoginModule est une instance de la classe com.hardis.security.loginmodules.ldap.JwtLDAPLoginModule.


Attention :

En mode d'authentification LDAP, pour prévenir une attaque par injection LDAP, le jwtLDAPLoginModule refuse les noms d'utilisateur contenant des caractères spéciaux utilisables dans une requête LDAP (soit les caractères  (, ), *, &, |, !, =, >, < et ~).

Si cela pose problème, vous pouvez autoriser explicitement tout ou partie de ces caractères à l'aide du paramètre -Dadelia.relaxedLdapCharacters. Pour autoriser l'ensemble des caractères exclus, ajoutez l'option "-adelia.relaxedLdapCharacters=()*&|!=><~" sur la ligne de commandes.


La déclaration de l'objet jwtLDAPLoginModule faisant office de module d'authentification LDAP se fait de la façon suivante :

<bean id="jwtLDAPLoginModule" class="com.hardis.security.loginmodules.ldap.JwtLDAPLoginModule" init-method="init" lazy-init="true">
      <property name="userParameterName"     value="login"/>
      <property name="passwordParameterName" value="password"/>
      <property name="ldapParameters">
         <map>
              <!-- AD, Domino ou ldap -->
              <entry key="type" value="Domino" />
              <entry key="connectionsURL" value=" dominoldap.domain.com:389" />
              <entry key="connectionName" value="user" />
              <entry key="connectionPassword" value="password" />
              <entry key="connectionTimeout" value="5000" />
              <entry key="connectionPoolSize" value="10" />
              <entry key="useSSL" value="false" />
              
              <!-- user query informations -->
              <entry key="userBase" value="o=domain" />
              <entry key="userSearch" value="(&amp;(uid={0})(objectclass=dominoPerson))" />
              <entry key="userSearchScope" value="SUB" />
              <entry key="userName" value="sn" />
              <entry key="userAttributes" value="attrName1,attrName2" />
			  <entry key="userAttributesSearchAsUser" value="true" />
              
              <!-- user groups query informations -->
              <entry key="groupBase" value="o=domain" />
              <entry key="groupSearch" value="(member={0})" />
              <entry key="groupSearchAsUser" value="true" />
              <entry key="groupSearchScope" value="SUB" />
              <entry key="groupName" value="cn" />               
              <entry key="rolesMapping" value="role1=group1|group2|group3;role2=group4" />
         </map>
      </property>
      <property name="jwtExtraClaims">
         <map>
            <entry key="claimName" value="userAttributeName"/>
         </map>
      </property>
</bean>


Détail des propriétés :

  • userParameterName : nom du paramètre utilisé pour passer le nom de l'utilisateur à authentifier (par défaut :"login").

  • passwordParameterName : nom du paramètre utiliser pour passer le mot de passe de l'utilisateur à authentifier (par défaut : "password").

  • ldapParameters : regroupe l'ensemble des attributs pour la configuration LDAP.
    Parmi eux, l'attribut rolesMapping permet de définir un mappage entre des rôles et des groupes.
    Ce mappage permet in fine de définir les rôles de l'utilisateur authentifié.

    connectionsURL est l'URL du LDAP, connectionName (login) et connectionPassword (password) les informations nécessaires pour se connecter au LDAP.
    userBase indique l'emplacement où sont stockés les utilisateurs, userSearch la commande LDAP à utiliser pour trouver un utilisateur à partir de son login {0} et userName le nom de l'attribut à utiliser pour le nom de l'utilisateur.
    Enfin, userAttributes permet, selon les besoins, de récupérer des informations sur l'utilisateur authentifié autres que le nom.
    userSearchScope indique la portée de la recherche (BASE, ONE, SUB, SUBORDINATE_SUBTREE). La valeur par défaut est SUB (recherche récursive).
    userAttributesSearchAsUser indique si la recherche des attributs de l'utilisateur doit être exécutée sous l'identité de l'utilisateur à authentifier (par défaut, true) ou en utilisant le profil de connexion au LDAP (connectionName)


    groupBase, groupSearch et groupName permettent de retrouver les groupes dans lesquels figure l'utilisateur.

    groupSearchScope indique la portée de la recherche (BASE, ONE, SUB, SUBORDINATE_SUBTREE). Si le paramètre n'est pas spécifié, la valeur de userSearchScope est utilisée.
    groupSearchAsUser indique si la recherche des groupes doit être exécutée sous l'identité de l'utilisateur à authentifier (par défaut, true) ou en utilisant le profil de connexion au LDAP (connectionName).

  • jwtExtraClaims : permet d'ajouter des claims (attributs du jeton) supplémentaires au jeton à l'aide de couples <claimName, userAttributeName> où claimName est le nom du claim à ajouter au jeton et userAttributeName un des noms d'attribut de l'utilisateur cité pour les userAttributes.


La portée de recherche (userSearchScope, groupSearchScope) indique comment la recherche doit être exécutée dans l'arbre LDAP (récursivité). Les valeurs possibles sont :

BASE

Seul l'objet ciblé par la recherche est considéré.

ONE

Seuls l'objet ciblé par la recherche et ses descendants immédiats sont considérés.

SUB

L'objet ciblé par la recherche et tous ses descendants sont considérés.

SUBORDINATE_SUBTREE

Tous les descendants de l'objet ciblé par la recherche sont considérés, mais l'objet lui-même est exclu.



<bean id="jwtLDAPLoginModule" class="com.hardis.security.loginmodules.ldap.JwtLDAPLoginModule" init-method="init" lazy-init="true">
      <property name="userParameterName"     value="login"/>
      <property name="passwordParameterName" value="password"/>
      <property name="ldapParameters">
         <map>
              <!-- AD, Domino ou ldap -->
              <entry key="type" value="Domino" />
...
            <entry key="userAttributes" value= "mail" />
...
         </map>
      </property>
      <property name="jwtExtraClaims">
         <map>
            <entry key="email" value="mail"/>
         </map>
      </property>
</bean>

Exemple :


Dans l'exemple ci-dessus, l'attribut de configuration LDAP userAttributes permet de récupérer l'attribut mail de l'utilisateur.
Ce dernier peut alors être utilisé pour ajouter le claim email au jeton JWT.


↑ Haut de page



Authentification Adélia

Le module d'authentification Adélia  est sélectionné en fixant la propriété jwtLoginModuleName avec la valeur jwtAdeliaLoginModulejwtAdeliaLoginModule est une instance de la classe com.hardis.security.loginmodules.adelia.JwtAdeliaLoginModule.

Ce type de module permet de déléguer l'authentification à un programme Visual Adélia Batch.


La déclaration de l'objet jwtAdeliaLoginModule faisant office de module d'authentification Adélia se fait de la façon suivante :


<bean id="jwtAdeliaLoginModule" class="com.hardis.security.loginmodules.adelia.JwtAdeliaLoginModule" lazy-init="true">
      <property name="userParameterName"     value="login"/>
      <property name="passwordParameterName" value="password"/>
      <property name="adeliaParameters">
     <map>
      <entry key="VAAuthProgram" value="javaobj.JWAUTH" />
      <entry key="SSOEnabled" value="false" />
      <entry key="Unicode" value="false" />           
      <entry key="Poolname" value="Pool" />
      </map>
      </property>
</bean>


Détail des propriétés :

  • userParameterName : nom du paramètre utilisé pour passer le nom de l'utilisateur à authentifier (par défaut : "login").
  • passwordParameterName : nom du paramètre utilisé pour passer le mot de passe de l'utilisateur à authentifier (par défaut : "password").
  • adeliaParameters : regroupe l'ensemble des attributs propres au programme Adélia d'authentification :

- VAAuthProgram : nom du programme Visual Adélia Batch en charge de l'authentification.

- SSOEnabled : activation ou non du pseudonyme Single Sign On ; les informations manquantes pour la connexion Middleware Adélia peuvent être substituées par celles renseignées pour la demande d'authentification.
Par défaut : false.

- Unicode : indique si le programme Adélia a été généré en Unicode.
Par défaut : false.

- Poolname : indique le nom du pool utilisé pour les connexions middleware..
Par défaut : "Pool".


Le programme Adélia en charge de l'authentification doit respecter les contraintes suivantes :

  • La validation de l'authentification est assurée par le corps du programme VAB.
  • Le programme doit déclarer les paramètres suivants :

Nom du paramètre Type

Genre

Description

LstCredentials

LISTE (ALPHA, ALPHA)

E

Liste contenant les informations de connexion.

L'attribut nommé 'login" retourne l'utilisateur utilisé.

L'attribut nommé 'password' retourne le mot de passe utilisé.

LstAttrLoginModule

LISTE (ALPHA, ALPHA)

E

Liste des attributs/paramètres de configuration du LoginModule.

retAuthChecked

NUM_BIN_2

S

Valeur retournée indiquant si l'authentification a réussi ou non :

0  : l'authentification a réussi

-1 : l'authentification a échoué :abort

retExtendedUser

ALPHA

S

Valeur de l'utilisateur utilisée pour le mot réservé Adélia *USER.

Si elle n'est pas renseignée, le mot réservé Adélia *USER retourne l'utilisateur associé à l'attribut "login".

LstUserRoles

LISTE(ALPHA)

S

Liste des rôles de l'utilisateur authentifié.

LstClaims

LISTE(ALPHA, ALPHA)

S

Liste des claims à ajouter au jeton JWT.

RetErrMsg

ALPHA(1024)

S

En cas d'échec, un message explicatif de l'échec est renvoyé.

Ce message est retourné en réponse à la requête de demande d'authentification.


Attention : le programme Adélia doit être généré pour la plate-forme Java standard et être déployé dans l'application service d'authentification.


↑ Haut de page

Chaînage de modules d'authentification

La phase d'authentification peut avoir recours à plusieurs modules d'authentification.

L'ordre du chaînage des modules suit l'ordre de déclaration de ces mêmes modules.


Par exemple, pour chaîner une authentification LDAP avec une authentification Adélia, il est nécessaire de renseigner les deux noms de modules jwtLDAPLoginModule et jwtAdeliaLoginModule dans la propriété jwtLoginModuleName de l'objet jwtProviderConfig ; les noms sont séparés par une virgule.


Exemple :

<bean id="jwtProviderConfig" class="com.hardis.jwtprovider.JwtProviderConfig">
      ...
      <!-- jwtJEELoginModule | jwtLDAPLoginModule | JwtAdeliaLoginModule-->
      <property name="jwtLoginModuleName"    value="jwtLDAPLoginModule,jwtAdeliaLoginModule"/>
      <property name="jwtUnionLMGroupsSet"  value="false"/>
      <property name="jwtGetFirstClaimFound"  value="false"/>
</bean>



L'authentification est validée si et seulement si tous les modules valident l'authentification.

Dans le cas favorable d'une authentification réussie, chaque module peut retourner une liste de rôles et une liste de claims.

Par défaut sont conservés – pour la création du token - uniquement les rôles figurant dans toutes les listes retournées par les modules d'authentification (intersection).

Il est possible de changer le mode de conservation inter-modules des rôles à l'aide de la propriété jwtUnionLMGroupsSet de l'objet jwtProviderConfig.

En effet, en fixant cette propriété à la valeur "true", l'ensemble des rôles retenus est construit à partir de l'union des rôles retournés par chacun des modules d'authentification.


En ce qui concerne les claims, l'ensemble des claims retenus – pour la création du token -, est toujours construit à partir de l'union des claims retournés par chacun des modules d'authentification.

Si un claim de même nom est utilisé par plusieurs modules alors, par défaut, la valeur du claim retourné par le module invoqué le plus tardivement est conservée.

Il est possible de changer la règle de sélection de claims homonymes à l'aide de la propriété jwtGetFirstClaimFound de l'objet jwtProviderConfig.

En effet en fixant cette propriété à la valeur "true", est retenue la valeur du claim retourné par le module invoqué le moins tardivement.


↑ Haut de page



  • Aucune étiquette