【问题标题】:ALTER USER x identified by y replace z, only permission?由 y 标识的 ALTER USER x 替换 z,只有权限?
【发布时间】:2014-09-12 17:15:23
【问题描述】:

背景

我们有一个 Web 应用程序,它作为通用应用程序用户登录到 Oracle 数据库,但是由于历史原因,我们将所有用户用户都存储为 Oracle 数据库用户(我们针对 Oracle 数据库进行身份验证以将它们登录到Web应用程序)。我们还有其他 Oracle Forms 应用程序更直接地使用数据库用户(它们不能被删除)。

我正在尝试允许用户通过网络应用程序通用用户更改自己的密码。

问题

如何授予 Web 应用程序通用用户更改特定用户密码的能力,而不授予其更改超级用户密码的能力?如果有人以某种方式窃取了 Web 应用程序的凭据,我们希望限制损害。

Oracle 数据库通过以下方式支持这一点:

 alter user user123 identified by new_password123 replace old_password123;   

这对我们的目的非常有用,因为我们在将旧密码更改为新密码时会要求用户提供他们的旧密码。

不管有没有“replace”语法,我们都需要授予相同的权限,“alter user”,它授予通用 Web 应用程序用户太多的权力(例如,更改任何用户的密码,即使不知道旧密码)。

那么有没有办法设置权限,以便您可以更改任何您想要的密码,但前提是您知道旧密码?

【问题讨论】:

  • 您可以创建一个通过execute immediate 发出alter 的过程,并同时使用旧密码和新密码;您可以添加进一步检查以排除某些已知用户名。然后授予对该过程的权限,而不是授予alter any user。这对你有用吗?
  • 好的,谢谢。在你自己和下面的 Justin Cave 之间,我认为我走在正确的轨道上。

标签: database oracle oracle11g


【解决方案1】:

最简单的方法通常是创建一个由实现实际密码重置的超级用户拥有的存储过程,然后授予通用应用程序用户对该存储过程的权限。然后,您的存储过程可以实现您想要确定哪些密码可以重置、谁可以重置密码、您需要什么样的审计跟踪等任何逻辑。

例如,类似

CREATE OR REPLACE PROCEDURE superuser.reset_password( 
  p_username IN VARCHAR2,
  p_old_password IN VARCHAR2,
  p_new_password IN VARCHAR2
)
AS
BEGIN
  <<determine whether p_username is a normal user>>

  <<determine whether the person that is logged in should be able
    to reset p_username's password>>

  EXECUTE IMMEDIATE 'ALTER USER ' || p_username || 
                      ' IDENTIFIED BY ' || p_new_password ||
                      ' REPLACE ' || p_old_password;

  <<write to a log table indicating whose password was reset and
    who did the resetting>>
END;

GRANT EXECUTE ON superuser.reset_password
   TO application_generic_user;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多