2

我创建了一个新的登录页面,其中只有那些可以在数据库中找到的帐户才能登录到我们的主页......我的计划是当我点击登录按钮时,用户将被重定向到主页......我做这通过创建一个新分支,然后在条件选项卡中,我放置了用于检查已在文本字段中输入的帐户是否存在的代码。但发生的事情是它总是显示错误消息“无效的登录凭据” ...

我确定我们放置的条件中的代码是正确的,,,它可以检测到用户名和密码错误,因为它显示了我创建的错误消息,该消息在发生这种情况时返回......

这是我的条件中的代码.. check_login 是一个过程,如果在数据库中找到该帐户,则返回 true ...

if CHECK_LOGIN(:P111_USERNAME, :P111_PASSWORD) then return true;
else
return false;
end if;

有人可以帮我们解决这个问题吗?提前致谢

4

1 回答 1

6

您需要自定义身份验证方案来解决此问题,而不是条件分支等。您也不需要构建新的登录页面。标准登录页面将包含您需要的所有内容,并且只需使用当前的活动身份验证方案。身份验证方案可以在共享组件下找到。

您可以在此处找到一些Oracle 文档。当您在 google 上搜索“oracle apex 自定义身份验证”时,还可以找到大量博客文章!

此外,在创建自定义方案时,您可以单击项目标签以获取帮助。例如,这是在身份验证函数名称帮助中:

指定在登录页面上输入用户名和密码后验证用户名和密码的函数的名称。如果您不输入任何内容,则您允许任何用户名/密码成功。函数本身可以在身份验证的“PL/SQL 代码”文本区域、包内或存储函数中定义。

该函数必须向调用它的登录过程返回一个布尔值。它有 2 个输入参数“p_username”和“p_password”,可用于访问最终用户在登录页面上输入的值。

例如,在 'PL/SQL Code' 文本区域中输入以下代码

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_md5 ));
exception
    when NO_DATA_FOUND then return false;
end;

my_authentication

作为“认证功能”。

请注意,您的函数需要参数 p_username 和 p_password!

您可以将其他字段留空,它们将由默认功能处理!

于 2012-12-17T08:46:00.980 回答