Простите за наивность, но я борюсь с этой проблемой уже несколько часов без прогресса, и я не понимаю, что мне не хватает. Я новичок в 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, инициирующий процедуру проверки, где он ищет мой метод?
Любая помощь очень ценится, и я надеюсь, что у меня достаточно подробностей, чтобы понять мою проблему.
Огромное спасибо