我有一个用户表,其中包含列电子邮件,密码,is_locked(varchar2(1)默认='N'),login_failed(数字默认= 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;
此外,我得到了一个基于表格的表格,该表格允许用户更新密码,如何设置约束以确保密码插入不是纯文本,例如包括大写字母,特殊字符等。
谢谢。
答案 0 :(得分:1)
您可以使用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 Function,您可以参考$ORACLE_HOME/rdbms/admin/utlpwdmg.sql
位置中可用的Oracle Function。修改功能并根据需要创建它,然后可以将其用于验证。
希望对您有帮助。