IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

La taverne du Club : Humour et divers Discussion :

ll me reste un peu d'antipattern, je vous en remet?

  1. #1
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut ll me reste un peu d'antipattern, je vous en remet?
    Aujourd'hui, je développais une application spring (ouais ouais, je sais), plus particulièrement, je configurais la sécurité et le hashage des mots de passe.

    Je me loggue + pas à pas: les hash sont les mêmes, et pourtant je suis jeté. Bizarre me dis-je, j'ai du rater qqch. Je réessaie et là: plus de hash, le hash stocké de l'utilisateur a disparu de la mémoire (je précise que c'est par rapport à ce hash qu'on vérifie ce que l'utilisateur a entré). Je fouille et vla ti pas que je trouve le coupable dans spring security:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        /**
         * @deprecated Use the exception message or use a custom exception if you really need additional information.
         */
        @Deprecated
        public AuthenticationException(String msg, Object extraInformation) {
            super(msg);
            if (extraInformation instanceof CredentialsContainer) {
                ((CredentialsContainer) extraInformation).eraseCredentials();
            }
            this.extraInformation = extraInformation;
        }
    Deux anti-pattern pour le prix d'une:
    -> Logique buisness / effet de bord dans une Exception (alors que cette logique devrais se trouver dans le catch correspondant)
    -> logique buisness dans une constructeur (autant faire les choses en beautés).

    Oui, vous avez bien lu, si l'utilisateur tappe un mauvais mot de passe, on efface tout ce qu'on a de lui en mémoire. Et tant pis si on stockait les données uniquement en mémoire

    On rajoute à ça:
    - comportement non documenté
    - Passage d'un "Object" très typé
    - Appel d'un constructeur déprécié

    Notez qu'on est bien conscient là qu'on est occupé d'effacer un password du store puisque l'appel est

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            if (!passwordEncoder.isPasswordValid(userDetails.getPassword(), presentedPassword, salt)) {
                logger.debug("Authentication failed: password does not match stored value");
     
                throw new BadCredentialsException(messages.getMessage(
                        "AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials"),
                        includeDetailsObject ? userDetails : null);
            }
    (presentedPassword étant ce que j'ai tappé au prompt)
    Notez aussi le flag ambigu "includeDetailsObject" qui, à true, a in fine l'effet de supprimer des détails

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Adorable, en effet.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je suis d'accord sur le fait que ça ne devrait pas se trouver dans le constructeur, mais d'un autre côté je trouve normal de supprimer les credentials le plus tôt possible (logguer un mauvais mot de passe peut donner des informations sur le vrai mdp s'il y a eu typo, etc.).

    En fait, le problème n'est pas tant qu'on efface les credentials, mais qu'on le fasse sur l'original (effet de bord). La chose à faire serait de cloner le extraInformation et filtrer la copie.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    En fait, le problème n'est pas tant qu'on efface les credentials, mais qu'on le fasse sur l'original (effet de bord). La chose à faire serait de cloner le extraInformation et filtrer la copie.
    extraInformation etant de type "inconnu", impossible à cloner.

    La chose propre aurait été de prendre un type bien précis, d'extraire les informations voulue dans le constructeur et de ne stocker que ces informations

    Bref, rien de ce qui a été fait

Discussions similaires

  1. [Un peu de philo]Croyez-vous au hasard ?
    Par Le Pharaon dans le forum La taverne du Club : Humour et divers
    Réponses: 125
    Dernier message: 29/12/2006, 14h10
  2. Ecrire dans un fichier sans supprimer le reste
    Par koan_sabian dans le forum Linux
    Réponses: 4
    Dernier message: 20/02/2003, 15h44
  3. RTL60 ( la jsuis un peu confused)
    Par magdoz dans le forum Outils
    Réponses: 7
    Dernier message: 23/07/2002, 11h20
  4. TBitBtn reste enfoncé
    Par TRINCAL Sylvain dans le forum C++Builder
    Réponses: 8
    Dernier message: 25/06/2002, 16h31
  5. DirectX 6, un peu en retard ... :\
    Par multani dans le forum DirectX
    Réponses: 3
    Dernier message: 28/05/2002, 19h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo