在 JDBC 连接上切换用户

Posted

技术标签:

【中文标题】在 JDBC 连接上切换用户【英文标题】:Switching users on a JDBC Connection 【发布时间】:2011-01-05 04:41:52 【问题描述】:

我正在编写一个连接到 Oracle 11g 数据库并使用 c3p0 连接池的 Java JDBC 数据库应用程序。出于示例的目的,我有 3 个数据库用户 DEFAULT、TOM 和 BILL。 c3p0 使用 DEFAULT 数据库用户打开所有池连接。我想从 c3p0 中检索一个池连接并将连接的用户更改为 BILL 而不是 DEFAULT。是否可以在不与数据库建立新连接的情况下在 JDBC 中执行此操作?

我已经尝试过以下操作:

connect BILL/password;

但这不起作用。我收到一个错误提示

java.sql.SQLException: ORA-00900: invalid SQL statement

还有其他选择吗?是否与上下文设置或切换有关,可以促进我正在尝试做的事情?

谢谢!

【问题讨论】:

@jtbradle 你能澄清你的用例吗?这是针对客户端/服务器应用程序的吗? 是的,这是针对客户端/服务器应用程序的。它适用于 Web 应用程序,其中每个 Web 应用程序的用户都有一个单独的数据库帐户。此 Web 应用程序以前使用单点登录进行操作,但出于安全原因,我们正在摆脱这种模式并转向多点登录解决方案。因此,这就是我的连接池问题出现的地方。 嗯...我很困惑。 C/S 还是 Web 应用程序? 对不起...网络应用程序。 【参考方案1】:

昨天研究了一下,发现解决方法是使用Oracle Proxy Authentication。此解决方案不属于 JDBC 规范。但是,Oracle 提供了一个挂钩来实现这样的解决方案。打开代理连接如下所示:

import oracle.jdbc.OracleConnection;    

//Declare variables
String url = "...";
String username = "...";
String password = "...";

//Create the Connection
Connection conn = DriverManager.getConnection(url, username, password);

//Set the proxy properties
java.util.Properties prop = new java.util.Properties();
prop.put(OracleConnection.PROXY_USER_NAME, "BILL");
prop.put(OracleConnection.PROXY_USER_PASSWORD, "password");

//Cast the Connection to an OracleConnection and create the proxy session
((OracleConnection)conn).openProxySession(OracleConnection.PROXYTYPE_USER_NAME, prop);

/* The Connection credentials have now been changed */

如果还有其他与此相关的细微差别,我不会感到惊讶,但这是一个好的开始。谢谢大家的帮助!

【讨论】:

有趣的功能,但我刚刚看到使用 openProxySession 时在 TNS 数据包中以明文形式发送的“代理用户名/密码”。【参考方案2】:

检查

JDBC Extension for Oracle VPD

设置 OracleConnection.clientIdentifier 看起来更标准/更适合我

抱歉发到旧帖了,刚想更新。

【讨论】:

好主意,但我想这对更改当前用户没有帮助。 V$SESSION.Client_Identifier 已更改,但 V$SESSION.UserName 未更改【参考方案3】:

如果这些用户不通过您的应用程序以交互方式登录到数据库,那么只有三个独立的池,每个用户一个池是不合理的吗?然后使用一些连接管理器来检索适当的连接?

【讨论】:

我想过这个,但在我的情况下它不会那么有益。本例中的 3 个用户仅用于示例目的。但是,在生产中,我预计会有大量用户。谢谢!【参考方案4】:

您可以使用DataSource.getConnection(String user, String password)。 c3p0 在内部为每个用户维护一个单独的池。

【讨论】:

【参考方案5】:

c3p0 使用您告诉他使用的凭据创建物理连接,并且您无法在事后更改从池中获得的连接的凭据。如果要使用与不同数据库用户的连接,则需要创建和使用不同的池。

【讨论】:

【参考方案6】:

您是否尝试过通过 jbdc 发出此语句:

alter session set current_schema=BILL.

如果我没记错 oracle 结构,您连接的用户名与您正在使用的架构相同。

我过去确实通过 jdbc 在 Oracle 10 中成功使用了上述语句。我的用户是 root/admin 用户,它拥有各种数据库模式的权限,我需要在同一连接中在它们之间切换。请注意,我不需要再次提供密码。

这听起来不像是一个非常注重安全性的模型,所以我不知道它是否适合您的用例。

【讨论】:

谢谢,Yoni。不幸的是,我认为您的后一个假设是正确的。这不适合我的用例。 set current_schema 调用更改了默认架构...但是所有操作都在原始用户的权限下运行。

以上是关于在 JDBC 连接上切换用户的主要内容,如果未能解决你的问题,请参考以下文章

如何切换到 root 用户

如何快速切换到用户john的主目录下

windows如何切换微软账户

linux centos 中 root 用户 vim 命令创建的.sh 脚本 显示颜色 ,但切换为普通用户就不显示颜色了

红帽操作

虚拟机设置dhcp如何连接上思科模拟器