2013-05-18 70 views
0

我目前在apex.oracle.com上創建了一個應用程序,現在我一直試圖解決這個問題幾個小時,但我不知道該怎麼做。使用自定義身份驗證跟蹤用戶ID

好吧,所以基本上我的應用程序具有基於我在我的應用程序內部創建的用戶表的自定義驗證。因此,它似乎使大多數APEX_UTIL函數無用,以檢索當前用戶的信息。問題是,我試圖找到一種方法在會話中存儲用戶的數字ID,因此我可以直接在整個應用程序的查詢中檢索它,以便執行類似WHERE id = :MEMBER_ID而不是WHERE UPPER(username) = UPPER(:APP_USER)的操作。

現在,我嘗試這樣做的方法是創建一個後驗證過程,根據用戶名檢索用戶ID,並使用APEX_UTIL.SET_SESSION_STATE(p_name => 'MEMBER_ID', p_value => member_id)將該值存儲在會話中。但是,似乎SET_SESSION_STATE無法創建自定義會話值或其他值,每次使用文檔中未特別提及的值名稱時都會返回ERR-1002

我是APEX的總新手,所以我可能沒有意識到什麼,但是我做了很多搜索,但是我找不到與我的問題有特別關係的任何東西。

非常感謝您的幫助。

回答

2

您正試圖將值存儲到項目中,無論是頁面還是應用程序級別。這要求具有該名稱的項目存在於其中一個範圍內。那麼,你有沒有一個項目叫做MEMBER_ID
我建議你在應用程序範圍內創建一個。瀏覽共享組件>應用程序項目。創建後,您應該可以通過apex_util.set_session_state或綁定變量語法分配值,例如:MEMBER_ID := somevariable;

+0

是的,這正是我最終使用,有人建議我在Oracle論壇。我以前不知道應用程序項目。 – AgentRev

2

有多種方法可以執行此操作。有些已經在其他答案中提出過。

  1. 應用項目(按照湯姆的回答)

  2. PL/SQL包全局(按HOL的回答) - 雖然你不得不重新設置每個呼叫(例如,通過將代碼添加到應用程序的安全屬性初始化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沒有被可靠地設置在AUTH後階段在我的博客文章警告和後續評論)

    3. 在您的看法,代碼等,您可以訪問MEMBER_ID通過簡單地參考SYS_CONTEXT('MY_CONTEXT','MEMBER_ID')

+0

非常完整的答案!有沒有真正想過使用初始化plsql代碼自己設置包變量,但我不知道是否我會去那條路線,除非我被迫(我的意思是包變量)。在我看來,應用程序或上下文綽綽有餘。 – Tom

+1

初始化/清除PL/SQL代碼很有用,但需要謹慎對待,因爲它對數據庫的每一次調用運行一次,即每個頁面請求。我個人更喜歡使用應用程序項目或上下文。 –

相關問題