Вы можете попробовать воспользоваться предоставленными функциями проверки пароля Oracle для помощи в написании такого рода вещей - ora12c_verify_function
и ora12c_strong_verify_function
на 12c.Я включил параметр old_password
здесь, потому что общее требование проверки пароля сравнивает новый пароль со старым.
CREATE OR REPLACE function verify_password_complexity
(username varchar2,
password varchar2,
old_password varchar2)
return varchar2 IS
begin
-- password must not contain user's name.
-- They didn't specify but I'm assuming their requirements want a case-insensitive check.
if (upper(password) like '%' || upper(username) || '%') then
return 'password contains username';
end if;
-- must not contains consecutive 2 letters from user's name
for u in (select substr(username,level,2) as pair -- get all pairs of letters
from dual
connect by level <= length(username)-1)
loop
-- does password contain this pair
if (upper(password) like '%' || upper(u.pair) || '%') then
return 'password contains 2 consecutive letters from username: ' || u.pair;
end if;
end loop;
return 'password OK';
end;
/
Тестирование:
begin
dbms_output.put_line(verify_password_complexity('testuser', 'lkajsdofiuwe', 'oiuwlkajsdf'));
dbms_output.put_line(verify_password_complexity('testuser', 'lkajsdofiuwer', 'oiuwlkajsdf'));
dbms_output.put_line(verify_password_complexity('testuser', 'lkatestuseruwe', 'oiuwlkajsdf'));
end;
/
password OK
password contains 2 consecutive letters from username: er
password contains username