首页 文章

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

提问于
浏览
0

Background

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

我试图允许用户通过web应用程序通用用户更改自己的密码 .

Question

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

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

alter user user123 identified by new_password123 replace old_password123;

哪个适用于我们的目的,因为我们在将用户密码改为新密码时要求用户输入旧密码 .

然而,无论是否使用“替换”语法,我们都需要授予相同的权限“alter user”,这将授予该通用Web应用程序用户太多的权力(例如,更改任何用户的密码,即使不知道旧密码) .

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

1 回答

  • 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;
    

相关问题