Je croyais avoir résolu le problème de l'enregistrement du mot de passe évoqué dans cette discussion par l'externalisation d'une méthode mais je suis confronté à un nouveau problème que je trouve pour le moins original. J'espère que quelqu'un pourra m'expliquer clairement ce qui se passe.

Donc j'ai créé une classe MD5 dans un nouveau package contenant une méthode de cryptage MD5 compatible avec MySQL.
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
package org.domain.stamas.utils;
 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
import org.apache.commons.codec.binary.Hex;
 
/**
 * Crypte en MD5 une chaîne
 * @author plemenager
 *
 */
public class MD5 
{
    /** generateMD5
     * Chiffre en MD5 sur 32 bits conforme à la fonction MD5 de MySQL.
     * @param password : le mot de passe à coder en MD5
     * @return : le mot de passe codé.
     */
    public static String generateMD5passwd(String password) 
    {
        try 
        {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(password.getBytes());
            return new String(Hex.encodeHex(bytes));
 
            /*md.update(password.getBytes());
            StringBuilder result = new StringBuilder();
            for (byte b : md.digest())
                result.append(String.format("%02x", b));
            return result.toString();*/
        } 
        catch (NoSuchAlgorithmException e) 
        {
            e.printStackTrace();
            return null;
        }
    }
 
}
=> Il n'y a ici aucune allusion à une entité de mon projet.

J'utilise cette fonction dans Authenticator.java pour authentifier l'utilisateur :
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
    public boolean authenticate()
    {
 
        try
        {
            log.info("authenticating {0}", credentials.getUsername());
 
            Query query = entityManager.createQuery(
                    "FROM ThUtilisateurUti u " +
                    "WHERE u.utiLogin = :username " +
                        "AND u.utiMotPasse = :password");
            query.setParameter("username", credentials.getUsername());
            String passwd = MD5.generateMD5passwd(credentials.getPassword());
            log.info("authenticating {0} - avant paramètre password saisi", credentials.getPassword());
            log.info("authenticating {0} - avant paramètre password MD5", passwd);
            query.setParameter("password", passwd);
            log.info("authenticating {0} - après paramètre password");
 
            //query.setParameter("password", credentials.getPassword());
 
            this.user = (ThUtilisateurUti) query.getSingleResult();
=> Je mets dans la variable passwd le MD5 du mot de passe saisi par l'utilisateur.
=> J'affecte cette variable passwd en paramètre à ma requête et j'interroge la BDD.

Voici le résultat :
15:54:43,758 INFO [Authenticator] authenticating etutest
15:54:43,759 INFO [Authenticator] authenticating T101210T - avant paramètre password saisi
15:54:43,759 INFO [Authenticator] authenticating add6a73c4f31d9d91fa77f56afbff07d - avant paramètre password MD5
15:54:43,759 INFO [Authenticator] authenticating {0} - après paramètre password
Hibernate:
select
thutilisat0_.uti_id_personne as prs1_4_,
thutilisat0_1_.prs_adrel as prs2_4_,
thutilisat0_1_.prs_nom as prs3_4_,
thutilisat0_1_.prs_prenom as prs4_4_,
thutilisat0_1_.prs_telephone as prs5_4_,
thutilisat0_.uti_id_type_utilisateur as uti4_5_,
thutilisat0_.uti_login as uti1_5_,
thutilisat0_.uti_mot_passe as uti2_5_,
thutilisat0_3_.etu_adresse as etu1_7_,
thutilisat0_3_.etu_code_postal as etu2_7_,
thutilisat0_3_.etu_date_naissance as etu3_7_,
thutilisat0_3_.etu_id_concours as etu5_7_,
thutilisat0_3_.etu_id_etablissement_origine as etu6_7_,
thutilisat0_3_.etu_id_commune_residence as etu7_7_,
case
when thutilisat0_3_.etu_id_candidat is not null then 3
when thutilisat0_2_.cnd_id_utilisateur is not null then 2
when thutilisat0_.uti_id_personne is not null then 1
end as clazz_
from
stamas.th_utilisateur_uti thutilisat0_
inner join
stamas.te_personne_prs thutilisat0_1_
on thutilisat0_.uti_id_personne=thutilisat0_1_.prs_id
left outer join
stamas.th_candidat_cnd thutilisat0_2_
on thutilisat0_.uti_id_personne=thutilisat0_2_.cnd_id_utilisateur
left outer join
stamas.th_etudiant_etu thutilisat0_3_
on thutilisat0_.uti_id_personne=thutilisat0_3_.etu_id_candidat
where
thutilisat0_.uti_login=?
and thutilisat0_.uti_mot_passe=? limit ?
Hibernate:
select
tetypeutil0_.tu_id as tu1_15_0_,
tetypeutil0_.tu_libelle as tu2_15_0_
from
stamas.te_type_utilisateur_tu tetypeutil0_
where
tetypeutil0_.tu_id=?
15:54:43,767 INFO [Authenticator] authenticating {0} - Authentifié en tant qu'étudiant
15:54:43,768 DEBUG [Identity] Login successful for: etutest
15:54:43,769 DEBUG [ResourceLoader] resource bundle missing: login
15:54:43,786 DEBUG [Component] trying to inject with hierarchical context search: identity
15:54:43,795 DEBUG [Component] trying to inject with hierarchical context search: credentials
15:54:43,795 DEBUG [Component] trying to inject with hierarchical context search: entityManager
15:54:43,795 DEBUG [Component] trying to inject from specified context: MotPasse, scope: EVENT
15:54:43,796 DEBUG [Navigator] redirecting to: /accueilEtudiant.xhtml
15:54:43,796 DEBUG [FacesManager] redirecting to: /stamas/accueilEtudiant.seam?cid=6
15:54:43,796 DEBUG [SeamPhaseListener] committing transaction after phase: INVOKE_APPLICATION 5
15:54:43,796 DEBUG [EntityTransaction] committing JPA resource-local transaction
Hibernate:
update
stamas.th_utilisateur_uti
set
uti_id_type_utilisateur=?,
uti_login=?,
uti_mot_passe=?
where
uti_id_personne=?
Le mot de passe saisi est 'T101210T' et son MD5 est bien add6a73c4f31d9d91fa77f56afbff07d qui figure bien dans la BDD. D'ailleurs, le login s'effectue.
Sauf que quand on passe à la page suivante, il s'opère un UPDATE que je n'ai demandé nulle part et dans la BDD le mot de passe est changé en MD5('
add6a73c4f31d9d91fa77f56afbff07d') !

La seule cause que j'imagine serait que dans Authenticator.java, j'exporte user :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
    @Out(scope = ScopeType.SESSION)
    private ThUtilisateurUti user = new ThUtilisateurUti();
Et que dans AccueilEtudiant.java je l'importe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @In ThUtilisateurUti user;
Sauf que, à mon humble avis de débutant dans le monde étrange de Seam, jamais je ne demande de changer la valeur du mot de passe.

Une explication et une solution à me donner ?