Схемы аутентификации Oracle Apex при входе

FUNCTION authenticate(p_username IN VARCHAR2,p_password IN VARCHAR2) RETURN 
BOOLEAN 
is
l_count integer;
begin
select count(*)
into   l_count
from   STUDENT, ADMIN, ORGANISATION
WHERE upper(Student.STUDENT_ID, ADMIN.ADMIN_ID, ORGANISATION.ORG_ID) = 
upper(p_username)
AND upper(Student.STUDENT_PASSWORD, ADMIN.ADMIN_PASSWORD, 
ORGANISATION.ORG_PASSWORD) = upper(p_password);
return (l_count > 0);
end;

выше код аутентификации, который я сделал, чтобы получить информацию из нескольких таблиц и использовать их для аутентификации входа в систему. если я просто делаю это для студентов, это работает нормально, но мне нужно иметь несколько типов пользователей, чтобы иметь возможность доступа к программному обеспечению, и я не могу запустить несколько схем аутентификации одновременно, все имена таблиц и столбцов верны ниже, это ошибка, которую я получаю ORA-06550: строка 9, столбец 7: PL/SQL: ORA-00909: недопустимое количество аргументов ORA-06550: строка 6, столбец 1: PL/SQL: оператор SQL игнорируется

3 ответа

Решение

Неверный синтаксис. Пытаться

select count(*) 
into l_count
from student,
     admin,
     organisation
where upper(p_username) in (upper(student.student_id),
                            upper(admin.admin_id),
                            upper(organisation.org_id)
                           )
  and upper(p_password) in (upper(student.student_password),
                            upper(admin.admin_password),
                            upper(organisation.org_password)
                           );

Я хотел бы попытаться сломать это, и решить проблему. Есть несколько вещей для решения.

логика

Как вы собираетесь контролировать уникальность по всем столам? Может быть АЛЬБЕРТ как у студентов, так и у администрации. Это может быть даже тот же человек, студент и сотрудник учреждения. Я был таким человеком.

Предлагаемый SQL

Нет никаких объединений между вашими таблицами, это превратит результат в продукт для карт, и я уверен, что вы могли бы вернуть true для входа в ALBERT с паролем NIKOLA.

Я думаю, что вы, вероятно, хотели использовать оператор множества

select ...
from student 
where ...
union all
select ...
from admin
where ...

UNION ALL означает, что нет необходимости проверять уникальность, нет необходимости в дополнительной сортировке.

Защита паролем

Чтобы иметь возможность ВЕРНУТЬ пароль, вы храните его открытым текстом. Люди сегодня должны унаследовать достаточно беглости, чтобы пароли не хранились в виде открытого текста. Когда-либо.

В этой статье приведен пример настройки пользовательской аутентификации в APEX с помощью хеширования паролей. Редкий среди разочаровывающего числа, которое не хэширует пароли. Этот также хэшируется с именем пользователя и солью, что лучше. http://barrybrierley.blogspot.com.au/2015/05/custom-authentication-in-apex.html

Это также начинает покрывать ваши потребности относительно типа пользователя.

Я уверен, что в документации APEX был пример, но я не смог его найти.

Тип пользователя - Авторизация

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

Для более гибкой системы я хотел бы дополнительно абстрагироваться и использовать схемы авторизации для управления привилегиями для определенных компонентов, а также распределять их по бизнес-ролям, которые, в свою очередь, предоставляются пользователям.

Это служит вашим "множественным типам людей".

Проверка "Запись существует"

С самого начала я узнал кое-что в AskTom относительно проверки на наличие строк, которая, кажется, хорошо работает во всех версиях

declare
  ln_exists pls_integer;
begin
  select count(*)
  into ln_exists
  from dual
  where exists (
     select null 
     from your_table -- whatever you're looking for
     where id = p_id
  );
  return ln_exists = 1; -- true if exists
 end;

Oracle знает, как потратить минимум усилий на решение этой проблемы.

Многие другие варианты просто выбирают слишком много строк из базы данных.

Общие приложения

Вы можете фактически определить несколько точек входа, используя разные аутентификации для одного и того же приложения. http://www.grassroots-oracle.com/2014/04/shared-authentication-across-multiple-apex-apps.html

With valid_student as (
select count(*) as student_result 
from student 
where upper (p_username) = upper(student_id)
And upper(p_password) = upper(student_password)
),
valid_Admin as (
select count(*) as admin_result 
from admin
where upper (p_username) = upper(admin_id)
And upper(p_password) = upper(admin_password)
),
valid_org as (
select count(*) as org_result 
from organisation 
where upper (p_username) = upper(org_id)
And upper(p_password) = upper(org_password)
)
Select “Valid” as access_allowed
From valid_student s, valid_admin a, valid_org o
 Where s.student_result = 1 or a.admin_result = 1 or o.org_result = 1
Другие вопросы по тегам