Назначить первую страницу в Oracle APEX 5 на основе входа в систему

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

Я хочу иметь возможность установить первую страницу, которую видит пользователь, на основе входа в систему. В настоящее время я использую Application Express Authentication, но у меня также есть таблица логинов, которая содержит офис, имя пользователя и тип пользователя, поэтому, когда имя пользователя в :APP_USER. соответствует имени пользователя в таблице входа в систему, он выберет тип пользователя.

Поэтому, если рекрутер входит в систему, я хочу, чтобы они перешли на страницу 1, которая представляет собой панель управления рекрутингом, но если в систему входит продавец, я хочу, чтобы они перешли на страницу 20, которая представляет собой панель управления продажами.

Как я могу это сделать?

Заранее спасибо!


person greg    schedule 23.09.2016    source источник
comment
вам нужно создать пользовательскую аутентификацию, чтобы достичь того, чего вы хотите, вы пробовали это?   -  person Pranav Shah    schedule 23.09.2016
comment
На самом деле, таблица логинов содержит всю информацию об аутентификации, мне просто нужно найти способ получить страницу входа, чтобы направить пользователя на правильную стартовую страницу в приложении на основе типа входа, определенного в таблице.   -  person greg    schedule 23.09.2016


Ответы (4)


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

Эти параметры не всегда будут перенаправлять на нужную вам страницу, если у вас не отключены глубинные ссылки. При включенном диплинке пользователь всегда будет переходить на запрошенную им страницу, а не на ту, что указана в p_app_page. Вам решать, как должно вести себя приложение. Уважать глубокие ссылки или всегда перенаправлять на определенную страницу?

Лично я предпочитаю помещать перенаправление в пост-аутентификацию схемы аутентификации. По моему мнению, получение или установка пользовательских настроек не имеет места ни в процессах страницы входа, ни в коде аутентификации (он предназначен для аутентификации, а не для манипулирования).

В коде после аутентификации я бы выбрал тип и изменил FSP_AFTER_LOGIN_URL. Обратите внимание, что это полностью игнорирует глубокие ссылки. Вы можете не указывать ELSE, но это сохранит глубокие ссылки только для тех, кто не занимается продажами и рекрутерами, поскольку они всегда будут попадать на свою страницу панели инструментов.

DECLARE
  l_type persons.person_type%TYPE;
  l_url VARCHAR2(4000);
BEGIN
  SELECT person_type
    INTO l_type
    FROM persons
   WHERE username = :P101_USERNAME;

  l_url := 
  CASE l_type
  WHEN 'SALES' THEN
    'f?p=' || V('APP_ALIAS') || ':SALES_DASH:' || V('APP_SESSION')
  WHEN 'RECRUITER' THEN
    'f?p=' || V('APP_ALIAS') || ':RECRUITER_DASH:' || V('APP_SESSION')
  ELSE  -- go to home page
    'f?p=' || V('APP_ALIAS') || ':HOME:' || V('APP_SESSION')
  END;

  APEX_UTIL.SET_SESSION_STATE('FSP_AFTER_LOGIN_URL', l_url); 
END;
person Tom    schedule 27.09.2016
comment
Я думаю, это сработает! Я не смогу протестировать, пока не создам другие части приложения. Быстрый вопрос, хотя, где код говорит ': RECRUITER_DASH:', должен ли я назначать странице тире рекрутера этот псевдоним страницы или просто использовать фактический номер страницы? - person greg; 27.09.2016
comment
@greg Это зависит от тебя - это одно и то же. Я использовал здесь псевдоним для удобочитаемости, и в этом случае я предпочитаю отсутствие жесткого кодирования идентификатора. Вы никогда не знаете, может ли SALES_DASH внезапно измениться. С псевдонимом вы в большей безопасности. Но кроме этого, если вы предпочитаете идентификатор страницы, он будет работать точно так же. - person Tom; 27.09.2016
comment
Большое спасибо, я буду использовать псевдонимы страниц, как вы рекомендуете. Это действительно очень помогает! - person greg; 27.09.2016
comment
Хорошо, сейчас я могу реализовать это в приложении, единственная проблема в том, что я не могу создать процедуру, так как она не может обрабатывать переменную :P101_USERNAME, и я не могу добавить ее в схему custom_auth, поскольку он тоже задыхается, когда я добавляю его в PL/SQL. Я использую APEX 5.1, где я напортачил? - person greg; 06.06.2017
comment
Не обращай внимания, Том, я понял, где я облажался. Когда вы добавляете код, вы должны определить его, а затем добавить к имени процедуры пост-аутентификации. - person greg; 06.06.2017

Пара подходов.

Если у вас отключены глубинные ссылки (всегда переходить на определенную страницу), вы можете создать процесс перед заголовком, чтобы применить перенаправление (owa_util.redirect_url или apex_util.redirect_url).

Другие примеры, которые я видел, обычно включали очистку элемента сеанса FSP_AFTER_LOGIN_URL, а затем использование apex_custom_auth.login (в процессе вашей страницы входа), как показано ниже:

declare
    l_to_page_num NUMBER;

begin

    if upper(:P101_USERNAME) = 'TRENT'
    then
        l_to_page_num := 2;
    else
        l_to_page_num := 1;
    end if;

    apex_util.set_session_State ('FSP_AFTER_LOGIN_URL', NULL);

    apex_custom_auth.login(
        p_uname => :P101_USERNAME,
        p_password => :P101_PASSWORD,
        p_app_page => :APP_ID || ':' || l_to_page_num);

end;

Источник: https://community.oracle.com/message/10286176#10286176

person trent    schedule 27.09.2016

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

person Scott    schedule 27.09.2016

Для всех, кто хочет добиться этого, у Тома есть идеальное решение, вот как вы поместите его в свою настраиваемую схему аутентификации.

Когда вы редактируете схему, в поле Код PL/SQL введите свой код, чтобы он выглядел так:

PROCEDURE post_authentication IS
BEGIN
DECLARE
  l_type logins.login_type%TYPE;
  l_url VARCHAR2(4000);
BEGIN
  SELECT login_type
    INTO l_type
    FROM logins
   WHERE upper(:P101_USERNAME) = USERNAME;

  l_url := 
  CASE l_type
  WHEN 'Sales' THEN
    'f?p=' || V('APP_ALIAS') || ':SALES_DASH:' || V('APP_SESSION')
  WHEN 'Recruiter' THEN
    'f?p=' || V('APP_ALIAS') || ':RECRUITER_DASH:' || V('APP_SESSION')
  WHEN 'Regional' THEN
    'f?p=' || V('APP_ALIAS') || ':REGIONAL_DASH:' || V('APP_SESSION')
  WHEN 'Admin' THEN
    'f?p=' || V('APP_ALIAS') || ':ADMIN_DASH:' || V('APP_SESSION')
  WHEN 'National' THEN
    'f?p=' || V('APP_ALIAS') || ':NATIONAL_DASH:' || V('APP_SESSION') 
  ELSE  -- go to home page
    'f?p=' || V('APP_ALIAS') || ':HOME:' || V('APP_SESSION')
  END;

  APEX_UTIL.SET_SESSION_STATE('FSP_AFTER_LOGIN_URL', l_url); 
END;
END post_authentication;

Затем ниже в поле Имя процедуры пост-аутентификации в разделе Обработка входа убедитесь, что вы поставили post-Authentication или как вы решили назвать процедуру в поле PL/SQL.

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

person greg    schedule 06.06.2017