database - ALTER USER x identified by y replace z, 只有权限?

标签 database oracle oracle11g

背景

我们有一个 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/

相关文章:

c++ - 通过条目维护/更新/访问文件的“良好”编程形式

php - 在 Laravel 5 中使用中间件时找不到类 'App\Http\Middleware\DB'

php - 将表与子查询结果连接起来

sql - 如何确定作为邻接列表模型构建的表中的 'nesting level'

database - 如何在数据库中持久化 Celery 队列

sql - Oracle 计数未显示 0

java - 在Java中设置Oracle 10g数据库连接超时

plsql - 在 Oracle 数据库 10g 和 11g 中选择更新...的差异

oracle - oracle 11g中调用成员函数

sql - Oracle - 从对偶中选择常量值作为 M x N 表