Problème avec la vérification de mot de passe
0nn2belle
Messages postés
17
Statut
Membre
-
0nn2belle Messages postés 17 Statut Membre -
0nn2belle Messages postés 17 Statut Membre -
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 :
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 :
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) :
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
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 :
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 :
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) :
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;
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
A voir également:
- Problème avec la vérification de mot de passe
- Mot de passe - Guide
- Trousseau mot de passe iphone - Guide
- Mot de passe administrateur - Guide
- Mot de passe bios perdu - Guide
- Voir mot de passe wifi android - Guide
2 réponses
Alors, le problème vient en réalité de SQL Developer, avec SQL Plus ça fonctionne nickel sauf que je n'ai pas mes messages d'erreur que j'ai écrit moi même qui s'affiche !
C'est bon tout fonctionne, je me permet donc de poster mon code final ici si besoin :
Bon courage à tous :)
CREATE OR REPLACE FUNCTION verify_password
(
username varchar2,
password 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
raise_application_error(-20900,'Le mot de passe est trop court, il doit contenir au moins 4 caractères');
RETURN(FALSE);
WHEN chiffre_manquant THEN
raise_application_error(-20901,'Le mot de passe doit contenir au moins 1 chiffre');
RETURN(FALSE);
WHEN password_identique_username THEN
raise_application_error(-20902,'Mot de passe est identique au nom d''utilisateur');
RETURN(FALSE);
WHEN mot_interdit THEN
raise_application_error(-20903,'Votre mot de passe contient un mot interdit');
RETURN(FALSE);
END verify_password;
Bon courage à tous :)