Forum APEX - Développement Oracle Application Express

Le site des développeurs francophones APEX - Oracle Application Express

Vous n'êtes pas identifié(e).

Annonce

Bienvenue sur le forum Oracle APEX

S'il s'agit de votre première visite, nous vous invitons à consulter la FAQ en cliquant sur le lien ci-dessous. Vous pouvez poster ici toutes vos questions sur l'installation, le développement (composants clients et serveurs), l'administration des instances Oracle APEX. Par ailleurs, ce forum diffuse les annonces et actualités relatives à Oracle APEX.

Oracle APEX 4.1

Oracle APEX 4.1 est disponible depuis le 24 août 2011.

Oracle APEX 4.0

Oracle APEX 4.0 est disponible depuis le 23 juin 2010. Il existe 2 distributions, une distribution en langue anglaise uniquement et une distribution multilingue.

#1 2011-04-13 10:45:34

salistase
Membre
Inscription : 2011-03-31
Messages : 15

Authentification APEX

Bonjour,
Pour des besoins du client, je dois modifier la connexion à mon application, à savoir :
Dans une page de Login standard d'une application APEX, on trouve ce qui suit :

wwv_flow_custom_auth_std.login(
    P_UNAME       => :P101_USERNAME,
    P_PASSWORD    => :P101_PASSWORD,
    P_SESSION_ID  => v('APP_SESSION'),
    P_FLOW_PAGE   => :APP_ID||':1'
    );

Pour ma part, j'ai besoin de vérifier si mon utilisateur existe dans une table USER avant de l'authentifier.
j'ai alors modifié la fonction précédente comme suit :

DECLARE
l_cpt number(10);
BEGIN
select count(*) into l_cpt from T_USER where UPPER(LOGIN) = :APP_USER ;
 
if l_cpt <= 0 then
     wwv_flow_custom_auth_std.login( 
     P_UNAME => :P101_USERNAME,
     P_PASSWORD => :P101_USERNAME,
     P_SESSION_ID => v('APP_SESSION'),
     P_FLOW_PAGE => :APP_ID||':101'
     );

else
    wwv_flow_custom_auth_std.login(
    P_UNAME       => :P101_USERNAME,
    P_PASSWORD    => :P101_PASSWORD,
    P_SESSION_ID  => v('APP_SESSION'),
    P_FLOW_PAGE   => :APP_ID||':1'
    );
end if;
delete from T_PANIER;
end;

Le fonctionnement attendu est le suivant :
Si l'utilisateur existe dans ma table USER, alors il s'authentifie et sera dirigé vers la page 1
Sinon il restera sur la page d'authentification, à savoir la page 101

cette nouvelle procédure ne fonctionne pas, même si l'utilisateur existe bien dans ma table, il n'arrive pas à s'authentifier avec un message d'erreur
"Invalid login credentials"

Pour info, l'authetification se fait via un annuaire LDAP, si je laisse ma page de login standard avec uniquement :
wwv_flow_custom_auth_std.login(
    P_UNAME       => :P101_USERNAME,
    P_PASSWORD    => :P101_PASSWORD,
    P_SESSION_ID  => v('APP_SESSION'),
    P_FLOW_PAGE   => :APP_ID||':1'
    );

tout se passe bien.

Merci d'avance pour votre aide

Hors ligne

#2 2011-04-13 11:16:40

Yann39
Membre
Inscription : 2011-03-28
Messages : 18

Re : Authentification APEX

Salut,

il ne faut pas procéder comme ceci. Il faut utiliser les schémas d'authentification.

- Créé une fonction dans laquelle tu vérifies que ton utilisateur existe (et que le mot de passe correspondant est correcte) :

function authenticate (p_username in varchar2, p_password in varchar2) return boolean

- Ensuite créé un nouveau schéma d'authentification, et lorsqu'on te demande la fonction d'authentifaction, tu indiques simplement :

return authenticate;

Et dans "Logout URL" tu indiques ceci pour que tu sois redirigé vers la page 101 quand l'utilisateur se déconnecte :

