Oracle Apex自定义身份验证错误 - ' MY_AUTHENTICATION'这不是一个程序

时间:2015-04-07 17:14:55

标签: oracle plsql oracle-apex custom-authentication

请原谅我的天真,但是我已经在几个小时内一直在与这个问题作斗争而没有任何进展,我对于我所缺失的东西感到迷茫。我对Oracle很陌生,并且仍然掌握了很多自定义功能。

我正在尝试编写一个函数(遵循APEX接口上的指导原则),使用自定义身份验证方案为我的应用程序验证登录凭据。

指南声明:

  

指定在登录页面上输入后将验证用户的用户名和密码的功能的名称。如果您不输入任何内容,则允许任何用户名/密码成功。功能本身可以在身份验证的“PL / SQL代码”中定义。 textarea,包内或存储函数。   此函数必须向调用它的登录过程返回一个布尔值。它有2个输入参数' p_username'和' p_password'可用于访问最终用户在登录页面上输入的值。   例子   在' PL / SQL代码中输入以下代码' 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,{{1} },fnamelnamelogin)。

当我将身份验证功能名称设置为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
);

在Apex界面的my_authentication( p_username => :P101_USERNAME, p_password => :P101_PASSWORD ); - > Processing - > Process - > Login下。我似乎无法找到解决方案的原因是,当自定义身份验证方案配置页面明确要求返回一个我自己创建的布尔值的函数时,它正在请求一个过程。我知道它说登录程序会调用它,但我假设这是启动验证程序的APEX接口,它在哪里查找我的方法?

非常感谢任何帮助,我希望我有足够的细节来理解我的问题

非常感谢

1 个答案:

答案 0 :(得分:2)

您不应该更改页面流程代码,它应保持为:

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

这会执行一些逻辑,包括动态运行您在身份验证方案中指定的身份验证功能。