Blog!

Busqueda de información

Crear un esquema de autenticación personalizado en Oracle Application Express

Ratio: 3 / 5

Inicio activadoInicio activadoInicio activadoInicio desactivadoInicio desactivado
 

Oracle Apex (Application Express) es una herramienta de desarrollo ágil basada en el motor de base de datos de Oracle, esta herramienta permite realizar aplicaciones web y/o móviles de manera sencilla y rápida desde un navegador web. Sus plantillas y temas predefinidos nos permiten realizar un front-end con las tecnologías más recientes (como Html 5, CSS 3 y jQuey), sin necesidad de tener conocimientos amplios en ellas, lo que nos deja tiempo extra para ocuparnos del diseño de la base de datos y de la lógica de nuestra aplicación.

A pesar de las bondades que Apex nos ofrece, en algunas situaciones cuando los requerimientos nos lo solicitan, la tarea de desarrollar una aplicación se puede complicar, tal es el caso de crear una autenticación de usuarios a partir de una tabla en nuestra base de datos que contiene los registros de los usuarios autorizados para ingresar a la aplicación. Es por eso que en esta ocasión mostraremos el procedimiento para crear una autenticación de usuarios personalizada en Oracle Apex.

 

La Autenticación por default de Application Express se realiza por medio de las cuentas registradas para ingresar al espacio de trabajo de apex, con un sistema totalmente administrado por el mismo, esto acelera el proceso de desarrollo de una aplicación dejando la responsabilidad de las autenticaciones al motor de Apex; Sin embargo cuando requerimos controlar los aspectos de seguridad de las sesiones de nuestra aplicación, o cuando contamos con una tabla con el registro de nuestros usuarios, necesitamos crear un esquema de autenticación personalizado.

Creando una aplicación en Apex

Lo primero que debemos hacer es crear nuestra aplicación, por lo cual accederemos a nuestro espacio de trabajo y nos dirigiremos al “Creador de aplicaciones”, podremos acceder el por medio de la barra de herramientas o con el icono que se muestra en el dashboard de tareas rápidas. 

 

En el “Creador de aplicaciones” se nos listaran las aplicaciones que existen en nuestro espacio de trabajo y diversas opciones para el desarrollo, edición e importación de aplicaciones. Para crear una nueva aplicación daremos clic en el botón “Crear” el cual se encuentra resaltado en la imagen de abajo.

 

En el menú de creación de aplicaciones se nos listan 3 opciones principales:

· Base de datos: Este tipo de aplicaciones permiten un control total sobre el desarrollo de la aplicación y además permiten a los desarrolladores aprovechar al máximo sus conocimientos en programación SQL y PL/SQL

· Hoja de Cálculo Web: Estas aplicaciones web se centran en los datos y no requieren de tener conocimientos previos de programación en SQL. Son bastantes sencillas de crear.

· Aplicaciones Empaquetadas: estas son un set de aplicaciones precargadas que se instalan de manera sencilla y satisfacen necesidades básicas como creación de gráficas, creación y distribución de encuestas, etc. Estas aplicaciones no permiten ser modificadas

 

Para este ejemplo crearemos una aplicación de base de datos ya que necesitamos tener un control completo sobre el flujo y el desarrollo de la aplicación con el fin de poder manipular el método de autenticación.

  

Para crear la aplicación debemos de proporcionar el id de la aplicación, el cual sirve como identificador único de nuestra aplicación en el servidor y se recomienda dejar el que se genera automáticamente; un nombre, el cual es obligatorio; el esquema de base de datos en el cual estará basada nuestra aplicación;  la opción de creación, que se refiere a empezar a crear paginas desde el principio o comenzar con la página de inicio ya creada; y por último que interfaz de usuario requerimos, estas pueden ser de escritorio o móvil. Para este ejemplo los datos se especificaron como se muestra en la imagen de abajo.

Desde el “Creador de aplicaciones” podemos seleccionar otras opciones como las páginas que tendrá nuestra aplicación, sus componentes compartidos, algunos atributos y el tema, pero debido a que nos concentraremos por ahora en la autenticación de los usuarios daremos clic en “Crear Aplicación” para dar por finalizado el proceso de creación de la aplicación.

 

