背景
我们有一个 Web 应用程序,它作为通用应用程序用户登录到 Oracle 数据库,但是由于历史原因,我们将所有用户用户都存储为 Oracle 数据库用户(我们对 Oracle 数据库进行身份验证以将他们登录到Web应用程序)。我们还有其他 Oracle Forms 应用程序,它们更直接地使用数据库用户(它们不能被删除)。
我正在尝试允许用户通过网络应用程序通用用户更改自己的密码。
问题
如何授予 Web 应用程序通用用户更改特定用户密码的能力,而不授予其更改 super 用户密码的能力?如果有人以某种方式窃取了网络应用程序的凭据,我们希望限制损害。
Oracle 数据库通过以下方式对此提供支持:
alter user user123 identified by new_password123 replace old_password123;
这对我们的目的非常有用,因为我们在将旧密码更改为新密码时要求用户提供旧密码。
但是不管有没有“replace”语法,我们都需要授予相同的权限,“alter user”,它授予通用网络应用程序用户太多的权力(例如,更改任何用户的密码,即使不知道旧密码) ).
那么有没有什么方法可以设置权限,这样你就可以更改任何你想要的密码,但前提是你知道旧密码?
最佳答案
最简单的方法通常是创建一个存储过程,该存储过程由执行实际密码重置的 super 用户拥有,然后授予通用应用程序用户对该存储过程的权限。然后,您的存储过程可以实现您想要的任何逻辑,以确定哪些密码可以重置、谁可以重置它们、您需要什么样的审计跟踪等等。
例如,类似的东西
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;
关于database - ALTER USER x identified by y replace z, 只有权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813504/