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.
web.xml
ewtAuthConfig.xml
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>