请原谅我的天真,但我已经在这个问题上打了几个小时而没有任何进展,我迷失了我所缺少的东西 . 我对Oracle很陌生,仍然掌握了很多自定义功能 .
我正在尝试编写一个函数(遵循APEX接口的指导原则),关于使用我的应用程序的自定义身份验证方案验证登录凭据 .
指南规定:
在登录页面上输入后,指定将验证用户的用户名和密码的功能的名称 . 如果您不输入任何内容,则允许任何用户名/密码成功 . 函数本身可以在身份验证的“PL / SQL代码”文本区域中,在包中或作为存储函数中定义 . 此函数必须向调用它的登录过程返回一个布尔值 . 它有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_authentication
为 Authentication 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
);
在Apex接口的 Processing
- > Process
- > Login
- > Source
下 . 我似乎无法找到解决方案的原因是,当自定义身份验证方案配置页面明确要求返回一个我自己创建的布尔值的函数时,它正在请求一个过程 . 我知道它说登录程序会调用它,但我假设这是APEX接口启动验证程序,它在哪里查找我的方法?
非常感谢任何帮助,我希望我有足够的细节来理解我的问题
非常感谢
1 回答
您不应该更改页面流程代码,它应保持为:
这会执行一些逻辑,即 includes 动态运行您在身份验证方案中指定的身份验证功能 .