【问题标题】:How to lock user account after multiple attempted and password must not be plain text in Oracle Apex?多次尝试后如何锁定用户帐户,并且密码在 Oracle Apex 中不能是纯文本?
【发布时间】:2019-04-15 12:42:27
【问题描述】:

我有一个用户表,其中包含电子邮件、密码、is_locked(varchar2(1) default = 'N')、login_failed(number default = 0) 列。以下是我为自定义身份验证方案编写的代码:

FUNCTION my_user_auth(
    p_username in varchar2,
    p_password in varchar2)
    RETURN boolean
IS
    l_result NUMBER := 0;
    l_locked VARCHAR2(1) := 'N';
    Sts NUMBER := 0;
    v_return BOOLEAN := FALSE;
BEGIN
    SELECT 1, USER_TYPE_ID, IS_LOCKED INTO l_result, Sts, l_locked
      FROM USER_INFO 
      WHERE LOWER(EMAIL) = LOWER(p_username)
      AND LOGIN_PASSWORD = p_password;

    if (l_locked ='N' AND l_result = 1) then
        APEX_UTIL.SET_SESSION_STATE('GLOBAL_STATUS_ITEM', Sts);
        v_return := TRUE;
    elsif (l_locked ='Y') then 
        apex_util.set_custom_auth_status (p_status => 'Account Locked, Exceeded Maximum Attempts! Please contact support staff.');
        v_return := false;
    end if;

RETURN v_return;

END my_user_auth;

在几次登录尝试失败后,是否有可能使用户的电子邮件被锁定(将“is_locked”值更改为“Y”)?

我曾尝试添加以下代码,但添加代码后,即使密码正确,用户也无法登录系统:

if(l_result = 0) then
    if(login_failed > 3) then
        UPDATE USER_INFO
        SET is_locked = 'Y'
        WHERE email = p_username;
    elsif
        UPDATE USER_INFO
        SET login_failed = login_failed + 1
        WHERE email = p_username;
    endif;
endif;

此外,我得到了一个基于表格的表格,允许用户更新他们的密码,我如何设置约束以确保密码插入不是纯文本,例如包括大写、特殊字符等。

谢谢。

【问题讨论】:

标签: oracle oracle-apex


【解决方案1】:

您可以使用 JavaScript/Oracle 函数实现此目的。如果您更喜欢使用 JavaScript,我希望下面的脚本可以帮助您实现它,假设 P1_PASSWORD 是获取输入的变量,在更改时添加下面的脚本(动态操作)。

var hasUpperCase = /[A-Z]/.test($v("P1_PASSWORD"));
var hasLowerCase = /[a-z]/.test($v("P1_PASSWORD"));
var hasNumbers = /\d/.test($v("P1_PASSWORD"));
var hasNonalphas = /\W/.test($v("P1_PASSWORD"));
if (hasUpperCase + hasLowerCase + hasNumbers + hasNonalphas < 3 || $v("P1_PASSWORD").length < 8 )
{
apex.message.clearErrors();
apex.message.showErrors([
  {
    type: apex.message.TYPE.ERROR,
    location: ["inline"],
    pageItem: "P1_PASSWORD",
    message: "Password should contain Uppercase,lowercase,number and Special character greater than 8 characters",
    unsafe: false
  }
]);
 }

对于 Oracle 函数,您可以参考位于 $ORACLE_HOME/rdbms/admin/utlpwdmg.sql 位置的 Oracle 函数。修改函数并根据您的需要创建它,您可以将其用于验证。 希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多