Skip to content

Authentification

Introduction

L'authentification sur une application Ewt peut être gérée soit par le serveur d'application (par exemple via le mécanisme standard d'authentification de Tomcat), soit par Ewt lui-même. Ewt intègre en effet des classes permettant de gérer différents types d'authentification (basic, form, oauth, oidc, keycloak, etc.), avec ou sans authentification forte.

La méthode d'authentification dépend de la configuration décrite dans le fichier web.xml.

Solution de base

Le fichier web.xml ci-dessous active le mode d'authentification de base, à savoir l'authentification basée sur les credentials gérées par le serveur d'application (fichier tomcat-users.xml dans le cas de Tomcat, application-users.properties et application-roles.properties dans le cas de JBoss, etc.)

web.xml
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

    <!-- Initialisation -->

    <context-param>
        <param-name>application-root-path</param-name>
        <param-value>${env:EWT_APPLICATION_ROOT_PATH}</param-value>
    </context-param>
    <context-param>
        <param-name>websocket-endpoint-path</param-name>
        <param-value>/websocket</param-value>
    </context-param>

    <listener>
        <listener-class>ch.epilogic.ewt.core.EwtServletContextListener</listener-class>
    </listener>

    <!-- error pages -->

    <error-page>
        <error-code>401</error-code>
        <location>/error401.jsp</location>
    </error-page>

    <error-page>
        <error-code>403</error-code>
        <location>/error403.jsp</location>
    </error-page>

    <error-page>
        <error-code>404</error-code>
        <location>/error404.jsp</location>
    </error-page>

    <error-page>
        <error-code>500</error-code>
        <location>/error500.jsp</location>
    </error-page>

    <error-page>
        <exception-type>java.lang.Exception</exception-type >
        <location>/error500.jsp</location>
    </error-page>

    <!-- Servlets -->

    <servlet>
        <servlet-name>EwtWebServlet</servlet-name>
        <servlet-class>ch.epilogic.ewt.servlets.EwtWebServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>EwtRestServlet</servlet-name>
        <servlet-class>ch.epilogic.ewt.servlets.EwtRestServlet</servlet-class>
        <init-param>
            <param-name>file-limit-size-mode</param-name>
            <param-value>default</param-value> <!-- default / afterwards -->
        </init-param>
        <init-param>
            <param-name>file-limit-max-bytes</param-name>
            <param-value>52428800</param-value> <!-- 540 MB -->
        </init-param>
        <init-param>
            <param-name>default-charset</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </servlet>

    <servlet>
        <servlet-name>EwtSoapServlet</servlet-name>
        <servlet-class>ch.epilogic.ewt.servlets.EwtSoapServlet</servlet-class>
        <init-param>
            <param-name>service-list-title</param-name>
            <param-value>EWT - Service list</param-value>
        </init-param>
        <init-param>
            <param-name>service-list-stylesheet</param-name>
            <param-value>css/service-list.css</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>EwtDataServlet</servlet-name>
        <servlet-class>ch.epilogic.ewt.servlets.EwtDataServlet</servlet-class>
    </servlet>

    <!-- Mappings -->

    <servlet-mapping>
        <servlet-name>EwtWebServlet</servlet-name>
        <url-pattern>/web/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>EwtRestServlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>EwtSoapServlet</servlet-name>
        <url-pattern>/soap/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>EwtDataServlet</servlet-name>
        <url-pattern>/data/*</url-pattern>
    </servlet-mapping>

    <!-- Sessions config -->

    <session-config>
        <session-timeout>1440</session-timeout>
    </session-config>

    <!-- Security -->

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Protected Area</web-resource-name>
            <url-pattern>/web/*</url-pattern>
            <url-pattern>/rest/*</url-pattern>
            <url-pattern>/soap/*</url-pattern>
            <url-pattern>/data/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>EWT</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>UserDatabase</realm-name>
    </login-config>
    <!--<login-config>
        <auth-method>FORM</auth-method>
        <realm-name>Protected</realm-name>
        <form-login-config>
            <form-login-page>/login.jsp</form-login-page>
            <form-error-page>/error.jsp</form-error-page>
        </form-login-config>
    </login-config>-->

    <security-role>
        <description>Technical role</description>
        <role-name>EWT</role-name>
    </security-role>
</web-app>

Solution avancée

Ewt intègre un ensemble d'éléments permettant d'authentifier les utilisateurs au moyen de méthodes plus avancées, comme l'authentification forte ou la possibilité de déléguer l'authentification à des fournisseurs d'identités externes, via différents protocoles (oauth, oauth2, oidc, etc.).

La mise en place d'une solution avancée nécessite de modifier le fichier web.xml et également de configurer le(s) type(s) d'authentification souhaité(s) via un fichier ewtAuthConfig.xml. Dans la suite de ce chapitre, nous allons voir comment configurer ces deux fichiers. Veuillez également consulter le chapitre relatif aux clients pour avoir plus de détails sur les possibilités de configuration de ces derniers.

Lorsque l'authentification est déléguée à Ewt, les éléments de sécurité standards ne doivent pas être définis dans le fichier web.xml. Cela signifie que les éléments <security-constraint>, <login-config> et <security-role> doivent être retirés.

Il sont remplacés par des filtres chargés de traiter toutes les requêtes adressées à Ewt. Dans l'exemple ci-dessous, le fichier déclare trois filtres:

  • EwtAuthFilterWeb : Ce filtre traite les endpoints /web/* et /data/*. Il prend en charge les requêtes envoyées par des utilisateurs physiques utilisant un navigateur web. Il est configuré pour appliquer une authentification par formulaire.
  • EwtAuthFilterSrv : Ce filtre traite les endpoints /rest/* et /soap/*. Il s'oriente donc sur le traitement des requêtes envoyées dans le cas de services web. Il est configuré pour appliquer une authentification de type "basic".
  • EwtAuthCallback : Ce filtre est mappé sur l'endpoint /auth. Il se charge de vérifier les credentials.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

    <!-- Initialisation -->

    <context-param>
        <param-name>application-root-path</param-name>
        <param-value>${env:EWT_APPLICATION_ROOT_PATH}</param-value>
    </context-param>
    <context-param>
        <param-name>websocket-endpoint-path</param-name>
        <param-value>/websocket</param-value>
    </context-param>

    <listener>
        <listener-class>ch.epilogic.ewt.core.EwtServletContextListener</listener-class>
    </listener>

    <!-- Filters -->
    <filter>
        <filter-name>EwtAuthFilterWeb</filter-name>
        <filter-class>org.pac4j.jee.filter.SecurityFilter</filter-class>
        <init-param>
            <param-name>configFactory</param-name>
            <param-value>ch.epilogic.ewt.auth.EwtAuthConfig</param-value>
        </init-param>
        <init-param>
            <param-name>authorizers</param-name>
            <param-value>isAuthenticated,ewtPolicy</param-value>
        </init-param>
        <init-param>
            <param-name>clients</param-name>
            <param-value>form</param-value>
        </init-param>
    </filter>
    <filter>
        <filter-name>EwtAuthFilterSrv</filter-name>
        <filter-class>org.pac4j.jee.filter.SecurityFilter</filter-class>
        <init-param>
            <param-name>clients</param-name>
            <param-value>basic</param-value>
        </init-param>
    </filter>

    <filter>
        <filter-name>EwtAuthCallback</filter-name>
        <filter-class>org.pac4j.jee.filter.CallbackFilter</filter-class>
        <init-param>
            <param-name>defaultUrl</param-name>
            <param-value>/</param-value>
        </init-param>
    </filter>

    <!-- Mappings -->

    <filter-mapping>
        <filter-name>EwtAuthFilterWeb</filter-name>
        <url-pattern>/web/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    <filter-mapping>
        <filter-name>EwtAuthFilterWeb</filter-name>
        <url-pattern>/data/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <filter-mapping>
        <filter-name>EwtAuthFilterSrv</filter-name>
        <url-pattern>/rest/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    <filter-mapping>
        <filter-name>EwtAuthFilterSrv</filter-name>
        <url-pattern>/soap/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <filter-mapping>
        <filter-name>EwtAuthCallback</filter-name>
        <url-pattern>/auth</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <!-- error pages -->

    <error-page>
        <error-code>401</error-code>
        <location>/error401.jsp</location>
    </error-page>

    <error-page>
        <error-code>403</error-code>
        <location>/error403.jsp</location>
    </error-page>

    <error-page>
        <error-code>404</error-code>
        <location>/error404.jsp</location>
    </error-page>

    <error-page>
        <error-code>500</error-code>
        <location>/error500.jsp</location>
    </error-page>

    <error-page>
        <exception-type>java.lang.Exception</exception-type >
        <location>/error500.jsp</location>
    </error-page>

    <!-- Servlets -->

    <servlet>
        <servlet-name>EwtWebServlet</servlet-name>
        <servlet-class>ch.epilogic.ewt.servlets.EwtWebServlet</servlet-class>
    </servlet>

    <servlet>
        <servlet-name>EwtRestServlet</servlet-name>
        <servlet-class>ch.epilogic.ewt.servlets.EwtRestServlet</servlet-class>
        <init-param>
            <param-name>file-limit-size-mode</param-name>
            <param-value>default</param-value> <!-- default / afterwards -->
        </init-param>
        <init-param>
            <param-name>file-limit-max-bytes</param-name>
            <param-value>52428800</param-value> <!-- 540 MB -->
        </init-param>
        <init-param>
            <param-name>default-charset</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </servlet>

    <servlet>
        <servlet-name>EwtSoapServlet</servlet-name>
        <servlet-class>ch.epilogic.ewt.servlets.EwtSoapServlet</servlet-class>
        <init-param>
            <param-name>service-list-title</param-name>
            <param-value>EWT - Service list</param-value>
        </init-param>
        <init-param>
            <param-name>service-list-stylesheet</param-name>
            <param-value>css/service-list.css</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>EwtDataServlet</servlet-name>
        <servlet-class>ch.epilogic.ewt.servlets.EwtDataServlet</servlet-class>
    </servlet>

    <!-- Mappings -->

    <servlet-mapping>
        <servlet-name>EwtWebServlet</servlet-name>
        <url-pattern>/web/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>EwtRestServlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>EwtSoapServlet</servlet-name>
        <url-pattern>/soap/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>EwtDataServlet</servlet-name>
        <url-pattern>/data/*</url-pattern>
    </servlet-mapping>
</web-app>

Ce fichier permet de spécifier les paramètres des différents référentiels ("repository") et des "clients". Ici un client est un mécanisme d'authentification. Le terme vient de la nomenclature utilisée par la librairie pac4j sur laquelle repose l'authentification dans Ewt.

Le fichier doit se trouver au même endroit que le fichier web.xml, c'est-à-dire dans le dossier WEB-INF de la web application.

Repositories

Chaque référentiel possède un attribut name qui permet de le référencer depuis les clients et d'un attribut type qui indique le type du référentiel. Les paramètres des différents types de référentiels sont donnés dans les chapitres correspondants.

Clients

Chaque client possède un nom (attribut name). C'est ce nom qui est repris dans le paramètre de filtre clients du web.xml. Le type quant à lui indique à Ewt de quel type de client il s'agit. Une description des différents clients actuellement disponibles dans Ewt est donnée dans ce chapitre.

Le fichier ci-dessous fournit des exemples de paramètres pour les référentiels file et script, ainsi que des exemples de clients basic et form.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <callbackUrl>${env:EWT_AUTH_CALLBACK_URL}</callbackUrl>

    <!-- repositories -->

    <repository name="tomcat-file" type="file">
        <file>C:/apps/apache-tomcat-10.1.33/conf/tomcat-users.xml</file>
    </repository>

    <repository name="app-script" type="script">
        <application>sample</application>
        <script>auth/fetchUser</script>
    </repository>

    <!-- clients -->

    <client name="basic" type="basic">
        <realm>UserDatabase</realm>
        <repository>tomcat-file</repository>
        <hashAlgo>SHA</hashAlgo>

        <lockOut failureCount="5" lockOutTime="300"
                 cacheSize="1000" warningTime="3600"/>
    </client>

    <client name="form" type="form">
        <loginUrl>/ewt/login.jsp</loginUrl>
        <repository>app-script</repository>
        <hashAlgo>SHA</hashAlgo>
        <usernameParam>j_username</usernameParam>
        <passwordParam>j_password</passwordParam>
        <tokenParam>j_token</tokenParam>

        <!-- éléments spécifiques totp -->
        <totpUrl>/ewt/login-token.jsp</totpUrl>
        <checkParam>j_check</checkParam>
        <maxAttempts>3</maxAttempts>

        <lockOut failureCount="5" lockOutTime="300"
                 cacheSize="1000" warningTime="3600"/>
    </client>
</config>