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.

Árbol LDAP
Imagen tomada de https://www.openldap.org/doc/admin22/intro.html

 

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

Descargar la aplicación

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]

3 comments on “Login con LDAP – Función PL/SQL

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

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.