111111
精灵王
精灵王
  • 注册日期2010-12-08
  • 发帖数640
  • QQ
  • 火币1103枚
  • 粉丝120
  • 关注75
  • 社区明星
阅读:3206回复:0

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

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

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


我们使用ora_server@ora_carl ora_server是数据库所在的机器名,ora_carl是数据库的实例名)为例,来说明在Oracle中怎么创建外部用户。我们假定客户端的操作系统为视窗系统 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)将connectresource权限赋给该外部用户
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)的不同之处,该连接串中省略了用户名/密码。


喜欢0 评分0
游客

返回顶部