En este laboratorio aprenderás como autenticar un usuario por medio de una tabla en Oracle Apex y además de ello como asignarle al usuario diferentes tipos de roles usando diferentes schemas de autorización.
El concepto que debemos entender esque el schema de autenticación lo que hace es preguntar quién es el usuario que ingresa al aplicativo y si tiene acceso, mientras que el schema de autorización pregunta que tiene permitido hacer cuando acceda, de esta forma dependiendo las validaciones que queramos hacer, unas se harán en el schema de autenticación y otras en el schema de autorización.
Lo primero que haremos será crear 3 tablas con los siguientes campos:
Tabla 1: LAB_USER
Campos:
- ID_USER – NUMBER(10,0) – IDENTITY – PRIMARY KEY
- USERNAME – VARCHAR2(50) – UNIQUE
- PASSWORD – VARCHAR2(50)

Tabla 2: LAB_ROL
Campos:
- ID_ROL – NUMBER(10,0) – IDENTITY – PRIMARY KEY
- NOMBRE – VARCHAR2(50) – UNIQUE

Tabla 3: LAB_USER_ROL
Campos:
- ID_USER_ROL – NUMBER(10,0) – IDENTITY – PRIMARY KEY
- ID_USER – NUMBER(10,0) – Foreign Key with LAB_USER.ID_USER
- ID_ROL – NUMBER(10,0) – Foreign Key with LAB_ROL.ID_ROL

Authentication Scheme
Ahora debemos crear nuestro proceso de autenticación de usuarios, para ello es necesario crear la function que realizará esta validación, primero procederemos a crear una aplicación nueva en blanco, iremos al apartado Shared Components en la aplicación, y en Security veremos la opción Authentication Schema, ingresamos:


Le llamaremos: Login_Authentication y debemos específicar como Custom el Scheme Type:

En Authentication Function Name le colocaremos el nombre de la funcion que crearemos, en este caso se llama login y usaremos la siguiente function para realizar la validación del usuario, este se coloca en la sección PL/SQL code:
FUNCTION login (p_username IN VARCHAR2, p_password IN VARCHAR2) RETURN BOOLEAN AS validacion NUMBER := 0; BEGIN SELECT 1 INTO validacion FROM LAB_USER WHERE UPPER(USERNAME) = UPPER(p_username) AND PASSWORD = p_password; RETURN TRUE; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN FALSE; END login;

Y lo guardamos presionando Create Authentication Scheme.
Ahora debemos ingresar a las propiedades de la aplicación:

Iremos a Security > Authentication y en Authentication Schema elegiremos el que acabamos de crear llamado Login_Authentication:

Authorization Scheme
Ahora antes de probar el acceso crearemos un schema de Autorización, para ello debemos ingresar a la sección de Autorization schema y presionar create:

Primero crearemos un schema de autorización para que cualquier usuario pueda ingresar al home page que es la página de bienvenida, luego de ahí modificaremos el acceso a las diferentes aplicaciones:

Ahora le colocaremos el nombre Home-Page, en Scheme Type le colocaremos PL/SQL Function Returning Boolean, en Identity error message displayed when colocaremos un mensaje en caso de que la function retorne un false, y para la function usaremos la siguiente:
declare result number(10.0); user number(10,0); begin select ID_USER into user from LAB_USER where upper(:app_user) = upper(USERNAME); select ID_USER_ROL into result from LAB_USER_ROL where upper(user) = ID_USER and ID_ROL = 1; /*Este es el id del rol que asignamos en nuestra tabla LAB_ROL, en este caso 1 ya que más adelante colocamos 1 como el id del rol Home*/ return true; EXCEPTION WHEN NO_DATA_FOUND THEN return false; end;

Presionamos Create Authorization Scheme para guardarlo.
Ahora por último debemos asignarle el permiso de autorización a la página Home, esto lo haremos de la siguiente manera, vamos a Navigation Menu en Shared Components:

Ingresamos a nuestro Home page y le colocaremos en Authorization schema el nuevo schema Home – Page creado:

Aplicamos los cambios y ahora insertaremos unos usuarios y algún par de roles a las tablas inicialmente creadas, para ello creamos una aplicación por aparte donde administraremos este acceso, únicamente hace el CRUD hacía las tablas creadas:



Luego de haber insertado los datos, probamos el acceso a la aplicación:

Y verificamos que podamos ver el home page:

Ahora bien, para las demás secciones de la página se debe seguir el mismo procedimiento, cada vez que se cree una página, se le debe asignar un schema de autorización para limitar el acceso únicamente a los usuarios con el rol específicado, y en cada función de plsql del schema de autorización se debe asignar el número del id generado por cada rol.
Por último, hay algunas mejoras que se podrían implementar como que antes de guardar la contraseña del usuario, se encripte y así evitar que se vea en el reporte, queda a nuestra creatividad.
Hola amigo. Muchas gracias por el tutorial, me sirvió muchísimo. Soy nuevo en esto de Apex.
Mi consulta es la siguiente: como puedo colocar una autenticación de Google en mi aplicación y que conviva con este login propio a la vez? Si coloco la de Google se desactiva esta y viceversa. Muchas gracias
Hola José,
Si desea utilizar múltiples tipos de autenticación, lo que debe hacer es ingresar a los schemas de autenticación que desea usar como alternativas, no al actual que tiene configurado la aplicación en sus propiedades, sino a los otros que vaya a usar, ejemplo, si en mi aplicación tengo configurado por default Login_Authentication, entonces debo hacer el siguiente cambio a los schema de Google y Facebook, dentro del schema Google y Facebook debe ir a la sección Login Processing, buscar el campo llamado Switch in Session y habilitarlo, esto le permitirá habilitar los schemas para utilizarlos como tipos de autenticación alternativas, luego en la pantalla de login deberá configurar los botones para que llamen un URL, ya sea dependiendo si el usuario elige autenticación con google o con facebook, al URL que coloque, deberá pasarle un parámetro con el tipo de autenticación que desea aplicar según su solicitud, ejemplo: el nombre de mi schema de autenticación es este post es Login_Authentication, entonces si tiene un schema de autenticación que se llama Google deberá enviar el nombre del schema, utilizando la variable APEX_AUTHENTICATION en el url de la siguiente manera:
Google:
https://apex.oracle.com/pls/apex/f?p=100:2:0:APEX_AUTHENTICATION=Google
Facebook:
https://apex.oracle.com/pls/apex/f?p=100:2:0:APEX_AUTHENTICATION=Facebook
Así dependiendo la selección del usuario, podrá cambiar el método de autenticación y el botón default del login lo puede dejar con la autenticación por usuario y contraseña.
Buenas.
Sabés si existe, y como se hace, para utilizar mas o menos el mismo procedimiento pero con el esquema propio de Autenticación de Application Express?
Gracias de antemano!
Saludos.-