我相信你很好。这是我到目前为止所得到的细目。我有:
- 自定义身份验证架构,从表中引用用户名和密码。(作品)
我添加了一个 expire_password 列,我想设置一个触发器或函数(不确定如何去做),它将在登录页面上进行验证以检查用户的帐户是否过期。如果它到期直接到更改密码页面,用户将在其中输入新密码并能够登录。添加新密码后,重置计时器以在设定的日期后自动再次到期密码。
我真的很感激帮助。
提前致谢
腾巴尼
我相信你很好。这是我到目前为止所得到的细目。我有:
我添加了一个 expire_password 列,我想设置一个触发器或函数(不确定如何去做),它将在登录页面上进行验证以检查用户的帐户是否过期。如果它到期直接到更改密码页面,用户将在其中输入新密码并能够登录。添加新密码后,重置计时器以在设定的日期后自动再次到期密码。
我真的很感激帮助。
提前致谢
腾巴尼
由于一切都是定制的,这里有一个选择。
DBMS_JOB
or DBMS_SCHEDULER
),它将调用一个程序,该程序每天都会检查某人的密码是否会在接下来的几天内过期。如果是这样,给他们发一封电子邮件(使用UTL_MAIL
or UTL_SMTP
),说他们应该更改密码sysdate
大于密码过期日期。如果是,则返回false(即不会让登录过程成功结束并拒绝登录尝试)另一种选择,更接近你所描述的。为了通知用户密码过期,您首先必须让他们进入,然后以某种方式重定向到“密码更改”页面。
创建一个(存储的)函数来检查某人的密码是否已过期(让它返回布尔值并称之为 f_pwd_exp),例如
function f_pwd_exp (par_app_user)
return boolean
is
l_exp_date date;
begin
select exp_date
into l_exp_date
from your_users_table
where username = par_app_user;
return l_exp_date > trunc(sysdate);
end;
在初始应用程序页面上,创建一个 Before Header分支
将服务器端条件设置为“PL/SQL 函数体”,看起来像
return f_pwd_exp(:APP_USER);
这意味着 - 如果密码已过期,函数将返回 True 并且分支将触发并将用户重定向到用于更改密码的页面
现在您有两种方法可以做到这一点;使用它们中的任何一个,将它们组合起来或自己制作。祝你好运!
@littlefoot 已经涵盖了基础知识。我要补充的一件事是,您不应该以明文形式存储密码,它们应该进行散列处理,并且最好使用为每个密码生成的唯一盐。Doug Gault 最近在这里发表了一篇相关文章:https ://blogs.oracle.com/apex/custom-authentication-and-authorization-using-built-in-apex-access-control-a-how-to
希望你已经在做类似的事情......
这是我实现此功能的旧应用程序的示例应用程序流程。
declare
l_users_rec users%rowtype;
begin
if :app_page_id != '101' --login
then
select *
into l_users_rec
from users
where upper(email) = upper(:APP_USER);
if l_users_rec.change_password_flag = 'Y' and :app_page_id != '110' --profile
then
wwv_flow.g_unrecoverable_error := true;
owa_util.redirect_url('f?p=' || :APP_ID || ':110:' || :APP_SESSION);
end if;
end if;
end;
一些 API 已更改。从旧的开始,然后测试新的: