我正在使用Oracle APEX应用程序,今天我发现为多个配置文件设置的密码验证功能无法正常工作,因为原来代表旧密码的参数已被证明为空。
我的密码验证功能F_VERIFY_PASSWORD
是基于Oracle管理文件utlpwdmg.sql
中的示例:仅针对与旧密码和旧密码的比较无关的部分进行了代码更改。新的一个。功能代码如下所示(不存在问题的部分除外):
create or replace function F_VERIFY_PASSWORD
(
USERNAME varchar2
,PASSWORD varchar2
,OLD_PASSWORD varchar2
) return boolean is
…
DIFFER integer;
MINDIFFER number := 3;
…
begin
…
-- Check that the new password differs from the previous one no less than in MINDIFFER positions.
if OLD_PASSWORD is not null
then
DIFFER := LENGTH(OLD_PASSWORD) - LENGTH(PASSWORD);
DIFFER := ABS(DIFFER);
if DIFFER < MINDIFFER
then
if LENGTH(PASSWORD) < LENGTH(OLD_PASSWORD)
then
M := LENGTH(PASSWORD);
else
M := LENGTH(OLD_PASSWORD);
end if;
for I in 1 .. M
loop
if SUBSTR(PASSWORD,I,1) != SUBSTR(OLD_PASSWORD,I,1)
then
DIFFER := DIFFER + 1;
end if;
end loop;
if DIFFER < MINDIFFER
then
RAISE_APPLICATION_ERROR(-20011,'The new password must differ from the old one no less than in 3 positions!');
end if;
end if;
end if;
-- Return TRUE, if all is correct.
return(true);
end;
更改密码本身是通过过程P_CHANGE_PASS
进行的,该过程在Oracle APEX应用程序中执行。它的代码如下所示(不存在问题的部分除外)。
create or replace procedure P_CHANGE_PASS
(
NEWPASS varchar2
,NEWPASS2 varchar2
,USR varchar2
) as
…
begin
…
--changing the password
begin
execute immediate 'alter user ' || USR || ' identified by ' || NEWPASS;
exception
when others then
…
end;
end;
我尝试了以下步骤,以使验证功能包括检查新旧密码之间的差异:
ALTER USER
撤消了特权APEX_PUBLIC_USER
; AUTHID CURRENT_USER
添加到了
“客户”程序P_CHANGE_PASS
; REPLACE <old password>
ALTER USER
命令(这很糟糕,但我做到了
进行调试)。这些动作都没有帮助我解决问题。因此,如何使函数OLD_PASSWORD
中的参数F_VERIFY_FUNCTION
不为空?
我使用Oracle 11g(版本11.2.0.3.0),Oracle APEX 4.2.6.00.03。