Oracle中通过PROFILE的PASSWORD_LIFE_TIME设为90天可强制密码90天后过期,用户首次登录即需改密;需检查用户实际关联的profile而非默认值,并配合PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX防止密码复用。
如何用 PROFILE 设置密码 90 天过期
oracle 里控制密码定期更换,核心就是 profile 中的 password_life_time 参数。它不是“倒计时提醒”,而是硬性策略:超过设定天数后,用户首次登录就会被拦截,必须改密才能继续操作。
实操建议:
- 先查当前默认 profile:
SELECT profile, resource_name, limit FROM dba_profiles WHERE profile = 'DEFAULT' AND resource_name = 'PASSWORD_LIFE_TIME'; - 修改默认策略(需 DBA 权限):
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME 90; - 若想立即生效于所有用户,注意:已有会话不受影响,但下次登录即触发;已过期用户无法登录,除非 DBA 手动重置密码
- 不建议设为
UNLIMITED或0(后者等价于立即过期),容易引发批量登录失败
为什么设置了 PASSWORD_LIFE_TIME 却没触发强制改密
常见原因是用户被显式赋予了非默认 profile,而该 profile 的 PASSWORD_LIFE_TIME 是 UNLIMITED 或数值更大。Oracle 总是优先使用用户直接关联的 profile,而非 default。
排查步骤:
- 查用户用的哪个 profile:
SELECT username, profile FROM dba_users WHERE username = 'YOUR_USER'; - 查该 profile 的实际限制:
SELECT resource_name, limit FROM dba_profiles WHERE profile = 'XXX' AND resource_name = 'PASSWORD_LIFE_TIME'; - 确认密码最后修改时间:
SELECT username, password_last_changed FROM dba_users WHERE username = 'YOUR_USER';—— Oracle 以这个时间为起点计算过期
配合 PASSWORD_REUSE_TIME 和 PASSWORD_REUSE_MAX 防止“换汤不换药”
只设 PASSWORD_LIFE_TIME 不够,用户可能循环用旧密码。需要组合使用复用限制:
-
PASSWORD_REUSE_TIME:多少天内禁止重用历史密码(单位:天),设为365表示一年内不能重复 -
PASSWORD_REUSE_MAX:最多要换几次新密码后,才能再次使用某个旧密码(设为10表示至少换 10 次后才可复用) - 二者是“或”关系:只要满足任一条件,就允许复用;通常建议同时设置,例如:
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME 365 PASSWORD_REUSE_MAX 10; - 注意:这些限制依赖
password_history记录,仅对通过ALTER USER ... IDENTIFIED BY或登录时强制改密产生的密码有效;DBA 直接ALTER USER ... IDENTIFIED BY VALUES绕过验证则不会记入历史
ORA-28001 “the password has expired” 登录失败怎么办
这是策略生效的明确信号,不是故障。用户无法跳过,必须改密;DBA 也不能“临时解锁”,只能重置或引导用户自助修改。
- 用户连接时执行:
ALTER USER your_user IDENTIFIED BY new_password;—— 前提是当前会话已建立(比如用 SQL*Plus 连上后立刻执行) - DBA 可代为重置:
ALTER USER your_user IDENTIFIED BY new_password PASSWORD EXPIRE;,这样用户下次登录仍会被强制改密(适合审计要求场景) - 如果应用用固定账号连接,改密后务必同步更新连接字符串中的密码,否则服务中断
- 特别注意:
EXPDP/IMPDP、DBLINK等依赖密码的组件,也会因过期失效,需提前检查
真正麻烦的不是设参数,而是 profile 修改后缺乏对存量用户的覆盖校验,以及应用层未适配“登录即改密”的交互流程。上线前最好用测试用户走一遍完整过期路径。











