2015-10-02 39 views
0

我需要检查数据库用户是否有效。检查用户的密码是否有效plsql

我将允许用户使用ALTER命令更改他们的密码,但在此之前我想验证他们当前的密码以确保他们是他们所说的那个人。是否有可能在pl/sql中使用用户/密码组合并检查它是否有效?

+1

我想这应该回答你的问题...... http://dba.stackexchange.com/questions/43086/how-to-change-a-user-password-while-checking-the-current -password-in-oracle – Mitchell

+0

我不确定我是否理解问题的上下文。通常,用户在更改密码之前已经登录到数据库,因此您可以使用他们登录的事实作为他们知道当前密码的证据。如果您希望用户在未登录的情况下更改其密码,您是否可以使用'alter user'命令的'replace old_password'子句? –

+0

对于其他人澄清的问题:SYS_CONTEXT('USERENV','SESSION_USERID')或者'SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY')'是否足以获得调用您的过程的名称?您并不需要偷看密码,只需询问Oracle当前用户是否已通过身份验证... – Ditto

回答

0

任何数据库用户都可以更改自己的密码。这不是你可以统治的东西。这是“设计”的工作原理。数据库内给定用户的权限是另一回事。这是你作为dba可以统治的地方。

[email protected]> create user a identified by a; 

User created. 

Elapsed: 00:00:00.03 
[email protected]> grant create session to a; 

Grant succeeded. 

[email protected]> @c a/a 

[email protected]> alter user a identified by b; 

User altered. 

Elapsed: 00:00:00.03 
[email protected]> @c a/b 
[email protected]> 

您的应用程序工具必须有一个密码管理模块。 看看Tom's answer对此:

1

我不认为Oracle数据库为您提供了一个API来做到这一点。你可以使用的一个kludge将是使用回送数据库链接来检查它。像这样:

DECLARE 
    p_username  VARCHAR2 (30) := 'VXSMIMMCP'; -- Change to the user whose password you are validating 
    p_test_password VARCHAR2 (30) := 'NOT_MY_PASSWORD'; 
    p_loopback_connection_string VARCHAR2(80) := 'STRQA2'; -- Change this for your environment 
BEGIN 

    BEGIN 
    EXECUTE IMMEDIATE q'[drop database link password_test_loopback]'; 
    EXCEPTION 
    WHEN OTHERS THEN 
     NULL; 
    END; 

    EXECUTE IMMEDIATE 
    'create database link password_test_loopback connect to "' || p_username || '" identified by "' || p_test_password || '" using ''' || p_loopback_connection_string || ''''; 

    EXECUTE IMMEDIATE q'[SELECT * FROM [email protected]_test_loopback]'; 

    EXECUTE IMMEDIATE q'[drop database link password_test_loopback]'; 

    dbms_output.put_line('Password is good'); 
EXCEPTION WHEN OTHERS THEN 
    IF SQLCODE = -1017 THEN 
    DBMS_OUTPUT.PUT_LINE('Password is wrong'); 
    ELSE 
    raise; 
    END IF; 
END; 

更高级的选项是找到一种方法来使用单点登录/ LDAP进行Oracle身份验证。然后,你的问题就变成了 - 我如何在我的LDAP字典中验证用户名/密码,这很容易。

相关问题