Crear una aplicación y configurar el login
En este post vamos a crear un login custom para una aplicación apex usando una tabla para almacenar a los usuarios y otra para roles.
El objetivo es no usar los usuarios que APEX nos da por default y poder usar nuestros propios objetos, hacer las validaciones que necesitemos, así le podemos permitir al usuario final tener el control de todos los usuarios.
Esta es una alternativa al post que hice donde usamos LDAP para loguearse.
Parte 1
Parte 2
apex_rol id num nombre vc(255) descripcion vc(255) # auditcols: true apex_usuario id usuario vc(255) email vc(255) password vc(255) roles vc(255) # auditcols: true
-- create tables create table apex_rol ( id number not null constraint apex_rol_id_pk primary key, nombre varchar2(255), descripcion varchar2(255), created date not null, created_by varchar2(255) not null, updated date not null, updated_by varchar2(255) not null ) ; create table apex_usuario ( id number not null constraint apex_usuario_id_pk primary key, usuario varchar2(255), email varchar2(255), password varchar2(255), roles varchar2(255), created date not null, created_by varchar2(255) not null, updated date not null, updated_by varchar2(255) not null ) ; -- triggers create or replace trigger apex_rol_biu before insert or update on apex_rol for each row begin if :new.id is null then :new.id := to_number(sys_guid(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); end if; if inserting then :new.created := sysdate; :new.created_by := NVL(v('APP_USER'), USER); end if; :new.updated := sysdate; :new.updated_by := NVL(v('APP_USER'), USER); end apex_rol_biu; / create or replace trigger apex_usuario_biu before insert or update on apex_usuario for each row begin if :new.id is null then :new.id := to_number(sys_guid(), 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'); end if; if inserting then :new.created := sysdate; :new.created_by := NVL(v('APP_USER'), USER); end if; :new.updated := sysdate; :new.updated_by := NVL(v('APP_USER'), USER); end apex_usuario_biu; /
create or replace PACKAGE toolkit AS FUNCTION encrypt (p_text IN VARCHAR2) RETURN RAW; FUNCTION decrypt (p_raw IN RAW) RETURN VARCHAR2; FUNCTION F_LOGIN (p_username IN VARCHAR2, p_password VARCHAR2) RETURN BOOLEAN; END toolkit;
create or replace PACKAGE BODY toolkit AS g_key RAW(32767) := UTL_RAW.cast_to_raw('12345678'); g_pad_chr VARCHAR2(1) := '~'; PROCEDURE padstring (p_text IN OUT VARCHAR2); -- -------------------------------------------------- FUNCTION encrypt (p_text IN VARCHAR2) RETURN RAW IS -- -------------------------------------------------- l_text VARCHAR2(32767) := p_text; l_encrypted RAW(32767); BEGIN padstring(l_text); DBMS_OBFUSCATION_TOOLKIT.desencrypt(input => UTL_RAW.cast_to_raw(l_text), key => g_key, encrypted_data => l_encrypted); RETURN l_encrypted; END; -- -------------------------------------------------- -- -------------------------------------------------- FUNCTION decrypt (p_raw IN RAW) RETURN VARCHAR2 IS -- -------------------------------------------------- l_decrypted VARCHAR2(32767); BEGIN DBMS_OBFUSCATION_TOOLKIT.desdecrypt(input => p_raw, key => g_key, decrypted_data => l_decrypted); RETURN RTrim(UTL_RAW.cast_to_varchar2(l_decrypted), g_pad_chr); END; -- -------------------------------------------------- -- -------------------------------------------------- FUNCTION F_LOGIN (p_username IN VARCHAR2, p_password VARCHAR2) RETURN BOOLEAN IS l_return number; l_usuario apex_usuario.usuario%type; l_password apex_usuario.password%type; begin begin select usuario,password into l_usuario, l_password from apex_usuario where usuario = UPPER(p_username); if toolkit.encrypt(p_password) = l_password and l_usuario = p_username then return true; else return false; end if; exception when no_data_found then return false; end; END; -- -------------------------------------------------- -- -------------------------------------------------- PROCEDURE padstring (p_text IN OUT VARCHAR2) IS -- -------------------------------------------------- l_units NUMBER; BEGIN IF LENGTH(p_text) MOD 8 > 0 THEN l_units := TRUNC(LENGTH(p_text)/8) + 1; p_text := RPAD(p_text, l_units * 8, g_pad_chr); END IF; END; -- -------------------------------------------------- END toolkit;
Documentación:
https://oracle-base.com/articles/8i/data-encryption
https://apex.oracle.com/en/quicksql/
Post sugerido:
Por favor si te sirvió el vídeo, invítame un café dando clic a los anuncios, me ayuda muchísimo para no dormir y poder hacer más posts
Hola! Visto que DBMS_OBFUSCATION_TOOLKIT ya no se encuentra soportada en nuevas versiones de Oracle, tendrías algo funcionando pero con la funcion que lo reemplaza DBMS_CRYPTO?
Saludos!
Hola, buenas noches
Porque solo me funciona con usuarios en número y clave numerica? estoy utilizando apex 20.2
Hola , me parecio genial el video. Pero una cosilla, podrias compartir la aplicacion para poder replicar los pasos que has seguido en el video? y asi poder crearme mi propia aplicacion?Un saludo y un fuerte abrazo.pd: a tu mensaje “i nvítame un café dando clic a los anuncios” no veo ningun anuncio 🙁
Hola amigo no entiendo por que arroja un error en el sintaxis del paquete de la funcion al compilarCompilation failed,line 41 (04:35:09)PLS-00201: identifier ‘APEX_USUARIO.USUARIO’ must be declaredCompilation failed,line 41 (04:35:09)PL/SQL: Item ignoredCompilation failed,line 42 (04:35:09)PLS-00201: identifier ‘APEX_USUARIO.PASSWORD’ must be declaredCompilation failed,line 42 (04:35:09)PL/SQL: Item ignoredCompilation failed,line 45 (04:35:09)PL/SQL: ORA-00942: table or view does not existCompilation failed,line 45 (04:35:09)PL/SQL: SQL Statement ignoredCompilation failed,line 47 (04:35:09)PLS-00320: the declaration of the type of this expression is incomplete or malformedCompilation failed,line 47 (04:35:09)PL/SQL: Statement ignored
Hola Quique, tendras un ejemplo de single sign on (SSO) con Apex para una empresa con sistemas en Developer Oracle 12c…
Saludos.