大家在管理ORACLE数据库时,通常使用PROFILE对用户密码设置期限,但是需要注意应用系统连接的用户,对于密码期限设置,应谨慎处理。

首先我们看看怎么样为用户设置密码有效期:

在测试例子中,我们使用TEST用户进行测试,密码为TEST,先看看用户的状态。

SQL> select account_status,lock_date,expiry_date,created,profile from dba_users where username='TEST';

ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE CREATED PROFILE
-------------- ---------- ----------- ------------------- -------
OPEN 2008-03-27 15:29:18 DEFAULT

SQL> select ctime,ptime,exptime,ltime,spare6 from user$ where name='TEST';

CTIME PTIME EXPTIME LTIME SPARE6
------------------- ------------------- ------------------- ------------------- -------------------
2008-03-27 15:29:18 2008-03-27 15:29:18

在user$数据字典中,有几个字段是dba_users中看不到的。比如PTIME(应该就是密码设置或修改的时间),这里PTIME=CREATED(因为用户创建后没有改变过密码)

下面我们将创建profile,将密码有效期设置为10天,并将用户TEST的PROFILE设置为创建的test_profile:

SQL> create profile test_profile limit password_life_time 10 password_grace_time 0;
配置文件已创建
SQL> alter user test profile test_profile;
用户已更改。

再看看用户数据:

SQL> select account_status,lock_date,expiry_date,created,profile from dba_users where username='TEST';

ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE CREATED PROFILE
------------------------------ ------------------- ------------------- ------------------- ------------
OPEN 2008-04-06 15:29:18 2008-03-27 15:29:18 TEST_PROFILE

SQL> select ctime,ptime,exptime,ltime,spare6 from user$ where name='TEST';

CTIME PTIME EXPTIME LTIME SPARE6
------------------- ------------------- ------------------- ------------------- -------------------
2008-03-27 15:29:18 2008-03-27 15:29:18

注意到除了PROFILE列从DEFAULT变为了TEST_PROFILE,EXPIRY_DATE改变了,正好是PTIME+10。注意在USER$表中,EXPTIME为空,DBA_USERS中的EXPIRY_TIME是通过PTIME和PROFILE计算出来的。因此EXPIRY_TIME为密码将要到期的时间。

现在为用户设置好了PROFILE,新开一个SQLPLUS会话,用TEST用户登录:

SQL> connect test/test
ERROR:
ORA-28001: the password has expired

更改test的口令
新口令:

这个时候可以修改用户的密码。但是如果是应用软件没有对ORA-28001错误进行处理,则不能进行连接。这个时候我们看看用户的状态:

SQL> select account_status,lock_date,expiry_date,created,profile from dba_users where username='TEST';

ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE CREATED PROFILE
------------------------------ ------------------- ------------------- ------------------- ------------
EXPIRED 2008-03-27 15:29:18 TEST_PROFILE
SQL> select account_status,lock_date,expiry_date,created,profile from dba_users where username='TEST';

ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE CREATED PROFILE
------------------------------ ------------------- ------------------- ------------------- ------------
EXPIRED 2008-03-27 15:29:18 TEST_PROFILE

可以看到用户状态为EXPIRED。这个状态是记录在数据字典USER$中的,如果此时把用户的PROFILE改回为DEFAULT,这个状态仍然不会改变。

SQL> alter user test profile default;

用户已更改。

SQL> select account_status,lock_date,expiry_date,created,profile from dba_users where username='TEST';

ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE CREATED PROFILE
------------------------------ ------------------- ------------------- ------------------- ------------
EXPIRED 2008-03-27 15:29:18 DEFAULT

用户状态仍然为EXPIRED。这个时候,如果应用连接不上数据库,只有DBA手工干预了。对于状态为LOCKED的用户,使用alter user user_name account unlock即可。对于EXPIRED状态的用户,没有UNEXPIRE的命令,只有通过修改用户密码来重设状态:

SQL> alter user test identified by test;

用户已更改。

SQL> select account_status,lock_date,expiry_date,created,profile from dba_users where username='TEST';

ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE CREATED PROFILE
------------------------------ ------------------- ------------------- ------------------- ------------
OPEN 2008-03-27 15:29:18 DEFAULT

可以看到用户状态已经恢复正常。

SQL> select ctime,ptime,exptime,ltime,spare6 from user$ where name='TEST';

CTIME PTIME EXPTIME LTIME SPARE6
------------------- ------------------- ------------------- ------------------- ------------------
2008-03-27 15:29:18 2008-08-13 23:16:42

用户的密码设置时间也发生了变化。

如果在某些情况下,不知道用户的密码,可以通过下面的办法来设置密码:

SQL> select password from dba_users where username='TEST';

PASSWORD
------------------------------
7A0F2B316C212D67

SQL> alter user test identified by values '7A0F2B316C212D67';

用户已更改。

总结:对于为用户设置了密码有效期限的用户,应用软件应能够处理ORA-28001错误,或者DBA应定期对密码进行重设。否则不要为用户密码设置期限,当然对于DBA帐号,为安全起见,通过PROFILE强制要求用户定期修改密码,并且可以要求每次使用的密码不能使用以前使用的密码。

Trackback

only 1 comment untill now

  1. zhongshirong @ 2010-02-24 11:23

    熊哥
    例子里面为用户设置了profile限制后,怎么exptime字段值为空呢?

    [回复]

Add your comment now