開發訪問數據庫的Web應用程序時,大多數開發人員要設置一個連接池(一批預先打開的由中間層保持的數據庫會話期)來提高連接速度。應用程序從連接池獲得連接,要比為每一個用戶請求創建新的連接快得多。 連接池的缺點是每個用戶要作為一個單一的、高級權限數據庫賬戶向數據庫注冊。盡管Web用戶通常是用他們唯一的身份向應用程序注冊,但只要數據庫已經被連接,則所有的系統用戶就都是匿名的。 Oracle數據庫在安全性方面有很好的聲譽,因而利用它的重要安全性功能來執行你的應用程序安全性政策是非常適宜的。假如已知用戶身份,該數據庫就能夠進行審計并實施基于角色的和細粒度化的訪問控制,包括虛擬專用數據庫(Virtual PRivate Database,VPD)。 Oracle至少提供兩種在所有各層(tiers)保持用戶身份的方法:代理認證和應用程序上下文參數CLIENT_IDENTIFIER。 代理認證 代理認證使中間層能夠用"普通(generic)"或"應用程序(application)"賬戶對數據庫的訪問進行認證,然后即代表真實的用戶建立輕便會話。一個代理會話可以通過提交用戶的辨認名(Distinguished Name (DN)),即一個x.509證書,或全局唯一用戶名來建立。 例如,為了答應用戶Kyle通過具有角色admin的中間層(它作為用戶webapp保持一個連接池)連接到數據庫,數據庫治理員首先授予如下的權限:ALTER USER Kyle GRANT CONNECT THROUGH webapp WITH ROLE admin; 接著,該應用程序代碼(在這里是一個servlet)翻譯從Web接收到的用戶名并建立如下所示的代理會話:
String userName = request.getRemoteUser(); InitialContext initial = new InitialContext(); OracleOCIConnectionPool ds = (OracleOCIConnectionPool) initial.lookup("jdbc/OracleOciDS"); oracle.jdbc.OracleConnection conn = null; Properties p = new Properties(); p.setProperty(PROXY_USER_NAME, username); conn = ds.getProxyConnection( PROXYTYPE_USER_NAME, p);