为了加强APEX后台密码的安全性和可靠性,对其进行弱密码改造,通过改写登录函数,判断密码可靠性,在密码不符合条件(密码长度必须大于8位小于16位,其包含数字、大小写字母与特殊符号)时跳转到密码修改页面。
登录后先验证密码是否为空——为空返回false,不为空继续——判断输入密码是否与数据库加密密码相符——不符返回false,相符继续——判断是否是弱密码——否(强密码)用户登录,是(弱密码)进入密码修改页面——修改成功后返回登录界面用新密码登录。
流程图如下所示
在登录页呈现前创建分支,进行判断,如果项IS_CHANGE_PSWD为1,则说明是弱密码,
需要修改,跳转到密码修改页
?加密前正常输入密码Aa123456!,加密后是jYwu7f1/liQ9N+yRyszzHA==,加密后字符长达24,超出了最大长度16,自然一直走false。
如果将输入密码Aa123456#加密再进行校验,那么无论如何都走的是false,带入到逻辑代码中就是IS_CHANGE_PSWD永远取到1,无法正常登录
反之将输入密码进行校验则会正常判断
create function apex_mpf_authentication_basic2(
p_username in varchar2,
p_password in varchar2)
return boolean
as
v_password varchar2(64);
v_password_reg varchar2(64); --解密后的密码
v_mobile varchar2(64);
v_job_number varchar2(64);
v_err_msg varchar2(2000);
begin
apex_util.set_session_state('USER_NAME',p_username); --设置工号到USER_NAME
select PASSWORD, MOBILE, JOB_NUMBER
into v_password,v_mobile,v_job_number
from BASIC_SYSTEM_LOGIN_USER
where LOGIN_USER_ID in (SELECT u.LOGIN_USER_ID
FROM BASIC_SYSTEM_USER_ROLE u
where u.IS_ENABLE = 1
and u.USER_ID in (select a.USER_ID
from SHARE_BASIC_USER_V a
where a.IS_LEAVE = 0 -- 中台 EHR账户“未离职”的状态下
and a.TENANT_ID = apex_util.get_session_state('USER_TENANT'))
and u.TENANT_ID = apex_util.get_session_state('USER_TENANT'))
and JOB_NUMBER = upper(p_username)
and SYSTEM_TYPE = 'BASIC'
and DEL_FLAG = 0
and TENANT_ID = apex_util.get_session_state('USER_TENANT');
WRITE_LOG(GET_FN_NAME(), 'debug3',
p_username || p_password || apex_util.get_session_state('USER_TENANT') || v_job_number, -1, -1);
if v_password is not null then --密码非空
V_PASSWORD_REG := JA_UTILS_PKG.DECRYPT_DEC(v_password); --将解密的密码赋值给v_password_reg
if p_password <> V_PASSWORD_REG then --输入密码与数据库解密密码不符
return false;
else --输入密码与数据库解密密码相符
-- 验证当前用户是强密码或弱密码的情况
-- 8到16位,包含数字,大小写,特殊字符,不包含空格
WRITE_LOG(GET_FN_NAME(), 'debug6',
'V_PASSWORD:'||V_PASSWORD_REG, -1, -1);
IF NOT (
REGEXP_LIKE(V_PASSWORD_REG, '[0-9]') AND
REGEXP_LIKE(V_PASSWORD_REG, '[a-z]') AND
REGEXP_LIKE(V_PASSWORD_REG, '[A-Z]') AND
REGEXP_LIKE(V_PASSWORD_REG, '[@#$%^&+=!.]') AND
LENGTH(V_PASSWORD_reg) BETWEEN 8 AND 16 AND
NOT REGEXP_LIKE(V_PASSWORD_REG, '\s')
) THEN
--弱密码的情况 IS_CHANGE_PSWD赋值1,目的:跳转修改密码页 要求用户修改密码,反之
APEX_UTIL.SET_SESSION_STATE('IS_CHANGE_PSWD', 1);
RETURN FALSE;
ELSE
APEX_UTIL.SET_SESSION_STATE('IS_CHANGE_PSWD', 0);
RETURN TRUE;
END IF;
end if;
else --密码为空
return false;
end if;
exception
when others then
v_err_msg := sqlerrm || chr(13) || dbms_utility.format_error_backtrace;
JA_WRITE_LOG(JA_UTILS_PKG.GET_FN_NAME(), 'error', v_err_msg, apex_util.get_session_state('USER_ID'),
apex_util.get_session_state('USER_TENANT'), V('APP_NAME') || ':' || V('APP_ID'));
return false;
end;
/
奇怪,明明都是对的,但是会报“登录身份证明无效”
原来是表BASIC_SYSTEM_USER_ROLE中未分配角色,所以找不到,其他有角色的用户带来则会正常执行。
奇怪的bug增加了,点击修改密码页面的“返回登录页”按钮,出现了一个丑丑的bug
后来找到原因了,返回登录使用的是别名,结果别名被占用,不是我想返回的登录页,将想返回的登录页别名命名过来即可。