Bonjour à tous,
Après plusieurs jours à parcourir le Web à la recherche d'une information utile, je me résigne à faire un appel à l'aide.
Pour ce projet, nous utilisons essentiellement les outils suivants :
- JBoss 6.1
- Struts 2.5
- Apache Tiles 3.0.5
- EclipseLink 1.1.3
Dans le cadre d'une application JEE, nous utilisions Apache Shiro pour toute la partie identification. Suite à une demande des urbanistes SI, nous sommes maintenant en train de remplacer Shiro par les fontionnalités internes de JBoss.
Après plusieurs jours de prises de têtes intenses pour réussir à faire fonctionner JBoss et Struts2, j'arrive maintenant jusqu'à la page de connexion qui ne fonctionne malheureusement pas.
En effet, à chaque tentative, JBoss pour restitue la même page, que les identifiants soient bons ou non. A priori, l'appel au DatabaseServerLoginModule est bien effectué vu que je retrouve la requête de sélection du mot de passe dans les dernières requêtes exécutées sur la base.
Je constate également qu'après la validation, JBoss me réoriente vers la page "127.0.0.1:8080/app/j_security_check". Je ne suis pas sûr que voir "j_security_check" à la fin de l'URL soit bon signe...
Je précise que, côté serveur (et grâce au dev mode de Struts2), je reçois les messages d'erreur suivant lors de la validation du formulaire de connexion :
De ce que je comprends, j'ai l'impression que Struts intercepte l'appel à j_security_check au lieu de laisser JBoss s'en occuper.11:35:45,102 ERROR [stderr] (http-/127.0.0.1:8080-1) ERROR ParametersInterceptor Developer Notification (set struts.devMode to false to disable this message):
11:35:45,103 ERROR [stderr] (http-/127.0.0.1:8080-1) Unexpected Exception caught setting 'j_password' on 'class com.opensymphony.xwork2.ActionSupport: Error setting expression 'j_password' with value ['password', ]
11:35:45,104 ERROR [stderr] (http-/127.0.0.1:8080-1) ERROR ParametersInterceptor Developer Notification (set struts.devMode to false to disable this message):
11:35:45,105 ERROR [stderr] (http-/127.0.0.1:8080-1) Unexpected Exception caught setting 'j_username' on 'class com.open symphony.xwork2.ActionSupport: Error setting expression 'j_username' with value ['username', ]
C'est pourquoi j'ai ajouté une exclusion dans le fichier struts.xml, mais cela ne semble servir à rien.
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2<constant name="struts.action.excludePattern" value="/j_security_check,/images" />
J'ai eu beau chercher sur internet, je n'ai trouvé personne qui semble avoir le même problème
Je précise que je ne souhaite pas particulièrement créer une action pour gérer l'identification, et que le processus de base me suffit amplement.
Le problème est-il bien un problème de configuration de Struts, ou est-ce que je m'y prends mal quelque part ?
Voici les fichiers de configuration (un peu épurés):
web.xml
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
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 <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <display-name>PILAF</display-name> <listener> <listener-class> org.apache.struts2.tiles.StrutsTilesListener </listener-class> </listener> <context-param> <param-name>tilesDefinitions</param-name> <param-value>/WEB-INF/tiles.xml</param-value> </context-param> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> <security-constraint> <web-resource-collection> <web-resource-name>Public Area</web-resource-name> <url-pattern>/images/*</url-pattern> <url-pattern>/css/*</url-pattern> </web-resource-collection> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>All resources</web-resource-name> <description>Protects all resources</description> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> <role-name>std</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>admin</role-name> </security-role> <security-role> <role-name>std</role-name> </security-role> <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login</form-login-page> <form-error-page>/login</form-error-page> </form-login-config> </login-config> <session-config> <session-timeout>60</session-timeout> </session-config> <error-page> <error-code> 404 </error-code> <location> /404 </location> </error-page> <!-- Les welcomes Files--> <welcome-file-list> <welcome-file>/accueil</welcome-file> </welcome-file-list> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> </web-app>
jboss-web.xml
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 <?xml version="1.0" encoding="UTF-8"?> <jboss-web> <context-root>PILAF</context-root> <security-domain>java:/jaas/PilafPolicy</security-domain> </jboss-web>
struts.xml
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
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 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <constant name="struts.action.excludePattern" value="/j_security_check,/images"/> <package name="default" namespace="/" extends="struts-default"> <result-types> <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" /> <result-type name="json" class="org.apache.struts2.json.JSONResult" /> </result-types> <default-action-ref name="index" /> <global-results> <result name="error">/error.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error"/> </global-exception-mappings> <action name="accueil" class="com.app.action.InitAccueilAction" method="execute"> <result name="success" type="tiles">/welcome.tiles</result> </action> <action name="404"> <result name="success">/404</result> </action> <action name="logout"> </action> <action name="login"> <result name="success">login.jsp</result> </action> </package> </struts>
Une partie du standalone.xml (config JBoss donc)
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 <security-domain name="PilafPolicy" cache-type="default"> <authentication> <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required"> <module-option name="dsJndiName" value="java:/jdbc/PilafDS"/> <module-option name="principalsQuery" value="SELECT password FROM UTILISATEUR WHERE username = ?"/> <module-option name="rolesQuery" value="SELECT role_name_actif, 'Roles' FROM UTILISATEUR WHERE username = ?"/> <module-option name="hashAlgorithm" value="SHA-256"/> <module-option name="hashEncoding" value="base64"/> </login-module> </authentication> </security-domain>
login.jsp (qui est très sale...)
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
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 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!-- link rel="shortcut icon" href="../favicon.ico"--> <link rel="stylesheet" type="text/css" href="css/style.css"> <link rel="stylesheet" type="text/css" href="css/style.html.css"> <title>Formulaire de login</title> <script type="text/javascript" src="js/modernizr.custom.63321.js"></script> <!--[if lte IE 7]><style>.main{display:none;} .support-note .note-ie{display:block;}</style><![endif]--> <style type="text/css"> body { background: #FEFEFE ; } </style> </head> <body> <div class="container" align="center"> <section class="main"> <form action="j_security_check" method="post" > <table width=400 cellpadding=2> <TR> <TD colspan=2> <h1><span class="log-in">Connexion à PILAF</span></h1> <br> </TD> </TR> <TR> <TD> <label><i class="icon-user"></i>Identifiant</label> </TD> <TD> <label><i class="icon-lock"></i>Mot de passe</label> </TD> </TR> <TR> <TD valign="top"> <p class="float"> <input type="text" name="j_username" /> </p> </TD> <td valign="top"> <p class="float"> <input type="password" name="j_password" class="showpassword" /> </p> </TD> </TR> <TR> <TD colspan=2> <p class="float"> <input type="submit" value="Valider"> </p> </TD> </TR> <TR> <TD colspan=2> <br><br><br> </TD> </TR> </table> </form> </section> </div> <!-- jQuery if needed --> <script type="text/javascript" src="js/jquery-1.9.1.min.js"></script> <script type="text/javascript"> $(function () { $(".showpassword").each(function (index, input) { var $input = $(input); $("<p class='opt'/>").append( $("<input type='checkbox' class='showpasswordcheckbox' id='showPassword' />").click(function () { var change = $(this).is(":checked") ? "text" : "password"; var rep = $("<input placeholder='Password' type='" + change + "' />") .attr("id", $input.attr("id")) .attr("name", $input.attr("name")) .attr('class', $input.attr('class')) .val($input.val()) .insertBefore($input); $input.remove(); $input = rep; }) ).append($("<label for='showPassword'/>").text("Afficher en clair")).insertAfter($input.parent()); }); $('#showPassword').click(function () { if ($("#showPassword").is(":checked")) { $('.icon-lock').addClass('icon-unlock'); $('.icon-unlock').removeClass('icon-lock'); } else { $('.icon-unlock').addClass('icon-lock'); $('.icon-lock').removeClass('icon-unlock'); } }); }); </script> <center> <img src="<s:url value="/images/logo.jpg"/>" height="212" width="412"/> </center> </html>
Partager