Java EE应用中对前端用户的数据库操作的审计

引言

在一些对安全审计有较高要求的系统中,管理员需要查看每个应用程序的登录用户执行了哪些数据库操作,而通常我们应用程序在访问数据库时,都是公用同一个数据库的认证用户去获取数据库连接的,这样我们的登录用户的标识无法传递到数据库端。而很多客户是需要在数据库端能审计登录用户的操作。当然,在应用服务器端的程序里写日志,记录下每个登录用户执行了哪些操作也能达到审计的需求,但这种方式往往会有性能的开销。经过实践,本文介绍的解决途径是将用户标识通过数据库连接传递到数据库端,从而完成在数据库端的审计,这是一种较轻量级的方式。

解决方案简述

在 JDBC 4.0 之前,JDBC 规范没有提供传递用户标识的 API,我们只能通过数据库厂商提供的 API 去实现。考虑到这一需求的实用性,JDBC 4.0 为我们增加了相应的 API。目前,Oracle 11g Release 1 (11.1) 和 DB2 9.5 的 JDBC driver 都支持 JDBC 4.0 规范,但在此之前的版本中,我们只能借助于厂商提供的 API。本文介绍了使用这些 API 的一些实践,同时说明了如何在数据库端查看传递过来的用户标识。

传递用户标识的基本模式为:

数据库会话(session)

JDBC framework(或 O/R mapping 框架)如 Hibernate 和 iBatis 都提供了 session 的概念,session 是对数据库连接和事务使用的封装。一个数据库会话期间通常使用一个连接,对应一个事务。

对于纯 JDBC 来说,获得一个数据库连接就相当于开启了一个会话。

打开一个数据库会话。

设置用户标识信息。

执行一些数据库操作。

清除连接上的用户标识。

关闭数据库会话。

其中,清除连接上的标识非常重要,因为我们通常使用的数据库连接都是逻辑连接,关闭逻辑连接后其对应的物理连接 (TCP/IP 连接 ) 并未关闭,所以清除连接上的标识信息可以确保不影响别的数据库逻辑连接。

JDBC 4.0 提供的支持

Java 6 支持 JDBC 4.0 规范,在 JDBC 4.0 中提供了在数据库连接 java.sql.Connection 上传递用户信息的支持。在该接口中提供了两个方法:

void setClientInfo(String name, String value) throws SQLClientInfoException;
void setClientInfo(Properties properties) throws SQLClientInfoException;

第一个方法允许我们在 Connection 上传递三个属性:

ApplicationName:访问数据库的应用程序名称。

ClientUser: 访问数据库的用户标识,这个用户和建立数据库连接的用户是不同的。建立数据库连接的用户是被能数据库认证和被授权过的用户。

ClientHostname:访问数据库客户端的主机名。

第二个方法和第一个方法功能类似,只是将参数放到了一个 Properties 对象中。我们通常 setClientInfo(“ClientUser” , userId) 将用户标识附加在数据库连接上。使用该方法的常见模式是:

清单 1. 使用 JDBC 4.0 API 传递用户标识

Connection conn = getConnection();
conn.setClientInfo("ClientUser" , currentUserId);
//do something on the connection 
conn.setClientInfo("ClientUser" , null);
conn.close();

注意,清除连接上的用户标识的方式是将标识置为空。下面我们针对两种的常用数据库类型介绍标识传递的方法。

针对 DB2 的标识传递

DB2 提供了 com.ibm.db2.jcc.DB2Connection,该类有下列方法,支持用户信息传递:

public void setDB2ClientUser(String s) throws SQLException;
public void setDB2ClientWorkstation(String s) throws SQLException;
public void setDB2ClientApplicationInformation(String s) throws SQLException;
public void setDB2ClientAccountingInformation(String s) throws SQLException;

时间: 2024-12-31 11:39:27

Java EE应用中对前端用户的数据库操作的审计的相关文章

避免Java EE项目评估中的常见错误

错误|项目 摘要: 软件开发项目评估是软件开发周期中关键又具备挑战性的一步,它是计划,进度,人员以及其他相关步骤的基础.项目低估会带来紧张的进度,高度压力的工作环境,未可预料的资源紧缺,低质量,项目实施延误等风险, 可以最大限度的破坏客户的生意以及公司的信誉:而另一方面,带有过多不合理泡沫的评估也会导致无效率的资源浪费以及引起客户和公司之间的不信任.评估企业Java项目因为技术的更新成了一个难题,本文通过几个方面透视提供了评估企业Java项目时应该考虑的问题 假如你是一个重要软件项目的项目经理,

