2013-05-18 2 views
0

현재 apex.oracle.com에서 응용 프로그램을 만들고 있으며 몇 시간 동안이 문제를 해결하려고 노력해 왔지만 어떻게해야할지 모르겠습니다.사용자 정의 인증을 사용하여 사용자 ID 추적

좋아, 기본적으로 내 응용 프로그램은 내 응용 프로그램 내에서 만든 사용자 테이블을 기반으로 사용자 지정 인증을 가지고 있습니다. 따라서 현재 사용자의 정보를 검색하는 데 쓸모없는 대부분의 함수가 렌더링됩니다. 문제는 세션의 테이블에서 사용자의 숫자 ID를 저장하는 방법을 찾으려고하므로 WHERE UPPER(username) = UPPER(:APP_USER) 대신 WHERE id = :MEMBER_ID과 같은 작업을 수행하기 위해 응용 프로그램 전체에서 쿼리에서 직접 검색 할 수있었습니다.

이제는 사용자 이름을 기반으로 사용자 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

그래. 이전에 응용 프로그램 항목에 대해 알지 못했습니다. – 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')); 
      

      액세스 할 수있는 등 귀하의 의견에

    3. , 코드, (안정적 후 인증 단계에서 설정되지 CLIENT_IDENTIFIER에 대해 다른 사람들로부터 내 블로그 문서의주의 사항 및 이후의 의견을 참고) 단순히 SYS_CONTEXT('MY_CONTEXT','MEMBER_ID')을 참조함으로써 MEMBER_ID. 그 사람이 오라클 포럼에 나에게 제안 내가 사용하는 결국 정확히 무엇

+0

매우 완전한 대답입니다! 필자가 직접 초기화 plsql 코드를 사용하여 패키지 변수를 설정하는 것을 생각하지 않았지만 (패키지 변수에 대해) 내가 강제로 지정하지 않는 한 그 경로를 사용하면 확실하지 않습니다. 내 생각에는 응용 프로그램 항목이나 컨텍스트가 충분합니다. – Tom

+1

초기화/정리 PL/SQL 코드는 유용하지만 데이터베이스에 대한 모든 호출 * (즉, 모든 페이지 요청)에 대해 * 한 번 실행되므로주의해야합니다. 개인적으로 나는 응용 프로그램 항목이나 컨텍스트를 사용하는 것을 선호합니다. –

관련 문제