1

我相信你很好。这是我到目前为止所得到的细目。我有:

  • 自定义身份验证架构,从表中引用用户名和密码。(作品)

我添加了一个 expire_password 列,我想设置一个触发器或函数(不确定如何去做),它将在登录页面上进行验证以检查用户的帐户是否过期。如果它到期直接到更改密码页面,用户将在其中输入新密码并能够登录。添加新密码后,重置计时器以在设定的日期后自动再次到期密码。

我真的很感激帮助。

提前致谢

腾巴尼

4

2 回答 2

1

由于一切都是定制的,这里有一个选择。

  • 创建一个数据库作业(使用DBMS_JOBor DBMS_SCHEDULER),它将调用一个程序,该程序每天都会检查某人的密码是否会在接下来的几天内过期。如果是这样,给他们发一封电子邮件(使用UTL_MAILor 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 并且分支将触发并将用户重定向到用于更改密码的页面


现在您有两种方法可以做到这一点;使用它们中的任何一个,将它们组合起来或自己制作。祝你好运!

于 2019-10-14T18:26:58.633 回答
0

@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 已更改。从旧的开始,然后测试新的:

  1. apex_application.stop_apex_engine(而不是 wwv_flow.g_unrecoverable_error)
  2. apex_util.redirect_url(而不是 owa_util.redirect_url)
于 2019-10-15T16:08:48.073 回答