2015-04-07 80 views
1

請原諒我的天真,但我一直在爭取這個問題幾個小時,現在沒有任何進展,我失去了我失蹤的東西。我對Oracle很陌生,但仍然掌握了很多自定義功能。Oracle Apex自定義身份驗證錯誤 - 'MY_AUTHENTICATION'不是程序

我想寫一個函數(遵循關於APEX接口的指導)關於驗證使用我的應用程序的自定義身份驗證方案的登錄憑據。

指引狀態:

Specify the name of the function that will verify the user's username and password, after they were entered on a login page. If you enter nothing, you allow any username/password to succeed. The function itself can be defined in the authentication's 'PL/SQL Code' textarea, within a package or as a stored function. This function must return a boolean to the login procedure that calls it. It has 2 input parameters 'p_username' and 'p_password' that can be used to access the values an end user entered on the login page. Examples Enter the following code in the 'PL/SQL Code' textarea

function my_authentication (
    p_username in varchar2, 
    p_password in varchar2) 
    return boolean 
is 
    l_user my_users.user_name%type := upper(p_username); 
    l_pwd my_users.password%type; 
    l_id my_users.id%type; 
begin 
    select id , password 
     into l_id, l_pwd 
     from my_users 
    where user_name = l_user; 

    return l_pwd = rawtohex(sys.dbms_crypto.hash (
         sys.utl_raw.cast_to_raw(p_password||l_id||l_user), 
         sys.dbms_crypto.hash_sh512)); 
exception 
    when NO_DATA_FOUND then return false; 
end; 

my_authenticationAuthentication Function

我已經寫的功能甚至沒有那麼複雜,因爲我不加密目前PWD等,試圖剛剛得到的東西的工作

function my_authentication (p_username in varchar2,p_password in varchar2) 
    return boolean 
is 
    valid NUMBER; 
    returnvalid BOOLEAN; 
begin 
    begin 
     select 1 
     into valid 
     from users u 
     where u.sys_user.login = lower(p_username) AND u.sys_user.password = p_password;  
    exception 
     when NO_DATA_FOUND then valid := 0; 
    end; 
    returnvalid := valid=1; 
    RETURN returnvalid; 
end; 

爲了澄清用戶表由3場並且存儲我要驗證的數據的那個是sys_user(它是具有5個字段的對象類型:id,fname,lname,login,password)。

當我設置身份驗證功能名稱my_authentication並嘗試登錄我得到以下錯誤:

ORA-06550: line 1, column 7: PLS-00221: 'MY_AUTHENTICATION' is not a procedure or is undefined 
ORA-06550: line 1, column 7: PL/SQL: Statement ignored 

我假設這是從那裏我已經改變

apex_authentication.login( 
    p_username => :P101_USERNAME, 
    p_password => :P101_PASSWORD 
); 

到未來

my_authentication(
    p_username => :P101_USERNAME, 
    p_password => :P101_PASSWORD 
); 

根據Processing - >Process - >Login - >Source的Apex接口。我似乎無法找到解決方案的原因是爲什麼當自定義認證方案配置頁明確要求返回一個布爾值的函數時,它是請求一個過程,這是我創建的。我知道它聲明一個登錄過程會調用它,但我認爲這是APEX接口啓動一個驗證過程,通過它尋找我的方法?

任何幫助非常感謝,我希望我有足夠的細節,使我的問題意識

非常感謝

回答

2

你不應該改變了頁面進程的代碼,它應該保持:

apex_authentication.login( 
    p_username => :P101_USERNAME, 
    p_password => :P101_PASSWORD 
); 

這執行一些邏輯包括動態運行已在認證方案中規定的認證功能。

+0

謝謝託尼。我之前改回了它,它仍然不會登錄,但是我的會話過期了,並且剛剛改變了它,現在它完美地工作了 –