En este post vamos a ver como realizar autenticación con LDAP, de esta manera agregar más seguridad a nuestras aplicaciones.
¿Qué es LDAP?
Este metodo provee autenticación de usuarios desde un servidor externo. Si un usuario y password son válidos, es decir existen dentro del directorio, se creará una sesión nueva, permitiendo tener centralizada la información de usuarios en nuestra aplicación de forma más segura.
Hay que imaginarse el directorio como un árbol ya que en el cual podemos encontrar diferentes tipos de categorias como son:
- Información de forma jerárquica y categorizada
- Puede incluir nombres
- Directorios
- Números telefónicos
- Usuarios
- Equipos de computo registrados en el dominio
LDAP Test Server usado en el vídeo
Código para la creación de ACL
-- Run as sysdba DECLARE l_acl VARCHAR2(100) := 'ldapacl.xml'; l_desc VARCHAR2(100) := 'LDAP Authentication for ldap.forumsys.com'; l_principal VARCHAR2(30) := 'APEX-DEVELOPERS'; -- upper case l_host VARCHAR2(100) := 'ldap.forumsys.com'; BEGIN -- Create the new ACL. -- Also, provide one starter privilege, granting the schema the privilege to connect. dbms_network_acl_admin.create_acl(l_acl, l_desc, l_principal, TRUE, 'connect'); -- Now grant privilege to resolve DNS names. dbms_network_acl_admin.add_privilege(l_acl, l_principal, TRUE, 'resolve'); -- Specify which hosts this ACL applies to. dbms_network_acl_admin.assign_acl(l_acl, l_host); COMMIT; END;
Función de login
create or replace function ldap( p_username in varchar2, p_password in varchar2) return boolean is l_retval PLS_INTEGER; l_retval2 PLS_INTEGER; l_session dbms_ldap.session; l_ldap_host VARCHAR2(256); l_ldap_port VARCHAR2(256); l_ldap_user VARCHAR2(256); l_ldap_base VARCHAR2(256); BEGIN l_retval := -1; dbms_ldap.use_exception := TRUE; l_ldap_host := 'ldap.forumsys.com'; l_ldap_port := '389'; l_ldap_user := 'uid='||p_username||',dc=example,dc=com'; l_session := dbms_ldap.init(l_ldap_host, l_ldap_port); l_retval := dbms_ldap.simple_bind_s(l_session,l_ldap_user,p_password); RETURN TRUE; dbms_output.put_line('Return value: ' || l_retval); l_retval2 := dbms_ldap.unbind_s(l_session); EXCEPTION WHEN OTHERS THEN RETURN FALSE; dbms_output.put_line(rpad('ldap session ', 25, ' ') || ': ' || rawtohex(substr(l_session, 1, 8)) || '(returned from init)'); dbms_output.put_line('error: ' || SQLERRM || ' ' || SQLCODE); dbms_output.put_line('user: ' || l_ldap_user); dbms_output.put_line('host: ' || l_ldap_host); dbms_output.put_line('port: ' || l_ldap_port); l_retval := dbms_ldap.unbind_s(l_session); END;
[kkstarratings]
Quiero de antemano agradecerle su tiempo y disposición para compartir su conocimiento con todos los que incursionamos en este cuento de Oracle Apex.
He seguido su tutorial de Apex; actualmente tengo instalada la versión 20 de apex y el Oracle 18c XE.
Le escribo no solo para agradecerle sino también para hacerle una pregunta puntual:
Logré configurar el Apex para que logueara por el controlador de dominio, sin embargo en el LDAP que tengo hay varios grupos configurados y sólo me interesa que los usuarios de uno de esos grupos sean los que tengan acceso a mi aplicación. Cómo puedo lograrlo?
Quedo atento; muchas gracias.