使用自定义身份验证跟踪用户ID

时间:2013-05-18 22:45:07

标签: sql authentication plsql session-variables oracle-apex

我目前正在apex.oracle.com上创建一个应用程序,我现在已经尝试解决这个问题几个小时了,但我不知道该怎么做。

好吧,基本上我的应用程序基于我在应用程序内创建的用户表进行自定义身份验证。因此,似乎无法使大多数APEX_UTIL函数无法检索当前用户的信息。问题是,我试图找到一种方法来存储会话中我的表中的用户数字ID,所以我可以在整个应用程序的查询中直接检索它,以便执行类似WHERE id = :MEMBER_ID的操作而不是WHERE UPPER(username) = UPPER(:APP_USER)

现在,我尝试这样做的方法是创建一个Post Authentication过程,该过程根据用户名检索用户ID,并使用APEX_UTIL.SET_SESSION_STATE( p_name => 'MEMBER_ID', p_value => member_id )将该值存储在会话中。但是,似乎SET_SESSION_STATE无法创建自定义会话值或其他内容,每次使用文档中未特别提及的值名称时都会返回ERR-1002

我是APEX的新手,所以我可能没有意识到某些事情,但是我做了很多搜索,但是找不到与我的问题有关的任何内容。

如果你能提供帮助,非常感谢。

2 个答案:

答案 0 :(得分:2)

您尝试将值存储到项目中,无论是页面还是应用程序级别。这要求具有该名称的项目存在于其中一个范围中。那么,你有一个名为MEMBER_ID的项目吗? 我建议你在应用程序范围内创建一个。浏览共享组件>申请项目。创建之后,您应该能够通过apex_util.set_session_state或使用绑定变量语法分配值,例如:MEMBER_ID := somevariable;

答案 1 :(得分:2)

有很多方法可以做到这一点。在其他答案中已经提出了一些建议。

  1. 申请项目(根据汤姆的回答)

  2. PL / SQL程序包全局(根据hol的回答) - 尽管您必须为每次调用重置它(例如,通过向应用程序添加代码和#39;安全属性初始化PL / SQL代码并通过向清理PL / SQL代码添加代码来清除它。

  3. 全球可访问的上下文 - 此方法虽然稍微复杂一些,但在安全性和调试方面具有一些优势。我在这里描述了它:http://jeffkemponoracle.com/2013/02/28/apex-and-application-contexts/,但基本上是:

    1. 创建全局可访问的上下文:

      CREATE OR REPLACE CONTEXT MY_CONTEXT USING MY_PACKAGE ACCESSED GLOBALLY;
      
    2. 在后验证过程中(在数据库包MY_PACKAGE中),您可以存储您希望跟踪的数据,例如

      DBMS_SESSION.set_context
        (namespace => 'MY_CONTEXT'
        ,attribute => 'MEMBER_ID'
        ,value     => '12345whatever'
        ,client_id =>  v('APP_USER') || ':' || v('APP_SESSION'));
      

      (请注意我博客文章中的注意事项以及其他人关于CLIENT_IDENTIFIER在后验证阶段无法可靠设置的评论)

    3. 在您的观看次数,代码等中,您只需参阅SYS_CONTEXT('MY_CONTEXT','MEMBER_ID')即可访问MEMBER_ID。