wwv_flow_custom_auth_std.logout?p_this_flow=&APP_ID.&p_next_flow_page_sess=&APP_ID.:101:&SESSION.

- Il ne te reste plus qu'à changer le schéma d'authentification par défaut par ton nouveau schéma.

Hors ligne

#3 2011-04-13 11:48:23

salistase
Membre
Inscription : 2011-03-31
Messages : 15

Re : Authentification APEX

Merci pour la réponse.
Je suis passé par les schémas d'authentifications et j'ai créé un schéma basé sur une authentification LDAP, sauf qu'avant de s'authentifier, j'ai besoin de vérifier que mon user existe dans ma base.
Pour se connecter, j'utilise les logins et mdp LDAP.

Hors ligne

#4 2011-04-13 12:45:19

Yann39
Membre
Inscription : 2011-03-28
Messages : 18

Re : Authentification APEX

Ah ok désolé j'ai lu un peu trop rapidement la fin de ton message wink

Dans ce cas je pense que tu peux simplement utiliser une condition sur le processus :

Dans la page 101, dans le processus de login, sous l'onglet Condition, met le Condition Type à "PL/SQL function body returning a boolean", et dans l'expression du met le code permettant de retourner true ou false si l'utilisateur existe ou non.

Je pense que tu peux aussi faire ça dans le schéma d'authentification dans "Pre-Authentication Process", qui sera exécuté après le submit juste avant la vérification du login/password.

Dernière modification par Yann39 (2011-04-13 12:49:03)

Hors ligne

#5 2011-04-13 14:30:23

salistase
Membre
Inscription : 2011-03-31
Messages : 15

Re : Authentification APEX

Bonjour,
Merci pour votre réponse.
J'ai suivi votre conseil et j'ai rajouté une condition.
j'ai créé la fonction suivante :

create or replace function "PRE_AUTHENTICATE"
return BOOLEAN
is
l_cpt NUMBER(10);
BEGIN
    select count(*) into l_cpt from T_USER where LOGIN = V('APP_USER')  ;
if l_cpt <= 0 then
return false;
else
return true;
end if;
END;

et dans l'expression, j'ai mis :

return  PRE_AUTHENTICATE;

mais ça ne marche pas à cause du V('APP_USER'), qd je mets en dur le login, ça marche et dès que je le remplace par ma variable, ça ne marche plus.
j'ai testé avec les autres syntaxes :APP_USER et &APP_USER. mais ce n'est pas mieux

Hors ligne

#6 2011-04-13 15:15:16

Yann39
Membre
Inscription : 2011-03-28
Messages : 18

Re : Authentification APEX

Bizarre, v('APP_USER') fonctionne très bien en PL/SQL. Essayez peut-être avec un 'v' minuscule.

Sinon passez le login en paramètre à votre fonction, et appelez :

return PRE_AUTHENTICATE(:APP_USER);

Hors ligne

#7 2011-04-13 15:44:50

salistase
Membre
Inscription : 2011-03-31
Messages : 15

Re : Authentification APEX

Bonjour,
Voilà j'ai testé la deuxième solution mais ça ne marchait toujours pas.
j'ai tenté autre chose et là ça a marché, au lieu de passer le paramètre :APP_USER, j'ai passé en paramètre le nom de mon champ login à savoir :P101_USERNAME

return PRE_AUTHENTICATE(:P101_USERNAME);

Je pense que c'est un peu normal, la variable :APP_USER est une variable de session et tant que l'utilisateur n'est pas connectée, elle ne vaut rien.
Je pense qu'on peut l'utiliser (:APP_USER) une fois l'utilisateur connecté à l'application; d'ailleurs c'est ce que je fais dans mon message d'accueil pour souhaiter la bienvenue à l'utilisateur qd il se connecte à l'application.

Merci pour votre aide.

Hors ligne

#8 2011-04-13 15:54:34

Yann39
Membre
Inscription : 2011-03-28
Messages : 18

Re : Authentification APEX

Ah oui exacte, j'ai pas tilter sur le coup wink

Content que ton problème soit résolu.

à+

Hors ligne

Pied de page des forums