APEX后台弱密码增强改造出现的问题及解决方法

为了加强APEX后台密码的安全性和可靠性,对其进行弱密码改造,通过改写登录函数,判断密码可靠性,在密码不符合条件(密码长度必须大于8位小于16位,其包含数字、大小写字母与特殊符号)时跳转到密码修改页面。

判断逻辑

登录后先验证密码是否为空——为空返回false,不为空继续——判断输入密码是否与数据库加密密码相符——不符返回false,相符继续——判断是否是弱密码——否(强密码)用户登录,是(弱密码)进入密码修改页面——修改成功后返回登录界面用新密码登录。

流程图如下所示

【问题记录】页面登录时可以从P9999登录页面进入P81修改密码界面,但是想从P81修改密码界面点击进入登录界面不生效,又返回P81修改密码界面,搁这儿单人转呢?

【问题原因】密码验证方法有误,将输入密码加密后再进行密码强弱性校验这样做项IS_CHANGE_PSWD永远取到1而不是0,所以无法跳转登录页

在登录页呈现前创建分支,进行判断,如果项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
asv_password   varchar2(64);v_password_reg  varchar2(64);  --解密后的密码v_mobile     varchar2(64);v_job_number varchar2(64);v_err_msg    varchar2(2000);
beginapex_util.set_session_state('USER_NAME',p_username); --设置工号到USER_NAMEselect PASSWORD, MOBILE, JOB_NUMBERinto v_password,v_mobile,v_job_numberfrom BASIC_SYSTEM_LOGIN_USERwhere LOGIN_USER_ID in (SELECT u.LOGIN_USER_IDFROM BASIC_SYSTEM_USER_ROLE uwhere u.IS_ENABLE = 1and u.USER_ID in (select a.USER_IDfrom SHARE_BASIC_USER_V awhere 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 = 0and 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_regif 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]') ANDREGEXP_LIKE(V_PASSWORD_REG, '[a-z]') ANDREGEXP_LIKE(V_PASSWORD_REG, '[A-Z]') ANDREGEXP_LIKE(V_PASSWORD_REG, '[@#$%^&+=!.]') ANDLENGTH(V_PASSWORD_reg) BETWEEN 8 AND 16 ANDNOT REGEXP_LIKE(V_PASSWORD_REG, '\s')) THEN--弱密码的情况 IS_CHANGE_PSWD赋值1,目的:跳转修改密码页 要求用户修改密码,反之APEX_UTIL.SET_SESSION_STATE('IS_CHANGE_PSWD', 1);RETURN FALSE;ELSEAPEX_UTIL.SET_SESSION_STATE('IS_CHANGE_PSWD', 0);RETURN TRUE;END IF;end if;else  --密码为空return false;end if;exceptionwhen others thenv_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中未分配角色,所以找不到,其他有角色的用户带来则会正常执行。

【问题记录】同步功能到环境中,输出提示“修改失败”,查看会话,发现项值取到了,状态为“已插入”,这是怎么回事呢?

【问题原因及解决】回到对应的页面中不难发现,输出的提示是执行修改失败的语句,那就说明问题出在执行PL/SQL语句上,看一眼代码,果然,此环境下TENANT_ID = 2但是沿用了另一环境中的3了,改为对应TENANT_ID即可。

但还是修改失败,怎么回事?

回到登录函数中检验一下,

【小细节】记得在控制台开启“启用DBMSOUTPUT”,否则不会输出对应结果

代码:

declarep_password NVARCHAR2(100) :=  'Aa123456#';
beginIF NOT (REGEXP_LIKE(p_password, '[0-9]') ANDREGEXP_LIKE(p_password, '[a-z]') ANDREGEXP_LIKE(p_password, '[A-Z]') ANDREGEXP_LIKE(p_password, '[@#$%^&+=!.]') ANDLENGTH(p_password) BETWEEN 8 AND 16 ANDNOT REGEXP_LIKE(p_password, '\s')) THENDBMS_OUTPUT.PUT_LINE(1);ELSE  --强密码的情况DBMS_OUTPUT.PUT_LINE(0);END IF;
end;

输出结果为0,说明强密码校验通过,但是为什么修改失败呢?

破案了,原来还是TENAANT_ID的问题,改了一个,另一个没改,我的问题

【一个展示BUG】

奇怪的bug增加了,点击修改密码页面的“返回登录页”按钮,出现了一个丑丑的bug

后来找到原因了,返回登录使用的是别名,结果别名被占用,不是我想返回的登录页,将想返回的登录页别名命名过来即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/294509.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大坑!!!String.valueOf()输出“null“【查看源码】

项目中使用String.valueOf()&#xff0c;结果在数据库中存入了 "null" 这个字符串&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 测试如下&#xff1a; 溯源&#xff1a;String.valueOf()被重载了多次&#xff0c;其中包含基本数据类型&#…

GPTs 官方榜单 Top10,第一个独属于中国传统文化的胜利

GPTs 发布已经快两个月了&#xff0c;很有可能成为下一阶段的 app 形态&#xff0c;现在已经有很多人在开发、使用 GPTs&#xff0c;最近官方数据也更新了使用量最多的 GPT&#xff0c;来看下中文榜单的 Top10&#xff1a; 排名标题创建者使用量1AI 算命Jerrold Bergnaum12100…

点击筛选框动态增加 多条可输入Table列 以及通过操作数组改造数据

点击筛选框动态增加 多条可输入Table列 以及通过操作数组改造数据 <el-col :span"8" class"tab_group"><el-form-item label"动态筛选"><el-select v-model.trim"ruleForm.flowType" placeholder"请选择" …

贪心法之活动安排问题

问题: 给定n个活动&#xff0c;每个活动有一个开始时间si和结束时间fi&#xff0c;选择出最大的互不相容的活动 集合。 思路&#xff1a; 将所有活动按照结束时间从小到大排序。 选择第一个活动&#xff0c;并将其加入最终的选择集合中。 依次考虑剩余的活动&#x…

【每日一题】移除石子使总数最小

文章目录 Tag题目来源解题思路方法一&#xff1a;贪心优先队列 写在最后 Tag 【贪心优先队列】【数组】【2023-12-23】 题目来源 1962. 移除石子使总数最小 解题思路 方法一&#xff1a;贪心优先队列 思路 本题比较简单&#xff0c;思路也十分清晰。对于 k 次操作&#xf…

【C++】理解string类的核心理念(实现一个自己的string类)

目录 一、引言 二、自我实现 1.成员变量的读写 2.构造与析构 3.迭代器 4.插入字符或字符串 尾插 中间插入 5.删除字符或子字符串 6.查找字符或子串 7.获取子串 三、完整代码 四、补充 一、引言 实现自己的 string 类是学习 C 语言和面向对象编程的一个好方法。通过…

【Python必做100题】之第二十六题(小球反弹问题)

题目&#xff1a;一小球从100米高度自由落体落下&#xff0c;每次落地后反跳回原来高度的一半再落下&#xff0c;求它在第10次落地时&#xff0c;共经过多少米&#xff1f;第10次反弹多高&#xff1f; 思路&#xff1a;初始为100米&#xff0c;落下反弹为原来的一半&#xff1…

数据结构和算法-二叉排序树(定义 查找 插入 删除 时间复杂度)

文章目录 二叉排序树总览二叉排序树的定义二叉排序树的查找二叉排序树的插入二叉排序树的构造二叉排序树的删除删除的是叶子节点删除的是只有左子树或者只有右子树的节点删除的是有左子树和右子树的节点 查找效率分析查找成功查找失败 小结 二叉排序树 总览 二叉排序树的定义 …

模型推理加速系列 | 08:TensorRT-LLM助力LLM高性能推理

引言 ​ 日暮苍山远&#xff0c;天寒白屋贫。Created by DALLE 3 小伙伴们好&#xff0c;我是《小窗幽记机器学习》的小编&#xff1a;卖汤圆的小女孩&#xff0c;今天是冬至&#xff0c;祝福小伙伴们幸福安康吧。紧接前文&#xff1a; 万字长文细说ChatGPT的前世今生 Llam…

一款基于.NET Core的快速开发框架、支持多种前端UI、内置代码生成器

前言 经常看到有小伙伴在技术群里问有没有什么好用且快速的开发框架推荐的&#xff0c;今天就给大家分享一款基于MIT License协议开源、免费的.NET Core快速开发框架、支持多种前端UI、内置代码生成器、一款高效开发的利器&#xff1a;WalkingTec.Mvvm框架&#xff08;简称WTM…

论文推荐:大型语言模型能自我解释吗?

这篇论文的研究主要贡献是对LLM生成解释的优缺点进行了调查。详细介绍了两种方法&#xff0c;一种是做出预测&#xff0c;然后解释它&#xff0c;另一种是产生解释&#xff0c;然后用它来做出预测。 最近的研究发现&#xff0c;即使LLM是在特定数据上训练的&#xff0c;也不能认…

基于Spring自动注入快速实现策略模式+工厂模式优化过多的if..else

一、策略模式 1.1策略模式定义 在策略模式&#xff08;Strategy Pattern&#xff09;中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式定义了一系列算法或策略&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相…