Ошибка пользовательской аутентификации Oracle Apex - MY_AUTHENTICATION НЕ ЯВЛЯЕТСЯ ПРОЦЕДУРОЙ

Простите за наивность, но я борюсь с этой проблемой уже несколько часов без прогресса, и я не понимаю, что мне не хватает. Я новичок в Oracle и все еще разбираюсь со многими настраиваемыми функциями.

Я пытаюсь написать функцию (следуя рекомендациям по интерфейсу APEX), касающуюся проверки учетных данных для входа с использованием пользовательской схемы аутентификации для моего приложения.

В рекомендациях говорится:

Укажите имя функции, которая будет проверять имя пользователя и пароль после того, как они были введены на странице входа. Если вы ничего не вводите, вы позволяете успешно использовать любое имя пользователя / пароль. Сама функция может быть определена в текстовой области аутентификации «Код PL / SQL», внутри пакета или как сохраненная функция. Эта функция должна возвращать логическое значение вызывающей ее процедуре входа. Он имеет 2 входных параметра «p_username» и «p_password», которые могут использоваться для доступа к значениям, введенным конечным пользователем на странице входа. Примеры Введите следующий код в текстовое поле «Код PL / SQL».

function my_authentication (
    p_username in varchar2,
    p_password in varchar2 )
    return boolean
is
    l_user my_users.user_name%type := upper(p_username);
    l_pwd  my_users.password%type;
    l_id   my_users.id%type;
begin
    select id  , password
      into l_id, l_pwd
      from my_users
     where user_name = l_user;

    return l_pwd = rawtohex(sys.dbms_crypto.hash (
                       sys.utl_raw.cast_to_raw(p_password||l_id||l_user),
                       sys.dbms_crypto.hash_sh512 ));
exception
    when NO_DATA_FOUND then return false;
end;

и my_authentication как Authentication Function.

Функция, которую я написал, даже не такая сложная, поскольку в настоящее время я не шифрую pwd и т. Д., Чтобы попытаться просто заставить эту вещь работать

function my_authentication (p_username in varchar2,p_password in varchar2 )
    return boolean
is
    valid NUMBER;
    returnvalid BOOLEAN;
begin
    begin
        select 1
        into valid
        from users u
        where u.sys_user.login = lower(p_username) AND u.sys_user.password = p_password;    
    exception
        when NO_DATA_FOUND then valid := 0;
    end;
    returnvalid := valid=1;
    RETURN returnvalid;
end;

Чтобы уточнить, таблица пользователей состоит из 3 полей, и одно, в котором хранятся данные, которые я хочу проверить, - это sys_user (это тип объекта с 5 полями: id, fname, lname, login, password).

Когда я устанавливаю имя функции аутентификации на my_authentication и пытаюсь войти в систему, я получаю следующую ошибку:

ORA-06550: line 1, column 7: PLS-00221: 'MY_AUTHENTICATION' is not a procedure or is undefined 
ORA-06550: line 1, column 7: PL/SQL: Statement ignored

Я предполагаю, что это исходит от того, где я изменил

apex_authentication.login(    
    p_username => :P101_USERNAME,
    p_password => :P101_PASSWORD
);

to

my_authentication(
    p_username => :P101_USERNAME,
    p_password => :P101_PASSWORD
);

под _15 _-> _ 16 _-> _ 17 _-> _ 18_ интерфейса Apex. Что я тоже не могу найти, так это то, почему он запрашивает процедуру, когда страница конфигурации настраиваемой схемы аутентификации явно запрашивает функцию, возвращающую логическое значение, которое я создал. Я знаю, что в нем говорится, что его вызовет процедура входа в систему, но я предположил, что это интерфейс APEX, инициирующий процедуру проверки, где он ищет мой метод?

Любая помощь очень ценится, и я надеюсь, что у меня достаточно подробностей, чтобы понять мою проблему.

Огромное спасибо


person JohnP-2879    schedule 07.04.2015    source источник


Ответы (1)


Вы не должны были менять код процесса страницы, он должен оставаться таким:

apex_authentication.login(    
    p_username => :P101_USERNAME,
    p_password => :P101_PASSWORD
);

Это выполняет некоторую логику, которая включает динамическое выполнение функции аутентификации, указанной в схеме аутентификации.

person Tony Andrews    schedule 07.04.2015
comment
Спасибо, Тони. Я изменил его ранее, и он все еще не входил в систему, но срок моего сеанса истек, и я только что снова изменил его, и теперь он работает отлично - person JohnP-2879; 07.04.2015