Java EE 5中的Web服务(JAX-WS)

Java API for XML Web Services (JAX-WS) 2.0,JSR 224 是 Java EE 5 平台的重要组成部分.作为 Java API for XML-based RPC 1.1 (JAX-RPC) 的后续发行版本,JAX-WS 简化了使用 Java 技术开发 Web 服务的工作.并且通过对多种协议(如 SOAP 1.1.SOAP 1.2.XML)的支持,以及提供用于支持其他协议和 HTTP 的工具,它解决了 JAX-RPC 1.1 中存在的一些问题.JAX-W

Java EE项目中的异常处理总结(一篇不得不看的文章)_java

为什么要在J2EE项目中谈异常处理呢?可能许多java初学者都想说:"异常处理不就是try-.catch-finally吗?这谁都会啊!".笔者在初学java时也是这样认为的.如何在一个多层的j2ee项目中定义相应的异常类?在项目中的每一层如何进行异常处理?异常何时被抛出?异常何时被记录?异常该怎么记录?何时需要把checked Exception转化成unchecked Exception ,何时需要把unChecked Exception转化成checked Exception?异

设计java ee系统中的日志服务

问题描述 要求:1.持久层使用ibatis2.包含系统日志和业务操作日志两部分.3.能够记录到操作的表名.字段.操作者.时间,记录字段值得改变情况.使用监听器?spring对数据库操作时AOP?请大虾们解答?谢谢! 解决方案 解决方案二:springAOP解决方案三:该回复于2009-10-11 08:59:49被版主删除解决方案四:其实是可以配置使用触发器只是太麻烦了解决方案五:如果你的系统用了spring作为容器,那么AOP将是首选,如果没有,那改动就有些大,可以考虑用监听器,不过你要记录的

MySQL中几个常用的数据库操作函数

  一些常用的MYSQL操作函数,与MYSQL操作紧密相关,相信对PHP开发的初级爱好者会有很大帮助. 1.mysql_connect--打开一个到MySQL服务器的链接 说明:该链接在页面执行完成后被关闭. 示例: $link = mysql_connect("localhost","root","") or die("Could not connect:".mysql_error()); 2.mysql_close--关闭

安全注释和授权在GlassFish和Java EE 5 SDK中的应用

安全性对于企业环境非常重要.在 Java EE 5 / GlassFish 环境中,您可以通过以下几种方式实现安全性: 传输层安全性 (TLS) / 安全套接字层 (SSL) 技术 身份验证 (Authentication) 和授权 (Authorization) 消息层安全性(仅适用于 GlassFish 中的 Web 服务) 本文讨论身份验证和授权.参考资料 [1].[2] 和 [3] 讨论了如何在客户端和服务器端为 Enterprise JavaBeans 和 Web 服务建立 SSL 环

调查显示,Java EE 用户需要更多的 REST

自世纪初以来,Java企业版(Java EE)一直是许多企业以 Web 为中心,面向服务,支持云计算组件的核心.不过最近有许多用户,包括它的死忠粉也一直在问,它的框架是否已经过时,并正在被更轻量.更敏捷和更简单的设置,如容器.云服务或 API 取代. 为了回应 Java EE 现在面临的问题,Oracle 的 Java EE 开发团队在社区对 Java EE 的用户进行了一次调查,以了解该框架后续该为其企业基础服务的方向.共有1693个 Java EE 社区成员参与了调查,这些发现将有助于确定哪

Java EE开发四大常用框架

对Java EE中常用的四个框架做一下系统的归纳 Struts     Struts是一个基于Sun Java EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的.     Struts框架可分为以下四个主要部分,其中三个就和MVC模式紧密相关:     1.模型 (Model),本质上来说在Struts中Model是一个Action类(这个会在后面详细讨论),开发者通过其实现商业逻辑,同时用户请求通过控制器(Controller)向Action的转发过程是基于由struts-c

针对Java EE 7三个特性进行详细的剖析

Java EE 7 使得开发人员可以写更少的样板代码,通过丰富的组件来提供一个完整.全面.集成的堆栈来支持和构建最新的 Web 应用程序和框架,同时提供更具扩展性.丰富性和简易的功能.企业将会从便捷式批处理.改进的扩展性等新功能中获益.本文将通过对这个版本中新增组件 WebSocket 1.0.JSON Processing 1.0.JAX-RS 2.0.JSF 2.2 和 JMS 2.0 的介绍及若干示例的展示,来对以上三个特性进行详细的剖析. Java EE 作为一个企业应用的部署平台,具有