Antes de finalizar se nos mostrará un resumen de los datos con los cuales se creará nuestra aplicación en una pantalla similar a la que se muestra en la imagen de abajo. Para finalizar presionaremos el botón “Crear Aplicación”

 

Esto nos regresara a la ventana principal del creador de aplicaciones, esta vez mostrándonos nuestra aplicación recién creada.

Creando la tabla para almacenar usuarios

El motivo de explicar esta sección es el mostrar la facilidad con la cual podemos crear una tabla con la interfaz que nos ofrece Apex. La tabla que crearemos es muy sencilla pero servirá para los fines de mostrar cómo se puede crear un esquema de autenticación personalizado. 

Para crear una tabla dentro del esquema que seleccionamos para nuestra aplicación tendremos que dirigirnos a la página principal de nuestro espacio de trabajo y dar clic en el “Taller de SQL”, lo que nos llevará a una pantalla como la que se muestra a continuación.

 

Estando ahí nos dirigimos al “Explorador de Objetos”, el cual nos permite ver todos los objetos de bases de datos que existen dentro de nuestro esquema, tales como tablas, disparadores, procedimientos, secuencias, etc. Estando en el explorador de objetos daremos clic en “Crear”, se nos desplegará una lista de opciones en la cual seleccionaremos “Tabla” y seremos redirigidos al asistente para creación de tablas.

El asistente nos predirá toda la información que se requiere para crear la tabla, como el nombre, las columnas y los tipos de datos de las columnas. Para este ejemplo la tabla se llamara APPLICATION_USERS y constara de 2 columnas USERNAME de tipo VARCHAR2 y PASSWORD VARCHAR2, llenamos los datos como se nos solicita y damos clic en el botón “Siguiente”.

 

Paso a paso podremos seleccionar la llave primaria, las llaves foráneas y sus restricciones según nuestras necesidades. Al final se nos mostrará un resumen de los datos con los cuales se creara nuestra tabla, e incluso el script SQL que se ejecutara. Para finalizar daremos clic en el botón “Crear Tabla”.

 

Creando el paquete con las herramientas de autenticación

Para poder realizar nuestra autenticación de usuarios personalizada requeriremos de 2 funciones y un procedimiento en la base de datos, los cuales agruparemos en un paquete con las funciones y/o procedimientos de autenticación de usuarios al cual llamaremos pkg_autenticacion.

El paquete está conformado por el procedimiento p_registrar_usuario que recibe 2 parámetros de tipo VARCHAR2 siendo estos el usuario y la contraseña del usuario que deseamos registrar, en caso de que la tabla que se esté utilizando tenga más campos (lo cual es muy probable) aquí es donde se deben de agregar para realizar la inserción de nuestro registro a la tabla APPLICATION_USERS.

La función f_encriptar_pwd que recibe 2 parámetros de tipo VARCHAR2, los cuales son la contraseña y el usuario, este procedimiento se usa para encriptar la contraseña con un algoritmo no reversible y para hacerlo más seguro se hace uso de una cadena salt.

Y por último tenemos la función f_autoriza_usuario la cual se encarga de comparar los usuarios y contraseñas introducidos en la aplicación con el fin de autorizar o denegar los permisos sobre la aplicación. Esta función recibe el usuario y contraseña y hace uso de la función f_encriptar_pwd para validar la contraseña del usuario.

Para finalizar, nuestro paquete debería verse de manera similar al siguiente:

create or replace package pkg_autenticacion as

---

-- Definición de la función para encriptar la contraseña del usuario

---

    function f_encriptar_pwd (

        p_password in varchar2,

        p_username varchar2

    )

    return varchar2;

 

---

-- Definición de la función que autentica al usuario

---

    function f_autoriza_usuario (

        p_username VARCHAR2,

        p_password VARCHAR2

    )

    return BOOLEAN;

 

 

---

-- Definición del procedimiento para registrar un usuario en nuestra base de datos

---

    procedure p_registrar_usuario (

        p_username VARCHAR2,

        p_password VARCHAR2 );

