Setting application level item during authentication

We’re having an issue with an application level item that we set during our custom authentication function to store a role list for authorization. The issue is that the application level item, which should be set using htmldb_util.set_session_state(‘ITEM_NAME’, p_item_value), is not being set.
On further investigation we realised that this issue was only affecting developers, not users of the application. This seems to be because the home page link, set in Shared Components > Edit Security Attributes, is set to “f?p=&APP_ID.:1:&SESSION.”, which means that the developers session was being passed to the application when the “Run Application” button was pressed. What then happens is that following the successful execution of the authentication function, a new session id is generated and visible on the URL and the Application Level Items are not set correctly.
Examples:
I’m developing an application on Apex that has the home page link set to “f?p=&APP_ID.:1:&SESSION.”, here’s the first part of my URL at the Application home page:
http://apex.oracle.com/pls/otn/f?p=4000:1:1065658352862710::
I hit “Run Application” and get to this URL (note the session id is the same)
http://apex.oracle.com/pls/otn/f?p=16033:1:1065658352862710:::::
I log in using any old username and password (the auth scheme on this demo app always returns true) and I get to this URL (note the session id is different):
http://apex.oracle.com/pls/otn/f?p=16033:1:1403999736046638
My application level item is not set and I start to cry. When I recover from my tearful episode I try to log in again, I hit logout and get taken to this URL:
http://apex.oracle.com/pls/otn/f?p=16033:1
I log in again (with the same username or different, it doesn’t matter) and low and behold, my application level item is set ok. This is the URL I can see (note another new session id):
http://apex.oracle.com/pls/otn/f?p=16033:1:4917752800353335
In despair, I close my browser window and go to my other application, this one has got the home page link set to “f?p=&APP_ID.:1” (no session id passed).
I log back into Apex as a developer and go to the application home page at this URL:
http://apex.oracle.com/pls/otn/f?p=4000:1:131988631742187::
I hit “Run Application” and get to this URL (note the session id is missing):
http://apex.oracle.com/pls/otn/f?p=19114:1::::::
I log in using any old username and password (same deal as before) and I get to this URL (new session id):
http://apex.oracle.com/pls/otn/f?p=19114:1:4320851658879093:::::
Amazingly, this time the application level items are set first time.
What I’d like to know (there is a purpose to this) is:
- Why is a different session allocated to the application after login, when a “developer’s” session id is passed to the application?
- If I remove the session id from the home page url what is the impact? I can’t think of anywhere within the application that this is used (other than between page 101 and the home page), but our thoughts are that this could mean that users end up generating more sessions on the server.
- Is there any other way around this, perhaps using a different method of setting the application level item? The authentication procedure which sets the item reads as follows and mimics our authentication procedure (which you can assume does a little bit more than just returning true):
function test_login 
  (p_username in varchar2 default null, 
  p_password in varchar2 default null) return boolean is 
begin 
  htmldb_util.set_session_state('F16929_SYSDATE', to_char(sysdate, 'DAY')); 
  return true; 
end;- Has anyone else encountered difficulties with the setting of application level items during login or has anyone come up with a more ingenious plan for passing something back from authentication that can later be used for authorisation?
Thanks
matt

Scott,
Many thanks for the response.
We've found a way around this now, by changing the developer's usernames to the same as their NT/ Active Directory signon, which fools APEX into maintaining the session id from their builder session even though when logging into the application they get authenticated by LDAP.
Using a post authentication process would be ok but I can't see any way of passing a variable retrieved in the authentication process under the first session to the post authentication process so that it can be set in the second session. We'd either therefore have to insert the data into a table and read it back or add an extra LDAP call to retrieve the user role/ group list during the post authentication process.
Thanks again,
Matt

