Как выйти из сессии в оракуле APEX? - PullRequest
2 голосов
/ 01 ноября 2019

Я пытаюсь избежать входа пользователей на разные компьютеры.

Я хочу создать представление входа в систему, если пользователь уже вошел в систему и вы пытаетесь войти в систему с этим пользователем, приложение отобразит сообщение «пользователь уже зарегистрирован» и может закрыть открытый сеанс сссылка или кнопка.

РЕДАКТИРОВАТЬ: Apex Версия 5.1.1.00.08, нет возможности обновить эту версию.

Я пробовал несколько способов закрыть сеансно ни один из них не сработал.

ПЕРВОЕ ДЕЙСТВИЕ:

Создайте URL для выхода.

Я принимаю APEX_SESSION_ID из таблицы apex_workspace_sessions

enter image description here

http://xxxxxxxx.com/apex/apex_authentication.logout?p_app_id=100&p_session_id=APEX_SESSION_ID

Но когда я открываю ссылку,не выходит из системы с этим пользователем APEX_SESSION_ID

ВТОРОЕ ДЕЙСТВИЕ:

Я попытался создать функцию для выхода из сеанса, извлекающего APEX_SESSION_ID из таблицы apex_workspace_sessions но это не работает, генерируя этот error:

ORA-06550: строка 2, столбец 11: PLS-00328: Тело подпрограммы должно быть определено для предварительного объявления DELETE_SESSION. ORA-06550: строка 6, столбец 16: PLS-00302: должен быть объявлен компонент 'DELETE_SESSION' ORA-06550: строка 6, столбец 3: PL / SQL: оператор игнорируется

enter image description here

КОД:

declare 

procedure delete_session (p_session_id in number default wwv_flow.g_instance );

begin
    apex_session.delete_session (
    p_session_id => APEX_SESSION_ID );
end;

p_session_id в изображении APEX_SESSION_ID , который уже существуетв таблице apex_workspace_sessions

ТРЕТЬЕ ДЕЙСТВИЕ:

Я попытался выполнить запрос

DELETE FROM APEX_050000.wwv_flow_sessions$ WHERE ID = APEX_SESSION_ID;

с отображением ошибки: ORA-00942: таблица или представление не существует

и запрос

DELETE FROM apex_workspace_sessions WHERE APEX_SESSION_ID = APEX_SESSION_ID;

, отображающий ошибку: ORA-01031: недостаточные права доступа

ЧЕТВЕРТЫЙ ДЕЙСТВИЕ:

Я пытался использовать ПРОЦЕДУРУ ВЫХОДА из официальных документов оракула, но тоже не работал

apex_authentication.logout(APEX_SESSION_ID, :APP_ID);

без ошибокили что-нибудь для отображения.

Кто-нибудь знает, как выйти из системы с другого компьютера?

Спасибо

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Вот пример, который использует пользовательскую таблицу.

Создать таблицу

create table most_recent_logins (
  id         number generated by default on null as identity  
             constraint most_recent_logins_id_pk primary key,
  username   varchar2(255) not null,
  app_id     number not null,
  session_id number not null
             constraint most_recent_log_session_id_unq unique,
  login_date date not null,
  constraint most_recent_log_user_app_unq unique (username, app_id)
);

Создать процесс пост-аутентификации

Перейти к общим компонентам> Схемы аутентификации и выбратьтекущая схема. Введите в поле кода PL / SQL следующее:

procedure post_auth
is

  cursor mrl_cur
  is
    select *
    from most_recent_logins
    where app_id = :app_id
      and username = :app_user
    for update;

  mrl_rec mrl_cur%rowtype;

begin

  open mrl_cur;
  fetch mrl_cur into mrl_rec;

  if mrl_cur%notfound
  then
    insert into most_recent_logins (
      username,
      app_id,
      session_id,
      login_date
    ) values (
      :app_user,
      :app_id,
      :app_session,
      sysdate
    );
  else
    update most_recent_logins
    set session_id = :app_session,
      login_date = sysdate
    where current of mrl_cur;
  end if;

  close mrl_cur;

end;

Создайте процесс приложения

Перейдите в Общие компоненты> Процесс приложения и нажмите Создать>. Задайте для имени Проверка последнего входа в систему , затем нажмите Далее> . Введите следующий код в код PL / SQL и нажмите Далее> :

declare

  l_mr_session_id number;

begin

  select session_id
  into l_mr_session_id
  from most_recent_logins
  where username = :app_user
    and app_id = :app_id;

  if l_mr_session_id != :app_session
  then
    apex_util.redirect_url('f?p=' || :app_id || ':9999');
  end if;

end;

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

Это должно сделать это.

0 голосов
/ 02 ноября 2019

Какая версия Apex у вас? Если вам 18,1 или выше, вы можете использовать apex_session.delete_session, чтобы сделать всю работу за вас.

...