end;

/

 

create or replace package body pkg_autenticacion as

---

-- Procedimiento para registrar un usuario

---

    procedure p_registrar_usuario(p_username IN VARCHAR2, p_password IN VARCHAR2)

      as

    begin

        insert into APPLICATION_USERS (username, password) values (upper(p_username), f_encriptar_pwd(p_password,p_username));

    end p_registrar_usuario;

 

 

---

-- Función que autentica a un usuario (tratar siempre la cadena p_username con la funcion upper)

---

    function f_autoriza_usuario(p_username IN VARCHAR2, p_password IN VARCHAR2)

      return BOOLEAN

    is

        registros number;

        pwd_en_bd varchar2(4000);

        pwd_encriptado varchar2(4000);

    begin

        SELECT count(*) into registros FROM application_users WHERE username = upper(p_username);

        IF registros > 0 THEN

            SELECT password into pwd_en_bd FROM application_users WHERE username = upper(p_username);

            pwd_encriptado := f_encriptar_pwd(p_password,p_username);

                IF pwd_encriptado = pwd_en_bd THEN

                    return true;

                ELSE

                    return false;

                end IF;

        ELSE

            return false;

        end IF;

    end f_autoriza_usuario;

 

---

-- Función que encripta la contraseña del usuario

---

    function f_encriptar_pwd(p_password IN VARCHAR2, p_username IN VARCHAR2)

      return VARCHAR2

    is

        salt varchar2(4000) := 'ISYmHMtSrjFmT2nEZUvEU5LA3jrV3i';

    begin

        return utl_raw.cast_to_raw(

            dbms_obfuscation_toolkit.md5(

                                     input_string => salt || p_password || upper(p_username)

            )

        );

    end f_encriptar_pwd;

end pkg_autenticacion;

Encriptando el paquete pkg_autenticacion

Ahora que tenemos nuestro paquete con todas las funciones necesarias para hacer nuestro esquema de autenticación personalizado necesitaremos subirlo y ejecutarlo al servidor donde se encuentra nuestra aplicación, para esto Oracle Apex nos otorga una herramienta para almacenar y ejecutar archivos de comandos SQL.

Pero antes de subirlo debemos pensar en la seguridad de nuestra aplicación y los riesgos que conlleva que alguien tenga acceso a los algoritmos que ocupamos para encriptar las contraseñas de los usuarios de nuestra aplicación, por lo que es muy recomendable encriptar el paquete que contiene dichas funcionalidades.

Para encriptar nuestro paquete haremos uso de la la utilidad Wrapper  que es un ejecutable que se encuentra en la ruta $ORACLE_HOME/bin y que permite ofuscar un archivo sql haciendo uso de su parámetro iname.

El primer paso para encriptar nuestro paquete será ejecutar el comando CMD en Windows, posteriormente dirigirnos a la ruta donde se encuentra el archivo sql que contiene la definición y el cuerpo de nuestro paquete, por ultimo ejecutar el comando wrap edebug=wrap_new_sql iname= pkg_autenticacion.sql  y esperar que la ejecución del comando termine.

Cuando contemos con nuestro archivo ofuscado, el cual tiene la extensión plb, podremos subirlo a nuestro servidor. Es importante resaltar que el archivo una vez que es ofuscado no se puede editar, por lo que se recomienda aplicar este procedimiento únicamente con archivos que estén listos para salir a producción, además de guardar una copia del archivo original para fines de mantenimientos futuros al sistema.

Para subir y ejecutar nuestro paquete haremos uso de la herramienta “Taller SQL” que Oracle Apex nos ofrece. Nos dirigimos al espacio de trabajo y seleccionamos la opción “Taller SQL”, estando ahí seleccionaremos la opción “Archivos de Comandos SQL”.

Estando en la pantalla principal de “Archivos de Comandos SQL” en su barra de herramientas haremos clic en el botón “Cargar”.

En la pantalla que se nos muestra proporcionaremos los datos que se nos solicitan y cargaremos nuestro archivo ofuscado, el que tiene extensión plb, y a continuación daremos clic en “Cargar”.

