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:

Curso Gratuito de Oracle Apex

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 😎

6 comments on “Crear una aplicación y configurar el login Vídeo 6 Parte 1 y 2

  1. 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!

  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 🙁

  3. 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

  4. Hola Quique, tendras un ejemplo de single sign on (SSO) con Apex para una empresa con sistemas en Developer Oracle 12c…

    Saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.