在Java程序中使用Oracle外部用户

来源:互联网 发布:家暴 比例 知乎 编辑:程序博客网 时间:2024/05/16 01:45

Oracle外部用户(External User)可以访问Oracle数据库,但该用户不需要Oracle密码验证,验证工作交由操作系统来完成。这就意味着,如果用户能通过某一用户名/密码进入操作系统,那么他就有权限访问Oracle数据库。试想,如果一台客户机经常访问Oracle数据库,用户会非常厌烦每一次都要输入同样的用户名和口令。另外,从安全角度考虑,每次输入用户名、口令也不太合适。

向Oracle数据库中添加外部用户

我们使用ora_server@ora_carl (ora_server是数据库所在的机器名,ora_carl是数据库的实例名)为例,来说明在Oracle中如何创建外部用户。我们假定客户端的操作系统为Windows XP,用户名是carlwu,具体步骤如下:

1) 在客户机的SQL/Plus中以系统管理员身份登陆

SQL> conn sys/manager@ora_carl as sysdba

已连接。

2)查看参数os_authent_prefix(操作系统验证前缀)参数

SQL> show parameters os_authent_prefix

NAME TYPE VALUE

------------------------------------ ---------------------------------------------------------------

os_authent_prefix string OPS$

3)创建外部用户carlwu,注意用户名前面要加上步中查出来的os_authent_prefix(操作系统验证前缀)参数值,本例中为ops$。

SQL> create user ops$carlwu identified externally;

用户已创建

4)将connect,resource权限赋给该外部用户

SQL> grant connect to ops$carlwu ;

授权成功。

SQL> exit

从Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.5.0 - Production中断开

5)在客户机上验证刚才创建的外部用户是否成功,注意在conn后省略了用户名/口令的字样,只剩下/@加上实例名。

C:/Documents and Settings/carlwu>sqlplus /nolog

SQL*Plus: Release 9.2.0.5.0 - Production on 星期五 12月 2 16:12:09 2005

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

SQL> conn /@ora_carl;

已连接。

恭喜,到现在为止,我们已经成功创建了一个Oracle外部用户。

Java程序

TestExternalUser.java源代码如下所示,testExternalUser()方法使用外部用户连接Oracle数据库

package test;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class TestExternalUser {

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

TestExternalUser teu = new TestExternalUser();

teu.testExternalUser();

}

public void testExternalUser() {

Connection conn1 = null;

try {

conn1 = getCon();

PreparedStatement ps = conn1

.prepareStatement("select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual");

ResultSet rs = ps.executeQuery();

if (rs.next()) {

System.out.println("Database server's date is:"+rs.getString(1));

}

rs.close();

ps.close();

} catch (SQLException sqle) {

sqle.printStackTrace();

} catch (ClassNotFoundException cnf) {

cnf.printStackTrace();

}finally {

closeCon(conn1);

}

}

/**

* Get target datbase's connection.

*

* @return

* @throws ClassNotFoundException

* @throws SQLException

*/

private Connection getCon() throws ClassNotFoundException, SQLException {

Connection con;

java.lang.Class.forName("oracle.jdbc.driver.OracleDriver");

con = DriverManager.getConnection("jdbc:oracle:oci:/@ora_carl");

con.setAutoCommit(false);

return con;

}

/**

* Close database connection

*

*/

private void closeCon(Connection con) {

try {

con.close();

con = null;

} catch (SQLException sqle) {

sqle.printStackTrace();

}

}

}

注意上面代码中红色字体部分Oracle连接串的写法,和普通的Oracle JDBC连接串(jdbc:oracle:thin:user/pwd@server:1521:instance)的不同之处,该连接串中省略了用户名/密码。