Bonjour,
Je m'appelle Antoine, et je suis actuellement en train de bosser sur le développement d'une application Java Web. L'application est déployée via Glassfish 3.1.2, j'utilise NetBeans7.2, et une base de données est déployée via WAMP server2.2. La vue est implémentée avec Primefaces 3.4.1.
Mon post est assez lourd, j'ai essayé de le rendre lisible mais si y'a moyen de mieux faire n'hésitez pas à me le dire.
De façon générale, mon problème est le suivant : dans mon cahier des charges, je dois avoir 4 types différents d'utilisateurs, avec différents accès aux fonctionnalités ; cependant je ne parviens pas à correctement implémenter le tout (ou du moins les messages d'erreur sur la console Glassfish ne me plaisent pas du tout).
Tout d'abord, si je décris la base de donnée, 3 tables sont importantes :
Table principals
Table roles
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ID User Password 1 vigrid 1894d2de64eb73deddded83705326bdc 2 eitri a903479b4b49b5d1f0710e1f934a9c75 3 thor 575e22bc356137a41abdef379b776dba 4 odin e44985980c9d3c5d70b6a548b14d773a 5 loki e64cfa3fd59e32df57003c7401f48c99
Table principal_roles
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ID Name 1 read 2 annotate 3 vanguard 4 admin
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Principals_Ref Roles_Ref 1 [->] 1 [->] 2 [->] 2 [->] 3 [->] 3 [->] 4 [->] 4 [->]Soit donc une table d'utilisateurs, une table de roles, une table de mise en relation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE principals_roles index NULL fk_Principals_Roles_Roles1 1 NULL 4 Using index
Deuxième partie importante : la configuration du realm JDBC dans Glassfish.
Mon fichiers Glassfish-web.xml :
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 Nom de configuration : server-config Nom de domaine : framenet Nom de classe : com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm Propriétés propres à cette classe Contexte de JAAS : Obligatoire JNDI: jdbc/framenet Table utilisateurs : principals Colonne de noms utilisateur : User Colonne de mots de passe : Password Table de groupes : roles Colonne du nom utilisateur de la table de groupe : Colonne de noms de groupes : Name Affecter des groupes : Utilisateur de la base de données : Mot de passe de la base de données : Algorithme condensé : MD5 Algorithme de cryptage du mot de passe : MD5 Codage : Jeu de caractères :
Mon fichier web.xml :
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
23
24
25
26
27
28
29
30
31 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app error-url=""> <parameter-encoding default-charset="UTF-8" /> <security-role-mapping> <role-name>admin</role-name> <principal-name>odin</principal-name> <group-name>admin</group-name> </security-role-mapping> <security-role-mapping> <role-name>read</role-name> <principal-name>vigrid</principal-name> <group-name>read</group-name> </security-role-mapping> <security-role-mapping> <role-name>vanguard</role-name> <principal-name>thor</principal-name> <group-name>admin</group-name>vanguard </security-role-mapping> <security-role-mapping> <role-name>annotate</role-name> <principal-name>eitri</principal-name> <group-name>annotate</group-name> </security-role-mapping> <class-loader delegate="true"/> <jsp-config> <property name="keepgenerated" value="true"> <description>Keep a copy of the generated servlet class' java code.</description> </property> </jsp-config> </glassfish-web-app>
Avec cette configuration donc, je ne peux connecter aucun utilisateur, après avoir tenté les 5 j'obtiens la série d'erreurs :
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
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 <?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"> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <filter> <filter-name>FileUpload Filter</filter-name> <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class> </filter> <filter-mapping> <filter-name>FileUpload Filter</filter-name> <servlet-name>Faces Servlet</servlet-name> </filter-mapping> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <welcome-file-list> <welcome-file>faces/index.xhtml</welcome-file> </welcome-file-list> <security-role> <description>These users can read frame reports</description> <role-name>read</role-name> </security-role> <security-role> <description>These users can annotate texts</description> <role-name>annotate</role-name> </security-role> <security-role> <description>These users can annotate texts and create frames</description> <role-name>vanguard</role-name> </security-role> <security-role> <description>These users can do whatever they want</description> <role-name>admin</role-name> </security-role> <security-constraint> <display-name>AccessConstraint</display-name> <web-resource-collection> <web-resource-name>Application</web-resource-name> <description/> <url-pattern>/faces/index.xhtml</url-pattern> </web-resource-collection> <auth-constraint> <description/> <role-name>read</role-name> <role-name>annotate</role-name> <role-name>vanguard</role-name> <role-name>admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>framenet</realm-name> <form-login-config> <form-login-page>/faces/login.xhtml</form-login-page> <form-error-page>/faces/login.xhtml</form-error-page> </form-login-config> </login-config> </web-app>
Et là on commence à voir la première chose étrange : les deux utilisateurs eitri et vigrid ont un traitement différent de odin, thor et loki... Je ne parviens vraiment pas à savoir pourquoi.
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 SEVERE: SEC1111: Cannot load group for JDBC realm user [vigrid]. WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception INFO: Exception thrown while attempting to authenticate for user: vigrid SEVERE: SEC1111: Cannot load group for JDBC realm user [eitri]. WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception INFO: Exception thrown while attempting to authenticate for user: eitri SEVERE: SEC1112: Cannot validate user [thor] for JDBC realm. SEVERE: SEC1111: Cannot load group for JDBC realm user [thor]. WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception INFO: Exception thrown while attempting to authenticate for user: thor SEVERE: SEC1112: Cannot validate user [odin] for JDBC realm. SEVERE: SEC1111: Cannot load group for JDBC realm user [odin]. WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception INFO: Exception thrown while attempting to authenticate for user: odin SEVERE: SEC1111: Cannot load group for JDBC realm user [loki]. WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception INFO: Exception thrown while attempting to authenticate for user: loki
Maintenant, si je change la ligne "Affecter des groupes" dans la config glassfish en mettant "read", je parviens à connecter tous les utilisateurs. J'ai mis une fonction qui me permet de savoir les roles de chaque utilisateur, en utilisant IsUserInRole(). J'obtiens donc le message d'erreur suivant :
Autre exemple : si en plus de mettre "read" dans "affecter des groupes" je change le glassfish-web.xml en supprimant toutes les balises <group-name>...</group-name>, et que je ne gère plus les autorisations avec des groupes mais uniquement avec les principals, je peux connecter tous les utilisateurs, ils ont les bons roles, mais il y a encore un message d'erreur avec Glassfish. Je pourrais me contenter de ça, car avec cette façon de procéder je peux vraiment différencier les utilisateurs, mais ce n'est pas satisfaisant pour plusieurs raisons. Tout d'abord il y a des messages d'erreurs, que je ne comprend pas en plus. Et ensuite si je dois avoir une trentaine d'utilisateurs, la création de groupes va commencer à être plutôt nécessaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SEVERE: SEC1111: Cannot load group for JDBC realm user [vigrid]. INFO: Authenticated user: vigrid INFO: [read] is connected SEVERE: SEC1111: Cannot load group for JDBC realm user [eitri]. INFO: Authenticated user: eitri INFO: [read, annotate] is connected SEVERE: SEC1112: Cannot validate user [thor] for JDBC realm. SEVERE: SEC1111: Cannot load group for JDBC realm user [thor]. INFO: Authenticated user: thor INFO: [read, vanguard] is connected SEVERE: SEC1112: Cannot validate user [odin] for JDBC realm. SEVERE: SEC1111: Cannot load group for JDBC realm user [odin]. INFO: Authenticated user: odin INFO: [admin, read] is connected
Voilà les messages que j'obtiens :
Voilà. Notez que j'ai pas tenté avec Loki, ce sombre personnage faisant la plupart du temps complétement planter l'appli
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 SEVERE: SEC1111: Cannot load group for JDBC realm user [vigrid]. INFO: Authenticated user: vigrid INFO: [read] is connected SEVERE: SEC1111: Cannot load group for JDBC realm user [eitri]. INFO: Authenticated user: eitri INFO: [annotate] is connected SEVERE: SEC1112: Cannot validate user [thor] for JDBC realm. SEVERE: SEC1111: Cannot load group for JDBC realm user [thor]. INFO: Authenticated user: thor INFO: [vanguard] is connected SEVERE: SEC1112: Cannot validate user [odin] for JDBC realm. SEVERE: SEC1111: Cannot load group for JDBC realm user [odin]. INFO: Authenticated user: odin INFO: [admin] is connected
Merci à tous ceux qui ont lu mon post jusqu'ici, j'espère que quelqu'un aura une proposition à me faire ! J'ai essayé d'être complet, mais je suis débutant dans le domaine de l'info, donc j'ai peut-être oublié quelques parties fondamentales. Dites-le moi si c'est le cas, je compléterai !
Antoine
Partager