由y替换z标识的ALTER USER x,只有权限?

时间:2014-09-12 17:15:24

标签: database oracle oracle11g

背景

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

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

问题

如何授予网络应用程序通用用户更改特定用户密码的权限,而无需授予其更改超级用户的权限。密码?如果有人偷走了网络应用程序的凭据,我们就会想要损坏限制。

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

 alter user user123 identified by new_password123 replace old_password123;   

这对我们的目的非常有用,因为我们会在将用户密码更改为新密码时询问用户的旧密码。

无论有没有"替换"语法我们需要授予相同的权限,"更改用户,"这使得通用网络应用程序用户获得了太多的权力(例如,即使不知道旧的密码,也可以更改任何用户的密码)。

那么是否有一些设置权限的方法,以便您可以更改所需的任何密码,但只有您知道旧密码?

1 个答案:

答案 0 :(得分:2)

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

例如,像

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;