【问题标题】:How to logout sessions in oracle APEX?如何在 oracle APEX 中注销会话?
【发布时间】:2020-02-28 02:34:04
【问题描述】:

我试图避免用户在不同的计算机上登录。

我想创建一个登录视图,如果用户已经登录并且您尝试使用该用户登录,应用程序将显示一条消息“用户已登录”,并且可以选择使用链接关闭打开的会话或按钮。

编辑: Apex 版本 5.1.1.00.08,无法更新此版本。

我尝试了多种方法来关闭会话,但到目前为止都没有奏效。

第一步:

创建用于注销的 url。

我正在从表 apex_workspace_sessions

中获取 APEX_SESSION_ID

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

但是当我打开链接时,它并没有注销具有该 APEX_SESSION_ID

的用户

第二次行动:

我尝试创建一个函数来注销从表 apex_workspace_sessions 中提取 APEX_SESSION_ID 的会话,但生成此错误也无法正常工作:

ORA-06550:第 2 行,第 11 列:PLS-00328:必须为 DELETE_SESSION 的前向声明定义子程序主体。 ORA-06550:第 6 行,第 16 列:PLS-00302:组件“DELETE_SESSION”必须声明 ORA-06550:第 6 行,第 3 列:PL/SQL:语句被忽略

代码:

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_idAPEX_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: 权限不足

第四步:

我尝试使用官方 oracle 文档中的 LOGOUT PROCEDURE,但也没有用

apex_authentication.logout(APEX_SESSION_ID, :APP_ID);

没有错误或任何可显示的内容。

有谁知道如何从另一台计算机上注销用户?

谢谢

【问题讨论】:

  • 有时了解某人为何尝试做某事有助于选择正确的实现。你为什么要这样做?他们在不同的计算机或浏览器上登录有什么关系?
  • 我不想让一个用户在不同的计算机上登录多个会话,一个用户只有一个会话,有点像 web whastapp,安全问题,谢谢@DanMcGhan

标签: oracle oracle-apex oracle12c


【解决方案1】:

这是一个使用自定义表格的示例。

创建表格

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;

配置条件使进程不在登录页面上运行,然后点击创建进程

应该可以的。

【讨论】:

  • 其实第二个选项,创建一个表来控制登录是我想要的,但我不需要创建一个新表,这就是为什么我要选择和更新 apex_workspace_sessions,因此如果从 apex_workspace_sessions 表中删除任何会话,这将是从应用程序中注销的一种。不幸的是,我无法像在第三个操作中显示那样操作该表,您知道如何在应用程序级别从该表中删除记录(会话)吗?谢谢@DanMcGhan
  • APEX 拥有的表不受您的控制。您只能使用公开的 API。由于您未满 18 岁,因此您无法访问所需的 API。创建自定义表是实现所需功能的简单解决方法。为什么不这样做?
  • 创建新表不是问题,问题是,如果用户请求登录另一台计算机,我应该能够注销会话。我正在运行您制作的身份验证后程序代码,但它也不起作用Error Post-Authentication Procedure第二个操作 相同的错误,你知道它会是什么吗?我有 Apex 版本 5.1.1.00.08,我无法更新此版本,公司原因。 @DanMcGhan
  • 您不在 APEX 18+ 上。您没有可用的 API。升级 APEX 或创建表。
  • 你说得对,我将创建表,但我不太确定它是如何工作的,如果有另一个表已经在执行该功能,我如何管理通过该表关闭会话? .谢谢@DanMcGhan
【解决方案2】:

你用的是什么版本的apex?如果您使用的是 18.1 或更高版本,则可以使用 apex_session.delete_session 为您完成所有工作。

【讨论】:

  • 抱歉,它是 5.1.1.00.08,我编辑了答案,实际上我在 第二个操作 中尝试了该选项,但没有奏效,@Koen
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 2021-12-07
  • 2019-12-01
  • 2014-01-19
  • 1970-01-01
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多