Al regresar a la pantalla principal de “Archivos de Comandos SQL” encontraremos nuestro archivo recién cargado, sin embargo al dar clic en el botón ejecutar y seguir los pasos para ejecutar el archivo de comandos nos encontraremos con un error en el cual se nos indica que el archivo esta corrupto, esto se deba probablemente a que se encuentra ofuscado, por lo que para poder ejecutar nuestro archivo encontré la solución de dar clic en el botón editar como se muestra en la imagen de abajo.

Cuando nos encontremos en la pantalla de edición, podremos observar como nuestro archivo es incomprensible, por lo cual nuestros algoritmos están seguros. Sin editarlo daremos clic en el botón ejecutar, esta vez la ejecución no deberá mostrar ningún error, nuestro paquete será creado y nuestras funciones y procedimientos deberán estar listos para ser usados.

Creando el esquema de autenticación personalizado

Ahora que tenemos nuestro paquete funcionando correctamente, es hora de crear nuestro esquema de autenticación personalizado para lo cual nos tenemos que dirigir a nuestro espacio de trabajo en el apartado “Creador de aplicaciones”  y estando ahí dar clic en el botón “Editar” que se encuentra en la parte inferior derecha del icono de nuestra aplicación.

Para cambiar el esquema de autenticación debemos dirigirnos a la sección “Componentes compartidos” a la cual accederemos por medio de su icono en el dashboard, o por medio del icono con forma de engrane en la barra de herramientas que se encuentra en la parte superior derecha.

Estando en la sección “Componentes Compartidos” nos dirigimos al apartado “Seguridad” y ahí encontraremos la opción “Esquemas de autenticación” a la cual deberemos ingresar.

Al ingresar nos encontraremos con el esquema de autenticación de ápex el cual podemos editar para hacer que sea un esquema personalizado que utilice la función f_autoriza_usuario que se encuentra en  nuestro paquete.

 

Al editar o crear el nuevo esquema debemos concentrarnos en los siguientes datos:

    · Nombre: Es el nombre que se le dará al esquema de autenticación, en ese caso se llamara “Esquema Personalizado”.

    · Tipo de esquema: es el tipo de esquema que se utiliza para autenticar a los usuarios, para este ejemplo usaremos el tipo “Personalizado”.

  · Nombre de Función de Autenticación: es el nombre de la función que se encargara de autenticar a nuestros usuarios, ya que nuestra función se encuentra en un paquete podremos la referencia completa a pkg_autenticacion.f_autoriza_usuario. 

     

Pruebas de autenticación en la aplicación

Ahora tenemos casi todo listo para realizar las pruebas de nuestro esquema personalizado, solo nos falta registrar un usuario en nuestra aplicación, para realizar esto haremos uso de nuestro procedimiento p_registrar_usuario.

 

Entraremos a nuestro espacio de trabajo en el apartado “Taller SQL”, seleccionaremos la opción Comandos SQL y en el área de texto que se nos proporciona ejecutaremos nuestro procedimiento de la siguiente manera:

begin
     pkg_autenticacion.p_registrar_usuario(<Usuario>,<Contraseña>);
end;

Donde <Usuario> y <Contraseña> son los parámetros de tipo varchar2 que recibe nuestro procedimiento.

 

Damos clic en el botón ejecutar, esperamos a que se nos indique que la sentencia fue procesada y tendremos nuestro usuario listo para realizar las pruebas, por lo que regresaremos al creador de aplicaciones y daremos clic en el botón “Ejecutar”.

Si no hemos editado la página 101 de nuestra aplicación se nos mostrara el login por default del tema que seleccionamos para nuestra aplicación en el cual introduciremos el usuario y contraseña que acabamos de insertar en la base de datos y daremos clic en el botón “Login” para comprobar que todo salió bien.

Si todo salió bien la aplicación debería ser redirigida a la página 1, la cual en este ejemplo es una página vacía con un encabezado que cuenta con el nombre del usuario y un botón para cerrar sesión.

Espero que esta información sea de ayuda para crear sus proyectos.

 Para más información escribir a asilva[at]baware.com.mx o a info[at]baware.com.mx

 

 

Log in