2013-07-19 115 views
0

任何用戶在Oracle數據庫中都有登錄名/密碼。 我有一個代碼:如何從DataSource中檢查登錄名和密碼?

Connection con; 
Statement stmt = null; 
String query = "SELECT user FROM dual"; 
try { 
    dataSource = (DataSource) new InitialContext().lookup("jdbc/MyDataSource"); 
} catch (NamingException e) { 
    throw new ExceptionInInitializerError(e); 
} 
try { 
    System.out.println("name, password:" + name + "|" + password); 
    con = dataSource.getConnection(name, password); 
    stmt = con.createStatement(); 
    ResultSet rs = stmt.executeQuery(query); 
    while (rs.next()) { 
     System.out.println("User:" + rs.getString("USER")); 
    } 
    con.close(); 
    return true; 
} catch (SQLException ex) { 
    Logger.getLogger(UserInfoServiceOracle.class.getName()).log(Level.SEVERE, null, ex); 
    return false; 
} 

如果我把一個正確的密碼,下次用戶可以使用的getConnection任何登錄/密碼,並從第一個正確的用戶名/密碼。

登錄:

INFO: name, password:correctUser|correctPassword 
INFO: User:correctUser 
INFO: name, password:jhkjhkjh|khkjhkj 
INFO: User:correctUser 
+0

當你在'dataSource.getConnection(name,password)'中提供不正確的密碼時會發生什麼? – Santosh

+0

它返回的連接沒有例外。 – kotygoroshko

+0

我無法確定你的問題,因爲你沒有發佈完整的課程。但我想是因爲數據源仍然使用你的第一個用戶名和密碼 –

回答

2

數據源是connection pool的外觀。

  • 經您確認。即使您提供的密碼不正確,數據源也會返回連接。這意味着數據源不會對您提供給它的用戶名密碼感到困擾。

  • 正如其他人在這裏指出的,數據源是由應用服務器配置和創建的。服務器從配置文件(某些xml)中讀取適當的參數(如用戶名/密碼,初始連接數,最大連接數等),並創建稍後由應用程序使用的連接(初始連接數)。

  • 因此,當您撥打dataSource.getConnection時,數據源正在返回已創建連接。提供的用戶名/密碼不起作用。

+0

如果我在應用程序服務器中設置登錄名/密碼,應用程序將忽略任何登錄名/密碼並返回連接。 – kotygoroshko

+0

但是如果我沒有在應用程序服務器上設置登錄/密碼。在getConnection(名稱,密碼)中設置正確的登錄名/密碼之前,應用程序沒有返回連接。 – kotygoroshko

+0

是的。這就是應用程序服務器如何使用數據源。 – Santosh

1

數據庫證書綁定到DataSource。因此,您將始終使用提供給DataSource的憑據連接到數據庫。

A DataSource是一個託管資源,它不打算與其他用戶名連接。

根據您的環境,您可以使用驅動程序自己創建自己的連接,但是您將失去DataSource爲您提供的所有可能性(例如連接池)。

在由DataSource返回的Connection中,方法getConnection()是無操作。

+0

爲什麼DataSource有getConnection(名稱,密碼)方法? – kotygoroshko

+0

它取決於實現([如文檔中所述](http://docs.oracle.com/javase/7/docs/api/javax/sql/DataSource.html)),但大多數實現不支持日誌進入數據庫。 –

0

我認爲你將數據庫的安全性與你應該圍繞你的應用程序設計的安全性相混淆。

您的應用程序知道數據庫的憑據(可能通過屬性文件)並構建數據源。一旦用戶通過了應用程序的身份驗證,用戶就可以訪問應用程序的功能(以及數據源)。

+0

我沒有任何屬性文件的登錄名/密碼。 – kotygoroshko

+0

這是你需要開發自己來保存數據庫證書的東西。標準方法是:您的應用程序登錄到數據庫,用戶登錄到您的應用程序。 – StuPointerException