在 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 连接上切换用户的主要内容,如果未能解决你的问题,请参考以下文章
linux centos 中 root 用户 vim 命令创建的.sh 脚本 显示颜色 ,但切换为普通用户就不显示颜色了