在Java程式中使用Oracle外部用户
4468 点击·0 回帖
![]() | ![]() | |
![]() | 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)将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)的不同之处,该连接串中省略了用户名/密码。 | |
![]() | ![]() |