【问题标题】:Check user's password is valid or not in plsql在plsql中检查用户密码是否有效
【发布时间】:2015-10-02 19:42:07
【问题描述】:

我需要检查数据库用户是否有效。

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

【问题讨论】:

  • 我认为这应该回答你的问题...dba.stackexchange.com/questions/43086/…
  • 我不确定我是否理解问题的上下文。通常,用户在更改密码之前已经登录到数据库,因此您可以使用他们已登录的事实作为他们知道当前密码的证据。如果您希望用户在不登录的情况下更改密码,您可以使用alter user 命令的replace old_password 子句吗?
  • 一个需要其他人澄清的问题:SYS_CONTEXT('USERENV','SESSION_USERID')SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY') 不足以获得调用您程序的人的姓名吗?你真的不需要偷看密码,只要问Oracle当前用户的身份验证是谁......
  • 如果您在请求时不验证人,那么您无法保证请求本身的验证人。作为一个示例案例研究,Alice 早上登录应用程序,但被叫到离开她的办公桌,然而,她忘记了这一天未能锁定她的工作站。当她离开时,Malice 走到 Alice 的工作站并发出密码更改请求。如果您没有通过让 Malice 输入 Alice 的密码来验证更改请求,那么更改请求将在不应该通过的时候通过。

标签: sql oracle plsql


【解决方案1】:

我不认为 Oracle 数据库为您提供了执行此操作的 API。您可以使用的一种方法是使用环回数据库链接来检查它。像这样:

DECLARE
  p_username        VARCHAR2 (30) := 'MMCP';  -- Change to the user whose password you are validating
  p_test_password   VARCHAR2 (30) := 'NOT_MY_PASSWORD';  
  p_loopback_connection_string VARCHAR2(80) := 'ORCLQA';  -- 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 dual@password_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 字典中的用户名/密码,这要容易得多。

【讨论】:

    【解决方案2】:

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

    sys@XE> create user a identified by a;
    
    User created.
    
    Elapsed: 00:00:00.03
    sys@XE> grant create session to a;
    
    Grant succeeded.
    
    sys@XE> @c a/a
    
    a@XE> alter user a identified by b;
    
    User altered.
    
    Elapsed: 00:00:00.03
    a@XE> @c a/b
    a@XE>
    

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

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 2021-08-10
      • 2022-12-25
      • 2016-01-15
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多