Similar Messages

  • Setting Application leve items after authentication

    All,
    I'm doing a custom authentication in my application using the built-in login page and calling the standard API. My function then returns TRUE/FALSE for authentication.
    After I authenticate the user, I want to set an application level item to the primary key of their user (i.e. GV_USER_ID).
    When the user issues queries against the reports, then I will build the where clause to say 'where user_id = :GV_USER_ID'.
    I'm at a loss however in setting the application level item.
    Initially, I set a PAGE PROCESSING -> PROCESS to fire onSubmit - after calcs & validations, putting it between "Login" and "Clear". My process queries the database using P101_USERNAME from the login page.
    However, when my user is logged in, the application level item is blank. Here is my code to set the value. Remember, my user will already have been authenticated.
    declare
    u_id USER.USER_ID%TYPE;
    predicate varchar2(30);
    begin
    if (lower(trim(:P101_USERNAME)) = 'administrator') then
    u_id := 0;
    predicate := 'user_id like ''%''';
    else
    select user_id
    into u_id
    from user
    where lower(trim(EMAIL_ADDR))=lower(trim(:P101_USERNAME));
    predicate := 'user_id = ' || u_id;
    end if;
    :GV_USER_ID := u_id;
    :GV_ID_PREDICATE := predicate;
    exception
    when others then :GV_ID_PREDICATE := 'user_id is null';
    end;
    Can someone tell me exactly where I should place this code so I can set my application items?
    Thanks.

    Ooops, spoke a little too soon. The application items do not get set with I first spawn the browser and and try to log in.
    However, when I log out and then log back in, then my application items get set. The code is now sitting in the authenticate_user function
    create or replace function authenticate_user
    (p_username in varchar2
    ,p_password in varchar2)
    return BOOLEAN is
    f_id FRANCHISEE.FRANCHISEE_ID%TYPE;
    passwd FRANCHISEE.PASSWORD%TYPE;
    predicate VARCHAR2(30);
    valid BOOLEAN;
    begin
    valid := FALSE;
    -- authenticate the user
    select password into passwd
    from franchisee
    where lower(trim(email_addr)) = lower(trim(p_username));
    if (passwd = p_password) then
    valid := TRUE;
    end if;
    -- set the query predicate
    if (valid = TRUE) then
    if (lower(trim(p_username)) = 'administrator') then
    f_id := 0;
    predicate := 'franchisee_id like ''%''';
    else
    select franchisee_id
    into f_id
    from franchisee
    where lower(trim(EMAIL_ADDR))=lower(trim(p_username));
    predicate := 'franchisee_id = ' || f_id;
    end if;
    htmldb_application.update_cache_with_write('GV_FRANCHISEE_ID', f_id);
    htmldb_application.update_cache_with_write('GV_ID_PREDICATE', predicate);
    end if;
    return(valid);
    exception
    when OTHERS then return(FALSE);
    end

  • Set item value from application level item

    Hello,
    I'm using Apex 2.2.1.00.04. I've modified the Page "No Tabs" template so that I can have my own Form (which is submitted to an outside website). On this form, I create some hidden items:
    <form name="frmEPay" method="POST" action="some_website">
    <input type="hidden" id="i1" name="userId" value=&G_ID. />
    <input type="hidden" id="i11" name="timestamp" value="" />
    <input type="hidden" id="i12" name="hash" value="" />
    On this apex page, I have a javascript function which is called in the onload (basically, the ApEx webpage displays and then is redirected). Here's a snippet of that function:
    var appProc = new htmldb_Get(null, html_GetElement('pFlowId').value,'APPLICATION_PROCESS=PrepEPay',0);
    appProc.get();
    appProc = null;
    document.getElementById('i11').value = "&G_ECOM_TIMESTAMP.";
    document.getElementById('i12').value = "&G_HASH.";
    document.frm_infiNET.submit();
    As you can see, the function calls an application level On Demand process (PrepEPay). That process sets the values of the application level items G_ECOM_TIMESTAMP and G_HASH. After those App level items have their values, I want to take those values and apply them to the hidden items on my custom form. Unfortunately, it doesn't work how I have things currently. I've verified that the On Demand process is running(by viewing the Session report on the page). So my problem seems to be this: 1. Retrieving the values from the Apex application level items
    2. Setting those values to the values of my hidden items (on my custom form)
    I think the biggest reason why I'm having difficulties is because I have to do a lot of this in the template, since that is the only way to have a separate Form. Maybe my problem is that I don't understand how to reference the Apex application level item value from a different form?
    Thanks,
    Marty

    Marty,
    You are describing this as if you expect the substitution within "&G_ECOM_TIMESTAMP." and the other one to take place in some kind of lexical order, e.g., from the top to the bottom of the HTML. The replacements happen in the engine, before anything is sent to the page. Then the browser interprets language constructs such as javascript calls which in your case includes an ajax invocation of a server-side application process.
    You need to re-think the machinery here.
    Scott

  • Setting App level Items and using it.

    Hi all
    I am setting the application level item value by application level process which is working good.
    application level process : select get_dbname into env_str from dual.
    But when I use this variable value, its not working.
    In logout URL,, I am trying to put &env_str. but that is not working.
    Any idea?
    pb

    Scott,
    Its working, but for some reason this whole thing (using item in logout url) wasnt working for this particular application.
    Thanks for the reply.
    pb

  • Can't access  Application level item

    Hi,
    I have set an Application level item. I have tried to assign it as a default value on a Page Item but nothing is being shown.
    Application Level Item: APP_USER_ID
    On New Instance computation:
    select user_id
    from isp_user
    where login_id=:APP_USER
    Page Item: P57_CREATED_BY
    Default Value: &APP_USER_ID.
    Default Type: Static Text with Session State Substitutions
    No value is displayed, but if I replace &APP_USER_ID. with &APP_USER a value is displayed.
    Thanks for any assistance.

    OK, I've simplified the scenario to avoid any confusion. I'll give you a step by step of what I think you are telling me and see how we go. Believe I feel like I've tried everything...sure it's just my inexperience with the tool.
    Via Shared Components/Items created....
    Application Level Item: APP_USER_ID
    On Page 57 of my Application I created a Before Header computation:
    Item Name: APP_USER_ID
    Type: SQL Query
    Computation Point: Before Header
    Computation: select 21 from dual
    I assigned this to be the default value for a database field on Page 57, defined as follows:
    Page Item: P57_CREATED_BY
    Display As: Text Field
    Source Used: Always,replacing any existing value in session state
    Source Type: Database Column
    Default Value: &APP_USER_ID.
    Default Value Type: Static Text with Session State Substitutions
    I logged out and logged back in. I checked Session State and saw that the APP_USER_ID Application Item exists but has not value.
    I navigated to Page 57... no value is displayed in the P57_CREATED_BY field... If I review the Session State I can see that APP_USER_ID Application Item has a value of 21.
    Changing &APP_USER_ID. to &APP_USER. displays a value which seems to indicate it is not an issue with the field definition.
    Hope that is a little clearer.
    Thanks, appreciate your help.
    Jona

  • Adding pl/sql expression to application level item

    I would like to have an item shared by all pages within my application. My understanding is that I can define an application-level item for this.
    I know that for page-level items I can pool a value from the database by putting a pl/sql function into the item's "source value or expression" field and by setting the source type to "pl/sql expression or function".
    But I cannot do that for an application-level item. In fact, when I create my application-level item, the properties screen of it has pretty much nothing available to configure. It only has Name, Security, Build Option and Comments.
    Please, advise on how I can pool a value from the database for an application-level item.
    thanks
    Boris

    Boris,
    Application-level items are items that do not get rendered in HTML. They are for keeping named values in session state only and are available for use throughout the application. However, all page items are available for use throughout the application.
    What do you mean by "I would like to have an item shared by all pages within my application. "? If you want an item that gets rendered on every page, create a page 0 and put regions/items on that page.
    I don't know what you mean by "pool a value from the database".
    Scott

  • Application level item

    I am creating a public site (no authentication/authorization). In my application, I created an application level item and would like its value to be based on a value from the database. Do I use an application process or application computation to populate its value ?
    Thanks in advance.
    Message was edited by:
    [email protected]

    I would probably use an Application Computation with a computation type of "SQL Query".

  • How do I clear application level item of the last value it held?

    See next post - I oopsed the first try.
    Edited by: user3034406 on Jul 28, 2009 1:48 PM

    Using oracle 11g, apex version 3.0.
    Ok, so I am developing a survey with questions and their related answers (either radio group or checkbox depending). I have it set up so that when a user clicks a checkbox, an apex_collection is updated. In the pl/sql of my region source, I left outer join to this collection to display the checkbox as checked when its value is found in the collection. Using this same strategy, I can delete a value from the collection when a user uncheckes a box....
    The problem I am having is this: the very last value that a user checks initially (i.e. takes checkbox from unchecked to checked status) is staying in my application level item :ADD_THIS, so when the page is refreshed or whatever, this value gets added to my collection, which means it shows as checked. Well, I think this is what is happenig...!
    I have tried setting the app level item to null in a computation process, but this screwed everything up and nothing would work right....
    So, if someone knows when, how and where to reset an app level item?
    NOTE: I barely know javascript (getting the hang of simple stuff but I have a long way to go!) and am a little shaky on things like session state, before load, after load, etc., etc, when it comes to apex. Please be patient with me! (smile)
    Here's what's going on script wise:
    PL/SQL in region source of page: builds list of questions and their associated answers
    DECLARE
    #####stuff here####
    CURSOR multiple_answer_cur IS select apex_item.checkbox(1, nvl(a.c001, a.answer_seq),'onclick="f_updateMember(q_seq, a_seq);"', a.c001, null, v_q_seq) cbox, a.answer_text, qa.question_seq, a.answer_seq
    *<etc. etc....>*
    CURSOR single_answer_cur IS select apex_item.radiogroup(radio_global, nvl(a.c001, a.answer_seq),a.c001, null, null, null, 'f_updateMember(q_seq, a_seq)',null, v_q_seq) rgroup, a.answer_text, qa.question_seq, a.answer_seq
    *<etc. etc....>*
    BEGIN
    ####stuff here that builds survey and writes it using HTP. to page####
    END;
    Javascript function to add or delete from collection (in header of page)
    function f_updateMember(q_seq, a_seq){
    --determine if value represents checked or unchecked box
    var isString = /q|a/;
    var getThis = document.getElementById(q_seq).value;
    var findinValue = getThis.search(isString);
    var getaddthis = new htmldb_Get(null,$x('pFlowId').value,'APPLICATION_PROCESS=AddCheckboxValue',0);
    var getdelthis = new htmldb_Get(null,$x('pFlowId').value,'APPLICATION_PROCESS=DelCheckboxValue',0);
    --onclick, if an 'a' or 'q' is found in value, this box is in the collection and therefore checked, so delete it
    if (findinValue != -1) {
    getdelthis.add('DELETE_THIS', "q"+q_seq+"a"+ a_seq);
    getdelthis.GetAsync(function(){return;});
    getdelthis = null;
    }else{
    --onclick, no 'a' or 'q' is found in value, this box is not in the collection, so add it
    getaddthis.add('ADD_THIS',"q"+q_seq+"a"+ a_seq);
    getaddthis.GetAsync(function(){return;});
    getaddthis = null;
    Snippet of page source
    <b>Question number one</b>
    <input type="checkbox" name="f01" value="q78a489" checked="checked" onclick="f_updateMember(78,
    489)" id="78" />Answer option one for question one>
    <b>Question number two</b>
    <input type="checkbox" name="f01" value="483" onclick="f_updateMember(77, 483)" id="77" />Answer
    option one for question two>
    Edited by: user3034406 on Jul 28, 2009 12:18 PM

  • Setting Application level Transaction Timeout

    Hi,
    I have seen option in weblogic to set jta transaction time out. Is there a way I specify application level timeout.
    Thanks,
    Bhargav.

    Scott,
    Many thanks for the response.
    We've found a way around this now, by changing the developer's usernames to the same as their NT/ Active Directory signon, which fools APEX into maintaining the session id from their builder session even though when logging into the application they get authenticated by LDAP.
    Using a post authentication process would be ok but I can't see any way of passing a variable retrieved in the authentication process under the first session to the post authentication process so that it can be set in the second session. We'd either therefore have to insert the data into a table and read it back or add an extra LDAP call to retrieve the user role/ group list during the post authentication process.
    Thanks again,
    Matt

  • Right place to initialize application level items

    I initilized application items on page 1 (home page for application). The normal flow for this application is the way when user gets their authentication at startup and then is normally redirected to the home page where application items are initialized.
    This logic doesn't work when user gets (for example from a colleague) direct link to a particular page inside application. In that case after successfull authentication APEX redirects user to this page and my application items remain undefined.
    What's the right place to initialize application items? I need initialize them first whenever user starts my application and regadless how they enter.

    The Authentication Schemes used in both apps is SSO.
    All pages require authorization. The schemes call a PL/SQL function accpeting a parameter of APP_USER and return a Boolean of whether this type of access is granted to that user.
    Since all pages require authorization, navigating to any page causes SSO to be called and on authentication the authorization schemes are called to determine whether the user is authorized to see the page. If so, it will load ...
    The code I have in the Post-Authentication Process is as follows (I'm pretty sure it doesn't fire because the row is not inserted => see note below ..):
    declare
    v_app_user VARCHAR2(7);
    begin
    v_app_user := SUBSTR(:APP_USER,1,7);
    INSERT INTO profitauto.portf_front_end_login_log
    (stdrd_id
    , login_time
    VALUES (v_app_user
    , SYSTIMESTAMP
    COMMIT;
    end;
    It seems to me to make sense that it doesn't fire if the user is authenticated in another app. Or is the authentication still happening in this app (just not prompting SSO to pop-up again to the user)...? Please note. If I have not authenticated myself already, and login to this app, the record IS written to the table ...

  • User Level Vs. Application Level Authorization and Authentication for Container Managed Datasources (Oracle Connection Pools)

    Oracle Database Server 9i supports the usage of LABELS to enforce highly granular
    resource access restrictions at the database level independent of the application
    that is accessing it. In order to use this however, the particular user, and
    not just the application, accessing the database must be known. Oracle Application
    Server (Oracle's J2EE product line) solves this by providing the ability to PROXY
    the identity of the application user and creditials (SSL Certs for instance) down
    to the database server.
    I haven't seen a similar ability for BEA Weblogic Server 8.1 which allow the user
    identity and credientials to be PROXIED to the database server. Is this possible?
    Have I missed an important document?
    Thanks for any input,
    Raymond Tiong

    On 3 Feb 2004 12:51:26 -0800, Raymond Tiong <[email protected]> wrote:
    >
    Oracle Database Server 9i supports the usage of LABELS to enforce highly
    granular
    resource access restrictions at the database level independent of the
    application
    that is accessing it. In order to use this however, the particular
    user, and
    not just the application, accessing the database must be known. Oracle
    Application
    Server (Oracle's J2EE product line) solves this by providing the ability
    to PROXY
    the identity of the application user and creditials (SSL Certs for
    instance) down
    to the database server.
    I haven't seen a similar ability for BEA Weblogic Server 8.1 which allow
    the user
    identity and credientials to be PROXIED to the database server. Is this
    possible?
    Have I missed an important document?
    Thanks for any input,
    Raymond Tiong
    I think there is a section in the JDBC documentation for 8.1 which
    describes what it takes to utilize Oracle 9i extension called "Virtual
    Private Database". With this extension, one might be able to proxy the
    callers
    identity to the DB.
    See: http://e-docs.bea.com/wls/docs81/jdbc/thirdparty.html#1103627

  • Setting an app level item based on :APP_USER

    I am trying to set an application level item right after I log in and I want the value to be based on the setting of :APP_USER. I created an application level process at the "On New Session: After Authentication" point containing the following code:
    select id into :F107_VOTER
    from el_person
    where userid = :APP_USER;
    This works fine when I run the page from the builder, but fails when I fire up a separate browser session and access the app directly. I'm suspicious that perhaps APP_USER built in item is not defined when the process point runs. Can someone confirm when APP_USER is set relative to this application level process point and/or perhaps suggest an alternative way to initialize an application level item that is dependent on APP_USER?

    Bill,
    The first page that runs in your new session is the login page. So your process runs at the very first opportunity (On New Session:After Authentication) when APP_USER is null, which doesn't do what you want. The name of that process point is misleading, it means after authentication for the current page. For the login page, which is necessarily a public page, the authentication steps are completed immediately after the show processing begins. So then you enter username/password and submit the login page which takes you to the first real page in the app, but still in that same session, but the process has already fired and won't run again.
    I suggest that you create another application item, F107_VOTER_INITIALIZED, change the process point to be Before Header, add a condition so that it runs only if F107_VOTER_INITIALIZED is null, then have the process run the query and set the initialization flag to a non-null value. Of course F107_VOTER itself can be the initialization flag if it is to remain constant throughout the session.
    Scott

  • Aplication Vs. Page level items for application process

    Hi,
    I have many application processes in my applications, many of them take parameters.
    Right now I am passing parameters using page level temporary items. This is causing each page to have many items that are only used for calling the application process.
    Is it better to use application level items for this purpose?
    any pros and cons for each of these?
    ~Ketan

    Arie,
    Are you saying that the condition only apply to rendering the item, but the APEX engine will still consider such an item a valid “internal” variable?
    Yes. The absence of a condition on a page item or a condition that evaluates to true simply allows it to be rendered on the page. The existence of the item in the page definition allows it to hold session state.
    We're planning to introduce a non-displaying page item type just for this purpose, sort of a scratchpad variable with no display properties, like an applicaition item but defined on a page.
    Scott

  • How to define a application level (or page 0) plsql validation

    I have a selection region on page 0, which I use on a lot of pages. I want to define plsql validation for the items in that region.
    I have already a database package with the validation code.
    Now I want to define each validation only once and not on each page.
    How can I do this.

    Funny thing happened to me on the way to creating my scenario on the apex.oracle.com site. I actually got it to work there. Once I attempted to simplify my scenario to reproduce it on apex.oracle.com, I figured out a simple step (hack?) that I was missing. I put that back into my site and it's working there now as well.
    If it's useful for others who attempt to do something like this, I needed to create a page-level process which doesn't really do anything except have a "NOT NULL" condition of the APP_ERROR_MSG application-level item and then use the "&APP_ERROR_MSG." syntax in the "Success Message" of that process. In essence, I'm telling the process to display the error as a success message when the APP_ERROR_MSG item is not null.
    I feel this is a hack because I would prefer to have this error message processing at the application level rather than at the page level. I was forced to put this process at the page level rather than at the application level because (as of ApEx 2.2) application-level processes do not have a "Success Message" option, only an "Error Message" option, while page-level process have both.
    Maybe my "fix" is truly a hack and I would love to hear that in order to get a better solution, that is more generic and application-level based. My sample app is at http://apex.oracle.com/pls/otn/f?p=32483:1 with the username of "devguest" and the same as the password.
    I look forward to hearing some thoughts.

  • Setting Application Item On New Instance problem

    Trying to set several application items using application computations set to fire On New Instance (ie. new login). None of them are firing on a new login.
    I did successfully fire them when I made page rendering computations after the header, but when I move them to Application level Computations set to ONI nothing fires. Any ideas?
    Thanks

    You could have the main menu page include a before-header process to do the following:  IF :COMPUTATIONS_COMPLETE is null then
          <do all your computations>
          :COMPUTATIONS_COMPLETE := 'Y';    
      END IF;[pre]
    ..where COMPUTATIONS_COMPLETE is an application item.
    Scott                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

Maybe you are looking for

  • Incorrect Language txt Being Displayed

    Hi We have recently gone live using ECC 5.0 in a new region, Spain, when the users logon using using ES, certain transactions are showing the text in German, such as transaction S_ALR_87013624 ? Spanish language has been imported 2 years ago and was 

  • Selecting the treenode at client side

    Hi all, I am using JSF tree (Dynamic Tree) for my application. I have constructed a dynamic tree .Below which one button is there. Requirement is like this 1)i have to select a node and some check image will sit on the node. Every time i click the no

  • Wily Introscope Clarification

    Can someone help clarify where I'm supposed to install the Wily Introscope Manager? I installed on my solution manager server, is that correct? I thought that the Wily Manager goes on Solution manager server and the wily agent goes on sap web applica

  • Generating multiple reports in one rwrun60.exe

    Hello, i want to generate multiple documents in one rwrun60.exe call (from java). This way i can avoid the time spending for logging in to database for every singe report ... Does anybody know if its possible ? something like execute (rdf1, params, r

  • RequestScope- is it the right way to do?

    Hi, I have 2 pages (page1.jspx and page2.jspx) and 2 backing beans for those 2 pages backingBean1.java and backingBean2.java respectively. In the backingBean1.java, I have the following code to put the variable 'isTested' on request. The following co