#oracle #oracle-apex #oracle-apex-5 #oracle-apex-5.1
#Oracle #oracle-apex #oracle-apex-5 #oracle-apex-5.1
Вопрос:
Я хочу добавить еще один параметр на страницу входа, который возвращает team_id, но я не могу аутентифицировать пользователя. Приведенная ниже функция является функцией по умолчанию из схем аутентификации Oracle Apex, где я добавил p_team в качестве параметра in.
function my_authentication (
p_username in varchar2,
p_password in varchar2,
p_team in varchar2
)
return boolean
is
l_user ncr_emp.qlid%type := upper(p_username);
l_pwd ncr_emp.pass%type;
l_team ncr_emp.team_id%type;
begin
select qlid , pass , team_id
into l_user, l_pwd, l_team
from ncr_emp
where upper(qlid) = upper(l_user) and upper(pass)=upper(p_password)
and upper(team_id) = upper(l_team);
return true;
exception
when NO_DATA_FOUND then return false;
end;
И при вызове функции ниже отображается ошибка:
apex_authentication.login(
p_username => :P9999_USERNAME,
p_password => :P9999_PASSWORD,
p_team => :P9999_TEAM
);
Ошибка:
ORA-06550: строка 1, столбец 64: PLS-00306: неправильное количество или типы аргументов в вызове «LOGIN»
Комментарии:
1. Для этого требуется предопределенная подпись, которую нельзя изменить. Я также серьезно сомневаюсь в вашем использовании upper (pass)
2.
This requires a predefined signature that cannot change.
=> Есть ли какое-либо решение для проверки по трем параметрам?I also severely question your use of upper(pass)
=> Если вы спрашиваете, почему я использую upper (pass), то это не окончательный код, окончательная аутентификация будет учитываться регистр.3. @Scott Что, если я создам свой собственный API для входа в систему, хорошо ли это звучит?
Ответ №1:
Используйте свою пользовательскую функцию аутентификации здесь:
Общие компоненты / Схемы аутентификации / (Выберите текущую) / настройки / Название функции аутентификации
И оставляем в покое обычный код apex. Обратите внимание, что ваша пользовательская функция аутентификации должна возвращать логическое значение (true или false).
Ответ №2:
Если вы определяете схему аутентификации типа scheme ‘Custom’, вы заметите следующее во встроенной справке по названию функции аутентификации.
Эта функция должна возвращать логическое значение процедуре входа, которая ее вызывает. Он имеет 2 входных параметра ‘p_username’ и ‘p_password’, которые могут использоваться для доступа к значениям, введенным конечным пользователем на странице входа.
Проверка подлинности apex_authentication.определение входа не соответствует вашей попытке — вы не вызывали свою собственную функцию.
Действительно ли модель безопасности должна принимать ‘team’? Это жизненно важно для установления личности или что-то, что может быть назначено после входа в систему?
Что касается upper(pass)
, хотя это может быть и не «окончательный код», это показывает, что вы начинаете с самого начала — пароли с открытым текстом не должны даже попадать в черновик, ИМХО.