Ver Mensaje Individual
  #2 (permalink)  
Antiguo 05/12/2011, 22:25
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Respuesta: logearse con system desde oracle forms

Las contraseñas en dba_users.password están encriptadas, no se puede leer su valor o hacer comparaciones directas. No dices mucho sobre el objetivo del formulario, de todos modos te comento que existen dos modelos para la gestión de usuarios en las aplicaciones.

Por un lado, crear usuarios de base de datos, y según el tipo de aplicación, optar por:

1. No tener un proceso de validación, es decir, intentar una conexión directa con el usuario/contraseña del formulario, y si los datos son incorrectos, capturas el error ORA-01017: invalid username/password; logon denied para devolverlo como resultado por pantalla. Este caso es común en aplicaciones tipo herramientas de administración de base de datos como por ejemplo SQL Developer, SQL*Plus, etc.

2. Si tener un proceso de validación, esto es, hacer una conexión inicial con un usuario de base de datos (supongamos APPUSER) y a partir de ahí, validar los datos usuario/contraseña del formulario con un procedimiento casero (como ejemplo tienes la función validar_pass). Este caso es para aplicaciones con perfiles de seguridad pero que delegan la gestión a la base de datos, es una solución poco eficiente y además ya no se usa.

Código:
create or replace function validar_pass
 (usuario in varchar2, contrasena in varchar2)
return boolean
is
 temp_pass1 varchar2(1000);
 temp_pass2 varchar2(1000);
begin
 --lee la actual contraseña encriptada
 select password 
   into temp_pass1
 from dba_users
 where username = upper(usuario);

 --cambia la contraseña con el valor del parametro contrasena
 execute immediate 
    'alter user ' || usuario || ' identified by ' || contrasena;
 
 --lee la nueva contraseña encriptada 
 select password 
   into temp_pass2
 from dba_users
 where username = upper(usuario);

 --reestablece la contraseña al valor original
 execute immediate 
    'alter user ' || usuario || ' identified by values ' || 
        chr(39) || temp_pass1 || chr(39);
 
 --devuelve true si la dos contraseñas encriptadas son iguales
 return temp_pass1 = temp_pass2;
end;
/
Por otro lado, crear tu propia gestión de seguridad, es decir, hacer todas las conexiones con un único usuario de base de datos (APPUSER), y tener los usuarios de la aplicación como registros de una tabla donde puedes encriptar las contraseñas con el paquete DBMS_OBFUSCATION_TOOLKIT, en este modelo, para validar los datos usuario/contraseña del formulario solo tienes que hacer un SELECT sobre la tabla de usuarios y comparar la contraseña con las funciones DESDECRYPT y DESDECRYPT. Esta solución es la más recomendada.

Saludos