开发访问数据库的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);