Схемы аутентификации Oracle Apex при входе в систему - PullRequest
0 голосов
/ 26 мая 2018
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 ]

0 голосов
/ 28 мая 2018

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

Логика

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

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

Нет никаких объединений между вашими таблицами, это превратит результат в продукт для карт, и я почти уверен, что вы могли бы вернуть trueчтобы АЛЬБЕРТ входил в систему с паролем 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 / разделяемая аутентификация по-множественный апекс-apps.html

0 голосов
/ 28 мая 2018
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
0 голосов
/ 27 мая 2018

Неправильный синтаксис.Попробуйте

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)
                           );
...