Как заблокировать учетную запись пользователя после нескольких попыток, и пароль не должен быть простым текстом в Oracle Apex? - PullRequest
0 голосов
/ 12 апреля 2019

Я получил пользовательскую таблицу со столбцом email, паролем, 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;

Кроме того, я получилформа на основе таблицы, которая позволяет пользователю обновлять свой пароль, как я могу установить ограничение, чтобы убедиться, что вставка пароля не является простым текстом, например, включает в себя заглавные буквы, специальные символы и т. д.

Спасибо.

1 Ответ

1 голос
/ 15 апреля 2019

Вы можете достичь этого, используя JavaScript / Oracle Function.Если вы предпочитаете использовать 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, доступной в расположении $ORACLE_HOME/rdbms/admin/utlpwdmg.sql.Измените функцию и создайте ее в соответствии с вашими потребностями, и вы сможете использовать ее для проверки.Надеюсь, это поможет вам.

...