Oracle APEX 自定义身份验证

问题描述 投票:0回答:1

我尝试在 APEX 上实现自定义登录,但应用程序不断拒绝有效数据。 我将用户表定义如下:

CREATE TABLE "USERS" 
(   
 "USER_ID" NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOKEEP  NOSCALE  NOT NULL ENABLE, 
 "USERNAME" VARCHAR2(100) NOT NULL ENABLE, 
 "PASSWORD" VARCHAR2(512) NOT NULL ENABLE, 
 "IS_ADMIN" VARCHAR2(1) NOT NULL ENABLE, 
  CONSTRAINT "PK_CUSTOM_USERS" PRIMARY KEY ("USER_ID")
 USING INDEX  ENABLE, 
 CONSTRAINT "UQ_CUSTOM_USERS_USERNAME" UNIQUE ("USERNAME")
 USING INDEX  ENABLE
) ;

以及自定义身份验证功能:

create or replace FUNCTION authenticate_user (p_username VARCHAR2, p_password VARCHAR2)
RETURN BOOLEAN
IS
l_count NUMBER;
BEGIN
-- Debug statement to output input parameters
DBMS_OUTPUT.PUT_LINE('Input Username: ' || p_username);
DBMS_OUTPUT.PUT_LINE('Input Password: ' || p_password);

-- Query to check if the username and password match
SELECT COUNT(*)
INTO l_count
FROM USERS
WHERE USERNAME = p_username
  AND PASSWORD = p_password;

-- Debug statement to output the count
DBMS_OUTPUT.PUT_LINE('Count: ' || l_count);

-- Check if count is greater than 0
IF l_count > 0 THEN
    RETURN TRUE; -- Authentication successful
ELSE
    RETURN FALSE; -- Authentication failed
END IF;
EXCEPTION
WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
    RETURN FALSE; -- Return false on any error
END;

当我在 APEX SQL 命令控制台中测试函数时,我得到了预期的行为。这是我测试的方法:

DECLARE
v_username VARCHAR2(100) := 'tommy';
v_password VARCHAR2(100) := 'password';
v_is_valid BOOLEAN;
BEGIN
v_is_valid := authenticate_user(v_username, v_password);
IF v_is_valid THEN
    DBMS_OUTPUT.PUT_LINE('Authentication successful');
ELSE
    DBMS_OUTPUT.PUT_LINE('Authentication failed');
END IF;
END;

我已经指示应用程序使用

Custom
类型的自定义身份验证架构。仍然没有任何作用。我正在按照 this 教程进行操作,他的实现效果很好。 这里还有一些配置。
Custom Authentication Schema
enter image description here
Application Authentication
enter image description here

oracle oracle-apex custom-authentication
1个回答
0
投票

我对你的代码进行了快速测试,效果很好。但是... apex 检查大写用户名,因此请确保用户表中的用户名存储为大写形式,或者在 where 子句中执行

UPPER(username)
。您还必须有一个索引 UPPER(用户名)才能强制唯一性。

不相关的评论(超级重要!):切勿将密码存储为明文。我不想在密码以明文形式存储的组织中工作。这是一个重大的安全风险。相反,存储加密值并将用户提交的密码的加密值与存储的值进行比较。身份验证方案的帮助中有一个很好的身份验证功能示例

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.