密码不能包含oracle数据库中的用户名或用户全名的一部分(pl/sq)
Posted
技术标签:
【中文标题】密码不能包含oracle数据库中的用户名或用户全名的一部分(pl/sq)【英文标题】:Passwords can’t contain the user name or parts of the user’s full name in oracle database(pl/sq) 【发布时间】:2019-06-28 12:43:02 【问题描述】:实际上,我有一个小问题是我正在开发应用程序,其中注册用户的表单和验证结束密码不能包含用户名,并且不能包含连续的 2 个字母形式的用户名。 客户要求是通过存储过程来做到这一点。 例如,“zia123”不是用户“Zia”的合适密码
有人知道这个 PL?SQL 存储过程函数吗?
【问题讨论】:
@B001ᛦ 也许 OP 是一家大公司 IT 部门的承包商,在这种情况下,OP 肯定应该从他们的客户那里获取技术要求。如果您认为这是xy problem,请改为说明。 “两个连续的字母”要求感觉最好使用 2-gram (n-gram) 比较来解决。不过,Oracle 中没有内置函数,所以你必须自己动手。此外,在程序而不是应用程序中执行此操作确实感觉很奇怪,因为无论语言如何,都肯定会支持此类功能。 所以像YoM4QG./SsJE3<n&pzihpjW(Sbm<-3xaNKExc2gc,&u&@J<,+&FtVS*u8vvUF
这样的密码你不会认为是合适的(因为它包含zi
)?如果用户的用户名很长,你会让你的用户非常讨厌。
【参考方案1】:
您可以尝试查看提供的 Oracle 密码验证功能,以帮助编写此类事情 - 12c 上的 ora12c_verify_function
和 ora12c_strong_verify_function
。我在这里包含了一个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
【讨论】:
非常感谢您解决我的问题。【参考方案2】:例如一个函数:
SQL> create or replace function f_unpw (par_username in varchar2, par_password in varchar2)
2 return varchar2
3 is
4 l_username varchar2(30) := upper(par_username);
5 l_password varchar2(30) := upper(par_password);
6 retval varchar2(200) := 'Password is OK';
7 begin
8 if instr(l_password, l_username) > 0 or
9 regexp_like(l_password, '[[:alpha:]]2,')
10 then
11 retval := 'Password contains username or two (or more) consecutive letters';
12 end if;
13
14 return retval;
15 end;
16 /
Function created.
测试:
SQL> with test (un, pw) as
2 (select 'zIA' , 'zia123' from dual union all
3 select 'LF' , 'x123bh' from dual union all
4 select 'Test', '334d' from dual
5 )
6 select un,
7 pw,
8 f_unpw(un, pw) result
9 from test;
UN PW RESULT
---- ------ ----------------------------------------------------------------------
zIA zia123 Password contains username or two (or more) consecutive letters
LF x123bh Password contains username or two (or more) consecutive letters
Test 334d Password is OK
SQL>
随意增强它。
【讨论】:
你的回答很好,真的对我很有帮助,但它没有收到更多的字符(字母)以上是关于密码不能包含oracle数据库中的用户名或用户全名的一部分(pl/sq)的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 10g中默认的用户和密码是啥?我在安装数据库时忘记了密码改成啥了,如何才能登陆呢?