Настройка доменной аутентификации в Oracle Application Express

Шаг 1.

ВАЖНО. Для выполнения первых трех шагов потребуются права sys.

Все нижеперечисленные скрипты необходимо выполнять в любом удобном вам редакторе (sql developer, sql navigator, toad, да хоть в sqlplus для самых смелых).

 

Для начала создаем принципала (по сути ораклового пользователя)

CREATE USER apex_ldap_auth IDENTIFIED BY <password>;

И сразу его лочим, ибо нефиг :)

ALTER USER apex_ldap_auth ACCOUNT LOCK;

 

Шаг 2.

Создаем ACL и подписываем его.

BEGIN

  DBMS_NETWORK_ACL_ADMIN.create_acl (

    acl          => '<acl_file_name>.xml',

    description  => 'ACL to grant access to LDAP server',

    principal    => 'APEX_LDAP_AUTH',

    is_grant     => TRUE,

    privilege    => 'connect',

    start_date   => SYSTIMESTAMP,

    end_date     => NULL);

 

  DBMS_NETWORK_ACL_ADMIN.assign_acl (

    acl         => '<acl_file_name>.xml', --указываем имя acl созданного выше

    host        => 'ldap.<sample>.ru', --Здесь необходимо указать ваш контроллер домена

    lower_port  => 389, --порт по умолчанию для ldap, для ldaps это как правило 636

    upper_port  => NULL);

   COMMIT;

END;

  

Шаг 3.

Приступаем непосредственно к подготовке пакета

create or replace package apex_ldap_auth.pack_apex_ldap_auth as

  function ldap_auth(p_username in varchar2, p_password in varchar2) return boolean;

end pack_apex_ldap_auth;

 

create or replace package body apex_ldap_auth.pack_apex_ldap_auth is

 

    FUNCTION ldap_auth(

      p_username IN VARCHAR2,

      p_password IN VARCHAR2

    )

    RETURN BOOLEAN IS

      l_ldap_host     VARCHAR2(256) := ' ldap.<sample>.ru';

      l_ldap_port     VARCHAR2(256) := '389';

      l_ldap_base     VARCHAR2(256) := 'dc=<SAMPLE>,dc=ru'; --base DN можете уточнить у своих системных администраторов.

      l_dn_prefix     VARCHAR2(100) := '<domain_prefix>\'; -- здесь указываем префикс домена. Т.е. пользователю будет достаточно указать только логин.

 

      l_retval        PLS_INTEGER;

      l_session       DBMS_LDAP.session;

 

    BEGIN

      -- Choose to raise exceptions.

      DBMS_LDAP.use_exception := TRUE;

 

      -- Connect to the LDAP server.

      l_session := DBMS_LDAP.init(hostname => l_ldap_host,

                                  portnum  => l_ldap_port);

 

      l_retval := DBMS_LDAP.simple_bind_s(ld     => l_session,

                                          dn     => l_dn_prefix || p_username,

                                          passwd => p_password);

 

      -- No exceptions mean you are authenticated.

      RETURN TRUE;

    EXCEPTION

      WHEN OTHERS THEN

        -- Exception means authentication failed.

        l_retval := DBMS_LDAP.unbind_s(ld => l_session);

 

        APEX_UTIL.set_custom_auth_status(p_status => 'Incorrect username and/or password');

        RETURN FALSE;

    END ldap_auth;

 

end pack_apex_ldap_auth;

 

ну и раздаем гранты целевой схеме

GRANT EXECUTE ON apex_ldap_auth.pack_apex_ldap_auth TO <schema_name>;

 

Шаг 4.

Приступаем непосредственно к настройке апексового приложения.

Переходимо в наше приложение / Shared Components / Authentication Schemes

Здесь создаем схему аутентификации.

Название - произвольное

Тип схемы – «Custom»

Далее указываем функцию из созданного пакета.

Все, с этого момента достаточно указывать доменный логин (без префикса/постфикса домена) и пароль соответственно.

Очень полезная ссылка по данному варианту настройки доменной авторизации.

https://oracle-base.com/articles/misc/oracle-application-express-apex-ldap-authentication

 

Есть еще и «Коробочное» решение для насnройки ldap.

Путь прежний – ваше приложение / shared components / authentication schemes

Далее выбираем тип «LDAP Directory»

 

Другие статьи на тему APEX: