Oracle Apex - 密码在基于 table 和登录验证的设置日期后过期

Oracle Apex - Password expire after set date based on table and Login validation

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

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

非常感谢您的帮助。

提前致谢

泰巴尼

因为一切都是定制的,所以这里只有一种选择。

  • 创建一个数据库作业(使用 DBMS_JOBDBMS_SCHEDULER),它将调用一个程序,该程序每天检查某人的密码是否会在接下来的几天内过期。如果是这样,给他们发一封电子邮件(使用 UTL_MAILUTL_SMTP),告诉他们应该更改密码
  • 自定义登录程序检查 sysdate 是否大于密码过期日期。如果是,它将 return false (即不会让登录过程成功结束并拒绝登录尝试)

另一种选择,更接近您的描述。为了通知用户密码过期,您首先必须让他们进入,然后 以某种方式 重定向到 "password change" 页面。

  • 创建一个(存储的)函数来检查某人的密码是否已过期(让它成为 return 布尔值并调用它 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 branch that

    • 重定向到 "password change" 页面
    • 已将服务器端条件设置为 "PL/SQL Function Body",看起来像

      return f_pwd_exp(:APP_USER); 
      

      这意味着 - 如果密码已过期,函数将 return 为真并且分支将 触发 并将用户重定向到用于更改密码的页面


现在您有两种方法可以做到;使用它们中的任何一个,它们的组合或生产你自己的。祝你好运!

@littlefoot 已经涵盖了基础知识。我要补充的一件事是你不应该以明文形式存储密码,它们应该被散列并且最好为每个密码生成一个唯一的盐。 Doug Gault 最近在这里有一个相关的 post: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)