Oracle Apex 自定义身份验证错误 - “MY_AUTHENTICATION”不是一个过程

Posted

技术标签:

【中文标题】Oracle Apex 自定义身份验证错误 - “MY_AUTHENTICATION”不是一个过程【英文标题】:Oracle Apex Custom Authentication Error - 'MY_AUTHENTICATION' IS NOT A PROCEDURE 【发布时间】:2015-04-07 17:14:55 【问题描述】:

请原谅我的天真,但我已经与这个问题斗争了几个小时,没有任何进展,我不知道我错过了什么。我对 Oracle 还很陌生,但我仍在掌握许多自定义功能。

我正在尝试编写一个函数(遵循 APEX 界面上的指南),以使用我的应用程序的自定义身份验证方案验证登录凭据。

指南规定:

指定在登录页面上输入用户名和密码后验证用户名和密码的函数的名称。如果您不输入任何内容,则您允许任何用户名/密码成功。函数本身可以在身份验证的“PL/SQL 代码”文本区域、包内或存储函数中定义。 该函数必须向调用它的登录过程返回一个布尔值。它有 2 个输入参数“p_username”和“p_password”,可用于访问最终用户在登录页面上输入的值。 例子 在“PL/SQL 代码”文本区域中输入以下代码

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 个字段的对象类型:idfnamelnamelogin, 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
);

在Apex接口的Processing->Process->Login->Source下。我似乎也找不到解决方案是为什么当自定义身份验证方案配置页面明确要求返回一个布尔值的函数时它请求一个过程,这是我创建的。我知道它声明登录过程会调用它,但我假设这是启动验证过程的 APEX 接口,它会在其中查找我的方法?

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

非常感谢

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢托尼。我之前改回来了,它仍然无法登录,但我的会话已过期,刚刚再次改回来,现在它工作正常

以上是关于Oracle Apex 自定义身份验证错误 - “MY_AUTHENTICATION”不是一个过程的主要内容,如果未能解决你的问题,请参考以下文章

在交互式网格 Oracle Apex 中的自定义验证中突出显示列

引用oracle apex APP_USER

Oracle Apex 20.1 错误:处理验证时出错

Django,自定义身份验证登录。身份验证失败时如何显示错误消息?

Oracle APEX 4.2 经典报告中的自定义搜索

Oracle APEX AJAX 调用失败