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

PL/SQL Oracle Discussion :

Problème avec la vérification de mot de passe d'un profil


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Par défaut Problème avec la vérification de mot de passe d'un profil
    Bonjour à tous.
    J'ai crée une fonction qui va vérifier le contenu d'un mot de passe (fonction proche de celle prédéfinie par Oracle), cette dernière compile bien avec l'utilisateur SYS. J'ai fait les test en la mettant en mode procédure, elle fonctionne bien.
    Je crée un profil avec l'option "password_verify_function" et je lui passe le nom de ma fonction ce qui me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE PROFILE ProfilUserStd
    ...
    password_verify_fonction verify_password;
    Où verify_password est le nom de ma fonction.Je crée mon profil, tout se passe bien.

    Mon souci arrive quand j'assigne ce profil à un utilisateur quelconque, en effet quoique je fasse j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Rapport d'erreur :
    Erreur SQL : ORA-28003: échec de la vérification du mot de passe indiqué
    ORA-06503: PL/SQL : La fonction ne ramène aucune valeur
    28003. 00000 -  "password verification for the specified password failed"
    *Cause:    The new password did not meet the necessary complexity
               specifications and the password_verify_function failed
    *Action:   Enter a different password. Contact the DBA to know the rules for
               choosing the new password
    Et ce quelque soit le mot de passe, qu'il respecte ou non les conditions de ma fonction.

    Au cas où voici le code de ma fonction (à noter que j'ai besoin d'une table DICTIONNAIRE qui contient les mots interdits du mot de passe) :
    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
    73
    74
    75
    76
     
    CREATE OR REPLACE FUNCTION verify_password
      (
        password varchar2,
        username varchar2,
        old_password varchar2
      )
    RETURN boolean
    IS
    n boolean;
    longueur_insuffisante exception;
    chiffre_manquant exception;
    password_identique_username exception;
    mot_interdit exception;
    presenceChiffre boolean;
    longueurPassword integer;
    listeChiffre varchar2(10);
    cursor c1 is select mot from dictionnaire;
     
    BEGIN
      longueurPassword:=length(password); /*Variable qui sera utilisé tout au long des traitements*/
     
     
      /*----------------Traitement de la longueur d'un mot de passe--------------------------------------------------*/
      IF longueurPassword < 4 THEN /*La fonction length permet de récupérer la longueur du mot de passe*/
        RAISE longueur_insuffisante;
      END IF;
     
      /*----------------Traitement du nombre minimum de chiffre------------------------------------------------------*/
      /*Déclaration et initialisation des variables*/
      listeChiffre :='0123456789';
      presenceChiffre:=false;
     
      FOR i in 1..10 LOOP /*boucle qui va parcourir la liste des chiffres*/
        FOR j in 1..longueurPassword LOOP /*Boucle qui va parcourir le mot de passe*/
          IF substr(password,j,1)=substr(listeChiffre,i,1) THEN /*Cherche une correspondance entre le mot de passe et la liste de chiffre*/
            presenceChiffre:=true;
          END IF;
        END LOOP;
      END LOOP;
      IF presenceChiffre=false THEN
            RAISE chiffre_manquant;
      END IF;
     
      /*----------------Fonction qui détermine si le mot de passe est identique au nom d'utilisateur ----------------*/
      FOR i in 1..longueurPassword LOOP
        IF username = substr(password, i, length(username)) THEN
          RAISE password_identique_username;
        END IF;
      END LOOP;
     
      /*----------------Traitement des mots interdits dans le mot de passe ------------------------------------------*/
      FOR enreg in c1 LOOP
        FOR i in 1..longueurPassword LOOP
          IF enreg.mot=substr(NLS_LOWER(password), i, length(enreg.mot)) THEN
            RAISE mot_interdit;
          END IF;
        END LOOP;
      END LOOP;
     
    RETURN(TRUE);
     
    EXCEPTION
      WHEN longueur_insuffisante THEN
        DBMS_OUTPUT.PUT_LINE('Le mot de passe est trop court, il doit contenir au moins 4 caractères');
     
      WHEN chiffre_manquant THEN
        DBMS_OUTPUT.PUT_LINE('Le mot de passe doit contenir au moins 1 chiffre');
     
      WHEN password_identique_username THEN
        DBMS_OUTPUT.PUT_LINE('Mot de passe est identique au nom d''utilisateur');
     
      WHEN mot_interdit THEN
        DBMS_OUTPUT.PUT_LINE('Votre mot de passe contient un mot interdit');
     
    END verify_password;

    Voici ensuite le code de mon profil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    create profile ProfilUserStd limit
    /* 1session par utilisateur */
    sessions_per_user 1
    /* temps de connexion maximum = 4h */
    connect_time 240
    /* si 15min d'inactivité = déconnexion automatique*/
    idle_time 15
    /* nombre maximales de tentative de connexion =4 */
    failed_login_attempts 4
    /*expiration mot de passe = 45jours */ 
    password_life_time 45
    /* appel de la fonction personnalisée pour traiter le mot de passe */ 
    password_verify_function verify_password;
    Bien entendu, je suppose que le problème vient de ma fonction, mais je ne sais pas d'où, surtout que je l'ai testé en tant que Procédure et ça a fonctionné ! Auriez-vous une idée ? Merci d'avance,
    Annabelle

  2. #2
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Bonjour,

    D'abord commence par mettre en commentaire tout le code de ta fonction et retourne directement pour voir si ta fonction fonctionne bien.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Par défaut
    Alors dans ma fonction j'ai remplacé tout le code dans le BEGIN par "Return TRUE", la fonction se compile bien et je peux bien l'utiliser dans mon ALTER USER. Mais à quoi cela m'avance ??

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    et bien cela nous indique que le problème vient surement de la fonction.

    Il suffit alors de faire une petite trace, ou bien d'enlever les commentaires petit à petit, et tu trouveras la requête qui pose problème...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Par défaut
    Ok mais ce que je ne comprends pas c'est que quand j'ai testé la fonction en mode procédure (sans valeur de retour et avec les paramètres en dur) ça a fonctionné !

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Et bien c'est normal.

    On vient de faire le test avec une valeur en dur ( True ) et ça a marché avec la fonction.

    Moi je dirais que ça vient de l'une des exceptions que tu as. car dans ces dernières il n'y a pas de .

    Tu devrais ajouter un dans les exceptions et re-tester.

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par 0nn2belle Voir le message
    Ok mais ce que je ne comprends pas c'est que quand j'ai testé la fonction en mode procédure (sans valeur de retour et avec les paramètres en dur) ça a fonctionné !
    Peut être parce que vous ne respectez pas ce qu'on vous demande:
    7.4.4.1 Password Verification Routine Formatting Guidelines
    You can enhance the existing password verification complexity routine or create other password verification routines using PL/SQL or third-party tools.

    The PL/SQL call must adhere to the following format:
    routine_name
    (
    userid_parameter IN VARCHAR(30),
    password_parameter IN VARCHAR (30),
    old_password_parameter IN VARCHAR (30)
    )
    RETURN BOOLEAN


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de vérification de mot de passe
    Par MALLM dans le forum Tkinter
    Réponses: 6
    Dernier message: 04/05/2013, 18h55
  2. [1.x] Vérification de mot de passe avec sfDoctrineGuardPlugin
    Par Willy55 dans le forum Symfony
    Réponses: 9
    Dernier message: 02/08/2012, 12h21
  3. Réponses: 2
    Dernier message: 31/05/2012, 13h09
  4. Problèmes avec plusieurs Login et Mots de passe
    Par joesaab dans le forum Général Java
    Réponses: 4
    Dernier message: 15/05/2012, 16h03
  5. Réponses: 1
    Dernier message: 12/10/2009, 21h31

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