Grails:无论成功/失败,都存储审计记录?

时间:2015-05-31 08:47:45

标签: hibernate grails transactions audit

在Grails中,无论事务如何结束,为某些操作编写审计记录的建议模式是什么?示例:可能由于多种原因而失败的在线用户注册尝试。

基本假设,业务逻辑仅限于事务服务方法。

潜在的不确定性:我是否应该通过在服务中抛出RuntimeException来中止事务? Grails指南暗示如此,但是Burt Beckwith once said(笑着说,我确定)它就像是用锤子打自己来给自己一些照顾。

考虑到经过多次检查的冗长逻辑,在检测到冲突时抛出异常会很方便。应该回滚整个事务,但是应该写一个审计记录。

N.B。有几个审计Grails插件,但它们记录了已提交域对象的更改。

1 个答案:

答案 0 :(得分:3)

在我们的应用程序中,我们使用Platform Core插件。基本上,当一些有趣的事情发生时,例如:

  • 用户登录
  • 新用户注册
  • 用户创建某个业务对象的新实例
  • 用户删除内容
  • 等...

我们发起了一个事件,如下:

event(
    'myApp.activity', [
    userId: userService.currentUser?.id,
    detail: [name: "some useful information about this activity", timestamp: new Date(), ...],
    activityType: ActivityType.CREATED,
    action: "create",
    ...
])

然后我们可以在另一个服务类中定义侦听这些事件的方法,例如

@Listener(topic="myApp.activity")
def audit(parameters) {
    //create an audit record for the thing that just happened
}

好处是

  • 它使审计逻辑等交叉内容远离其他应用程序的逻辑
  • 审计是在一个单独的线程中进行的(因此它不会与触发事件的事务涉及同一事务)
  • 您可以为单个活动分配多个侦听器方法,以便您有另一个选项可以在以后扩展您的应用程序