背景
我们有一个Web应用程序,它作为通用应用程序用户登录到Oracle数据库,但是由于历史原因,我们将所有用户用户存储为Oracle数据库用户(我们对Oracle数据库进行身份验证以将其记录到Web应用程序)。我们还有其他Oracle Forms应用程序,它们更直接地使用数据库用户(它们无法删除)。
我试图允许用户通过网络应用程序通用用户更改自己的密码。
问题
如何授予网络应用程序通用用户更改特定用户密码的权限,而无需授予其更改超级用户的权限。密码?如果有人偷走了网络应用程序的凭据,我们就会想要损坏限制。
Oracle数据库通过以下方式支持:
alter user user123 identified by new_password123 replace old_password123;
这对我们的目的非常有用,因为我们会在将用户密码更改为新密码时询问用户的旧密码。
无论有没有"替换"语法我们需要授予相同的权限,"更改用户,"这使得通用网络应用程序用户获得了太多的权力(例如,即使不知道旧的密码,也可以更改任何用户的密码)。
那么是否有一些设置权限的方法,以便您可以更改所需的任何密码,但只有您知道旧密码?
答案 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;