Bonjour à tous,
Je suis nouveau sur Jave EE et j'ai jusque là réussi à m'en sortir sans trop de problèmes avec Google. Mon application actuelle contient un tiers web avec 3 servlets appelant un tiers EJB constitué d'un @Stateless @Remote SessionBean applicatif qui encapsule des appels au service d'intégration.
Ce service d'intégration est composé d'un @Stateless @Local SessionBean et de 2 @Entity dont la persistence est gérée par JPA. Je travaille dans un environnement MyEclipse, j'ai écris moi-même les fichiers de déploiement build.xml, j'utilise JBoxx 5.1.0 et la base de données Hypersonic qui est livrée d'office avec.
Mon application est simple et fonctionne parfaitement, mes servlets me permettant d'appeler mon session bean applicatif et d'enregistrer des lignes dans la base de données. Voici mon fichier persistance.xml :
Là-dessus, j'ai voulu ajouter une couche d'authentification pour protéger (pour le moment la totalité) des servlets. J'ai donc voulu définir des contraintes de sécurité dans mon web.xml de mon tiers web. Voici le résultat (j'ai enlevé ce qui concerne le mapping servlet qui n'est probablement pas intéressant) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <persistence-unit name="CurrencyManagement"> <description>Manages the persistence for currencies. It rely on Hypersonic database embedded in JBoss.</description> <jta-data-source>java:DefaultDS</jta-data-source> <class>ch.mobi.testejb.integration.entity.CurrencyEntity</class> <class>ch.mobi.testejb.integration.entity.CurrencyRateEntity</class> </persistence-unit>
Le code de mon JSP de login est standard :
Code : 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 <security-constraint> <display-name>Security constraint for all servlets</display-name> <web-resource-collection> <web-resource-name>Protected area</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>CurrencyManager</realm-name> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/loginerror.jsp</form-error-page> </form-login-config> </login-config> <security-role> <role-name>admin</role-name> </security-role>
Forcément, à ce stade du mon développement, j'obtiens cette exception quand je tente de faire un login :
Code : 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 <form action="j_security_check" method="post"> <table> <tr> <td>User name : </td> <td><input type="text" name="j_username" /></td> </tr> <tr> <td>Password : </td> <td><input type="password" name="j_password" /></td> </tr> <tr> <td> </td> <td><input type="submit" value="connect" /></td> </tr> </table> </form>
Ce qui me paraît tout à fait normal étant donné que j'ai pas encore configuré mon Realm pour aller chercher dans la base de données les informations sur les users.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ERROR [UsersRolesLoginModule] Failed to load users/passwords/role files java.io.IOException: No properties file: users.properties or defaults: defaultUsers.properties found
Je change donc mon server.xml du dossier deploy/jbossweb.sar de l'install JBoss en ajoutant ce code à l'intérieur de la balise <Host name="localhost"></host>:
En relançant ma procédure de login, j'obtiens maintenant une autre exception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 <Realm className="org.apache.catalina.realm.DataSourceRealm" dataSourceName="DefaultDS" userTable="users" userRoleTable="user_roles" userNameCol="user_name" userCredCol="user_pass" roleNameCol="role_name" />
J'ai essayé dans la config server.xml de placer "java: DefaultDS" similairement à la config persistence.xml de mon tiers EJB, le résultat est exactement le même : le DataSource DefaultDS n'est pas trouvé dans les bindings JNDI.
Code : 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 ERROR [[localhost]] Exception performing authentication javax.naming.NameNotFoundException: Le Nom DefaultDS n'est pas lié à ce Contexte at org.apache.naming.NamingContext.lookup(NamingContext.java:770) at org.apache.naming.NamingContext.lookup(NamingContext.java:153) at org.apache.catalina.realm.DataSourceRealm.open(DataSourceRealm.java:403) at org.apache.catalina.realm.DataSourceRealm.authenticate(DataSourceRealm.java:284) at org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:258) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:417) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126) at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:619)
J'ai été voir la liste des bindings JNDI dans le service=JNDIview de la console de management JMX, et cette ligne est pourtant bien présente :
Je n'arrive donc pas à comprendre pourquoi cette erreur survient, je me serais attendu à tout sauf à un problème de NamingException.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 java: Namespace +- DefaultDS (class: org.jboss.resource.adapter.jdbc.WrapperDataSource)
Si vous avez une idée ou si vous savez à quel endroit de la configuration je dois aller regarder pour trouver le problèm, je suis preneur. Là ça fait déjà un peu trop d'heures que je suis sur le sujet
Petite remarque, j'ai également testé de placer la balise <Realm> non pas pour le <Host> mais pour le <Engine> (un niveau au dessus), et l'erreur était encore plus bizarre. Je peux refaire la configuration pour sortir l'erreur si quelqu'un juge la chose intéressante. J'ai lu dans la doc que les Realms pouvaient être définis pour le serveur d'application entier (dans <Engine>), pour un hôte particulier (<Host>) ou encore pour un contexte particulier (<Context>, balise n'existant pas pour le moment, j'utilise le Host par défaut Localhost).
Tout info est la bienvenue
Partager